Username und Passwort sichern?

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

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Gangsterkrafter.

    Username und Passwort sichern?

    Hey, Ich moechte mich jetzt Praeziser mit Hashen und Verschluessellung auseinander setzen.

    Meine Frage Lautet, Ich bin mir nicht sicher / Kann mich nicht entscheiden was das Beste und Sicherste fuer Mein Vorhaben ist:

    Ich Lasse den User in 3 Textboxen Eingaben machen,

    Hostname (Muss nicht Gesichert Werden)
    Username
    Passwort

    und diese Sachen werden dann in eine Json Datei Konvertiert, damit man sie natuerlich spaeter wenn man sie braucht auslesen kann.

    Jetzt meine Frage, Wie bzw. Womit sollte ich das ganze Am Besten Verschluesseln/Hashen?
    Es sind ja nur Strings von Daher gehe ich mal davon aus dass man das eher Hashen sollte als verschluesseln oder?
    Wenn ja dann kommt halt meine oben genannte Frage ins Spiel, womit?

    Ich moechte auch nochmal ganz deutlich Klar machen, dass ich nirgents in meinem Source Code, irgentwelche Passwoerter oder Nutzernamen Speichere.


    lg
    Begeisterter BF4 Spieler :D
    Der Unterschied ist simpel.

    Willst du das man die Daten wieder entschlüsseln kann, dann musst du sie verschlüsseln.
    Willst du das man die Daten nur vergleichen kann, dann musst du sie hashen.
    Ein Hashwert lässt sich nicht zurückrechnen und dient im Normalfall lediglich dem Vergleich zweier Daten
    (Egal ob Dateien, Signaturen, Passwörter etc)

    Willst du etwas verschlüsseln und entschlüsseln benötigst du aber im Normalfall einen Schlüssel. Dieser muss beim ver/entschlüsseln bekannt sein.

    Welchen Hashalgo man verwendet hängt vom Zweck ab. Möchte man eher Sicherheit oder eher Performance.
    SHA-256 ist relativ sicher und auch relativ schnell.

    Bei Verschlüsselung ist zur Zeit AES-256 (Rijndael) das vermutlich am meisten verbreitete.
    Das ist meine Signatur und sie wird wunderbar sein!
    Ich moechte die beiden Strings

    Username
    Passwort

    So Verschluesseln dass ich sie in die Json Datei Hinterlegen kann und dann, wenn das programm diese Beiden Sachen Braucht, um sich Einzuloggen, das programm dann diese Beiden Strings wieder Etnschluesselt und dem Server uebergibt, sodass ich Authentifiziert werden kann und mich Erfolgreich Einlogge.

    EDIT: Ich muesste evtl. Dazu sagen, dass ich mich mit einem FTP Server verbinden moechte und dazu diese daten Brauche.

    EDIT: @RodFromGermany okay, und in was Hashen? md5 ist ja unsicher...

    Kannst du mir da was Empfehlen / ans Herz Legen?

    lg
    Begeisterter BF4 Spieler :D
    @Gangsterkrafter In diesem Falle ist das Hashen die beste Lösung.
    Die Klartexte muss niemand kennen.
    =====
    Wenn Du die Mathematik dahinter verstehst, kannst Du Dir eine eigene Hash-Funktion schreiben.
    Bedenke dabei auch, dass es unproblematisch ist, ein .NET-Programm auszulesen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Md5 ist ok. SHA-256 ist besser.

    Wenn du aber die Daten im KLARTEXT zum FTP Server senden musst. Dann ist zum einen hashen nicht möglich und zum anderen wäre auch verschlüsseln unnötig.
    Wenn du Sicherheit willst verwende zumindest FTPS (SFTP wäre noch besser, aber schwieriger umzusetzen). Denn andernfall sind die Daten die du sendest wie gesagt im Klartext und man kann sie zB mit Wireshark mitlesen.

    Falls das mitlesen im Netzwerk kein Problem darstellt und du wirklich FTP verwendest dann kannst du die Daten maximal verschlüsseln, da du sie zur Anmeldung im Klartext brauchst, was bei Hashes nicht möglich wäre.
    Das ist meine Signatur und sie wird wunderbar sein!

    Gangsterkrafter schrieb:

    dass ich mich mit einem FTP Server verbinden moechte
    Dann hilft hashen aber nichts, weil du für den FTP-Login beide Daten im Klartext brauchst.
    Da hilft nur verschlüsseln.
    Ist es normales FTP-Protokoll?
    Dann kannst du dir auch das Verschlüsseln nahezu sparen, weil die Daten eh als Klartext über die Leitung gehen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich Brauche die daten leider definitiv im Klartext, weil der server ja keine Hashes als Passwort annimmt weil das ja nicht Verglichen wird sondern nur Gesendet und wenn falsch, dann sende fehler.

    Also waere mit FTPS & Verschluesselung nichts Falsch zu machen?
    Allerdings stellt sich dann auch die frage, wenn ich ein passwort Brauche und das entschluessele wie mache ich das dann?

    Weil eigentlich soll er ja nur, Strings Verschluesseln => In Json Schreiben => Und Falls Benoetigt entschluesseln und dann Verbinden,

    Also muesste ich dann ein Masterpasswort erstellen, was der user Bestimmt und das auch in die json mit reinpacken, hashen und dann bei Entschluesselungs Versuch, Den User nach dem Masterpasswort Fragen, dieses dann Hashen und mit dem gehashten Masterpasswort in der json datei Vergleichen, Oder hab ich da jetzt nen Denkfehler?

    lg
    Begeisterter BF4 Spieler :D
    Afaik ist das die sicherste Lösung.
    Ein Masterpasswort hashen und mit diesem die anderen ver -und entschlüsseln.
    Dieses muss der User aber bei jedem Programmstart einmal eingeben.

    Also ein Masterpasswort hashen -> nach Eingabe den Hash vergleichen -> wenn gleich dann dieses Passwort als Schlüssel verwenden (nicht den Hash, der stünde ja wieder im Klartext in der Datei).
    Das ist meine Signatur und sie wird wunderbar sein!
    Okay...
    Dann Bedanke ich mich erstmal an alle, und werde mich melden wenn ich beim Tuefteln nicht mehr weiter komme ;)

    EDIT: Habe jetzt mal nach nem Bisschen suchen glaube ich das Passende gefunden Aes256Base64Encrypter falls jemand einwaende hat, kann er sich gerne Melden :D

    lg
    Begeisterter BF4 Spieler :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gangsterkrafter“ ()

    Okay Grafisch ist jetzt alles Ready, jetzt muesste ich nurnoch wissen, womit ich das Masterpasswort am besten hashen kann, SHA256 hoert sich ganz gut an oder?

    & Noch ne Frage,
    Was ist denn der Unterschied zwischen dem
    Secretkey und Salt ?

    EDIT: 2. Frage Spielt keine Rolle mehr, havs schon verstanden :)


    Begeisterter BF4 Spieler :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gangsterkrafter“ ()

    Okay Mein Einziges Problem auf das ich jetzt Stosse ist Folgendes:

    Folgenden Code habe ich:

    VB.NET-Quellcode

    1. Private Shared Function getAlgorithm(ByVal secretKey As String) As RijndaelManaged
    2. Const salt As String = InputtedValidMasterpassword
    3. Const keySize As Integer = 256
    4. Dim keyBuilder As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(secretKey, Encoding.Unicode.GetBytes(salt))
    5. Dim algorithm As RijndaelManaged = New RijndaelManaged()
    6. algorithm.KeySize = keySize
    7. algorithm.IV = keyBuilder.GetBytes(CType(algorithm.BlockSize / 8, Integer))
    8. algorithm.Key = keyBuilder.GetBytes(CType(algorithm.KeySize / 8, Integer))
    9. algorithm.Padding = PaddingMode.PKCS7
    10. Return algorithm
    11. End Function


    Der Fehler Tritt in der 2. Zeile bei

    Const salt As String = InputtedValidMasterpassword auf.

    Hierbei ist InputtedValidMasterpassword das Masterpasswort was als Plaintext gespeichert wird sobald der User sich Erfolgreich Authentifiziert hat,

    Der Fehler lautet:

    Quellcode

    1. (field) CodeSyncAuthMaster.InputtedValidMasterpassword As String
    2. Constant expression is required


    (Habe noch nie mit einer const gearbeitet, daher kenne ich mich nicht aus, ist wahrscheinlich fuer euch das einfachste was es gibt :D)

    Wuerde es das ganze nicht vereinfachen wenn ich const einfach zu dim aendere?
    denn wie ich mittlerweile weiss, benoetigt const einen Direkten Wert und keine Variable mit einem Wert.

    lg
    Begeisterter BF4 Spieler :D

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Gangsterkrafter“ ()

    Ja, (Wenn ich es Richtig verstanden habe)
    ist ein SecretKey das Passwort zum Entschluesseln und Salt ist der "Schwachsinn" der an den Text Hinzugefuegt wird damit man ohne das Richtige passwort den Text nicht Entschluesseln kann.

    Hat sich alles Geklaert, Danke An Alle, Funktioniert Super!
    Fuer Die Zukunft Fuer Andere:
    Klasse Mit der Ich DE und EN crypte

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Text
    3. Imports System.Security.Cryptography
    4. Public Class Aes256Base64Encrypter
    5. Public Shared Function Encrypt(ByVal plainText As String, ByVal secretKey As String) As String
    6. Dim encryptedPassword As String = Nothing
    7. Using outputStream As MemoryStream = New MemoryStream()
    8. Dim algorithm As RijndaelManaged = getAlgorithm(secretKey)
    9. Using cryptoStream As CryptoStream = New CryptoStream(outputStream, algorithm.CreateEncryptor(), CryptoStreamMode.Write)
    10. Dim inputBuffer() As Byte = Encoding.Unicode.GetBytes(plainText)
    11. cryptoStream.Write(inputBuffer, 0, inputBuffer.Length)
    12. cryptoStream.FlushFinalBlock()
    13. encryptedPassword = Convert.ToBase64String(outputStream.ToArray())
    14. End Using
    15. End Using
    16. Return encryptedPassword
    17. End Function
    18. Public Shared Function Decrypt(ByVal encryptedBytes As String, ByVal secretKey As String) As String
    19. Dim plainText As String = Nothing
    20. Using inputStream As MemoryStream = New MemoryStream(Convert.FromBase64String(encryptedBytes))
    21. Dim algorithm As RijndaelManaged = getAlgorithm(secretKey)
    22. Using cryptoStream As CryptoStream = New CryptoStream(inputStream, algorithm.CreateDecryptor(), CryptoStreamMode.Read)
    23. Dim outputBuffer(0 To CType(inputStream.Length - 1, Integer)) As Byte
    24. Dim readBytes As Integer = cryptoStream.Read(outputBuffer, 0, CType(inputStream.Length, Integer))
    25. plainText = Encoding.Unicode.GetString(outputBuffer, 0, readBytes)
    26. End Using
    27. End Using
    28. Return plainText
    29. End Function
    30. Private Shared Function getAlgorithm(ByVal secretKey As String) As RijndaelManaged
    31. 'Dim salt As String = InputtedValidMasterpassword
    32. Const keySize As Integer = 256
    33. Dim keyBuilder As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(secretKey, Encoding.Unicode.GetBytes(MasterplainforSalt)) 'MasterplainforSalt ist hier Mein Masterpasswort im Plaintext! (NICHT HASHED!)
    34. Dim algorithm As RijndaelManaged = New RijndaelManaged()
    35. algorithm.KeySize = keySize
    36. algorithm.IV = keyBuilder.GetBytes(CType(algorithm.BlockSize / 8, Integer))
    37. algorithm.Key = keyBuilder.GetBytes(CType(algorithm.KeySize / 8, Integer))
    38. algorithm.Padding = PaddingMode.PKCS7
    39. Return algorithm
    40. End Function
    41. End Class


    Aufgerufen werden kann das dann Folgend:

    VB.NET-Quellcode

    1. Imports MeinProgramm.Aes256Base64Encrypter ' Aes256Base64Encrypter ist der Klassenname!
    2. ......
    3. Dim Encrypted as String
    4. Encrypted = Encrypt("HalloHerrPlus", "MeinSecretkey")
    5. Messagebox.Show(Encrypted)
    6. ODER
    7. Dim Decrypted as String
    8. Decrypted = Decrypt("MEIN ENCRYPTETER KEY", "MeinSecretkey")
    9. Messagebox.Show(Decrypted)



    lg und nochmal Danke an Alle die mir hier Geholfen haben!
    Begeisterter BF4 Spieler :D