leidiges Thema password :)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von r0tzi.

    leidiges Thema password :)

    Hi Leute,

    ich hätte eine Frage bezüglich des hinterlegen eines passwortes. Nun es ist allgemein bekannt, passwort im code = nicht sicher.
    ich habe nun eine frage bezüglich der realisation des passwortes im program bezüglich SQL.
    ich habe vielen Daten im SQL die ich in das program lade um damit zu arbeiten. Nun möchte ich eine so art "wartungsmodus" einbauen, dass man die sql daten nicht direkt über SQL verwalten muss, sondern auch über das program machen kann.
    dazu wollte ich ein passwort einbauen. Wie sollte dies nun ausschauen?
    ICh dachte mir jetzt vllt so:

    ich habe eine sepparate tabelle in sql namens : SQLPasswort...
    bei der passwort abfrage, fragte ich das SQL passwort ab, vergleiche es mit dem eingegeben wenn ja = go on, wenn nein = einfach nein.

    wenn man nun das programm decombiliert hat man doch auch die zugriffsdaten auf die SQL und die tabelle oder? d.h. sollte jmd zugriff auf meine datenbank haben, könnte er doch auch das SQL Passwort auslesen...

    Da ich mich selbst in SQL nicht besonders auskenne, liegt dann der trick da drin, dass der user der meine datenbank lesen kann, auf diese tabelle NICHT zugreifen kann und somit das passwort geschützt ist?

    also geht es, dass user meine datenbank lesen können, bis auf eine Tabelle?

    Wenn es natürlich andere ansätze mit sql gibt (bitte nur sql, in der firma darf ich keine andere dienste benutzen) nur her damit:)

    Vielen Dank für die Hilfe.

    r0tzi schrieb:

    bei der passwort abfrage, fragte ich das SQL passwort ab, vergleiche es mit dem eingegeben
    Lege in der DB nur einen Hash des Passworts ab.
    Dann gibst du das Passwort ein und vergleichst es mit dem Hash des DB-Passworts.

    Ich frage mich lediglich, wozu du das Passwort in der DB brauchst.
    Gib das Passwort ein und versuche mit dem eingegebenen Passwort eine neue privilegierte Connection auf die DB aufzubauen.
    Wenn das Passwort passt, wird die Connection aufgebaut, wenn nicht, dann nicht.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    ich hatte das mal so gelöst und es funktioniert gut.
    Benutzt werden die Windows eigenen (64bit) Verschlüsselungs-Routinen.
    Aus dem text "MeinPass" wird z.B. sowas wie "mpUniKMhy9vhHLo9y5wdkS0VV5QzOOcxe6/f8T4kndI="
    Das ergebnis speichere ich einfach in meine Passwort-Tabelle. Das errät niemand so leicht :)

    Verschlüsselt wird mit einem beliebigen Key.
    !! Ersetze dazu in beiden Functions den Text "Dies-Ist_mein-Key" in einen unauffälligen anderen.

    Zu guter letzt vergleichst du einfach das entschlüsselte Passwort
    mit dem Passwort, dass in ein Eingabefeld getippt wurde.

    Du kannst damit natürlich mehrer Passworte für z.B. verschiedene User speichern
    und entsprechend reagieren.

    '//Dein Programmcode....

    dim Textx as string
    dim chifftext as string

    '// PASSWORT VERSCHLÜSSELN
    '// Aus Textbox1 nehmen wir das eingegebene passwort und verschlüsseln es.
    '// Danach stehts in Textx und kann in die Tabelle gespeichert werden.

    Textx = EncodeIt(TextBox1.Text)

    '//

    '// PASSWORT ENTSCHLÜSSELN
    '// Nachdem der Wert aus der Tabelle gelesen wurde, "entschlüsseln"
    '// wir ihn wieder nach chifftext
    '// in text2decode (String-Variable) sollte dazu das aus der Datenbank
    '// gelesene Passwort stehen

    chiffText = DecodeIt(text2decode)

    '// Die beiden Funktionen zum Ver/Entschlüsseln:

    Public Function EncodeIt(ByVal enctext As String) As String
    Dim rd As New RijndaelManaged

    Dim md5 As New MD5CryptoServiceProvider
    Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes("Dies-Ist_mein-Key"))

    md5.Clear()
    rd.Key = key
    rd.GenerateIV()

    Dim iv() As Byte = rd.IV
    Dim ms As New MemoryStream

    ms.Write(iv, 0, iv.Length)

    Dim cs As New CryptoStream(ms, rd.CreateEncryptor, CryptoStreamMode.Write)
    Dim data() As Byte = System.Text.Encoding.UTF8.GetBytes(enctext)

    cs.Write(data, 0, data.Length)
    cs.FlushFinalBlock()

    Dim encdata() As Byte = ms.ToArray()
    Return Convert.ToBase64String(encdata)
    cs.Close()
    rd.Clear()
    End Function

    Public Function DecodeIt(ByVal enctext As String) As String

    Dim rd As New RijndaelManaged
    Dim rijndaelIvLength As Integer = 16
    Dim md5 As New MD5CryptoServiceProvider
    Dim key() As Byte = md5.ComputeHash(Encoding.UTF8.GetBytes("Dies-Ist_mein-Key"))

    md5.Clear()

    Dim encdata() As Byte = Convert.FromBase64String(enctext)
    Dim ms As New MemoryStream(encdata)
    Dim iv(15) As Byte

    ms.Read(iv, 0, rijndaelIvLength)
    rd.IV = iv
    rd.Key = key

    Dim cs As New CryptoStream(ms, rd.CreateDecryptor, CryptoStreamMode.Read)

    Dim data(ms.Length - rijndaelIvLength) As Byte
    Dim i As Integer = cs.Read(data, 0, data.Length)

    Return System.Text.Encoding.UTF8.GetString(data, 0, i)
    cs.Close()
    rd.Clear()
    End Function
    Nein, selbst so nicht.
    Wenn ich in das Programm schaue steht da ein Passwort und eine Routine.

    Muss echt schwer sein zu verstehen das man Passwörter nicht im Code aufbewahrt.

    Ein Masterpasswort dass der Benutzer eingibt ist das Mindeste.

    Wenn man das Programm im Unternehmensumfeld einsetzt, koppelt euch ans AD.

    Bei Zugriffen auf Datenbanken nutzt einen Serverdienst so dass kein Benutzer direkt an die DB kommt
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Frage eines unwissenden der nur mitliest.....was ist AD? Habe das schon mehrfach in einigen threads gelesen, weiss aber nicht was damit gemeint ist. Würdest du es mir kurz erklären? @MrTrebron
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    @ MrTrebron
    Hallo :)
    Ich denke, Du meinst Active Directory. Aber hier wird ja z.B. ein domänenpasswort auch "hinterlegt"
    und könnte ggf. "gehackt" werden.
    Ich war der Meinung, er will das alle seine Datenbak sehen können, nur eben eine Tabelle in der DB nicht.
    Das macht es komplizierter, wenn man nicht die ganze DB sperren will.
    Im Code von mir steht ein Verschlüsselungskey also kein Passwort, damit wird es schwerer zu hacken.
    (z.B. mit einem Hex-editor wird ein Key "Main_Form_Load" schlecht als Passwort erkennen zu sein.
    Prinzipiell muss(!) irgendwo eine Passworteingabe und das gegenstück abgelegt sein.Leider

    Aber prinzipiell hast auch du recht :)
    Bei einer Anmeldung gegen das AD wird kein Passwort hinterlegt. Das AD weiß ja wer du bist.
    Entweder kommt eine Anmeldung mit AD User & Pass oder noch besser eine Kerberos Anmeldung. Man nutzt im Programm das der Benutzer sich schon am Rechner mit seinem AD-Account angemeldet hat.
    Ein MS-SQL Server kann dann mit Berechtigungen aus dem AD umgehen.

    @arr wenn ich ein .net Programm mit ILSpy oder ähnlichen anschauen sehe ich was dubda im Code hast und kann es anwenden um an die Passwörter zu gelangen.
    Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.
    Ok erstmal danke für die rege beteiligung. Also noch einmal zum verständnis.
    Alle uswr der firma haben zugriff auf meine datenbank. Jedoch sollte sie auf eine tabelle keinen zugriff haben (sondern nur ausgewählte personen) ich denke mal das geht nicht. Vielleicht sollte ich einfach eine zweite datenbank anlegen wo eben nur die admins zugriff haben, so könnte man es lösen dass das passwort sicher ist, oder?

    r0tzi schrieb:

    Alle uswr der firma haben zugriff auf meine datenbank. Jedoch sollte sie auf eine tabelle keinen zugriff haben (sondern nur ausgewählte personen) ich denke mal das geht nicht.
    Warum soll das nicht gehen?
    Zumindest wenn du einen MS-SQL-Server verwendest.
    Du gibst die Tabellen für eine AD-Gruppe "Anwendung" frei.
    Oder meinetwegen auch für "All User".
    Und die "geheimen" Tabellen gibst du für eine Gruppe "AnwendungsAdmin" frei.

    Dann trägst du die privilegierten Benutzer in die Admin-Gruppe ein und fertig.
    Je nachdem, wer eingeloggt ist, hat Berechtigung oder nicht.

    Falls ihr je kein AD verwendet, kannst du die Freigabe auch für Datenbank-User machen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --