PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VB .NET und md5-Verschlüsselung


mf_2
2005-08-25, 02:05:22
Hallo,

Ich habe eine MySQL datenbank mit usernamen und passwörter. die passwörter liegen dort in hash-form ( md5 ) vor. nun soll man sich mittels einees kleinen vb progs einloggen können. es nimmt einen usernamen und passwort als eingabe., das passwort soll nun mit dem md5 hash auf richtigkeit überprüft werden.in php wüäre das kein problem, da nehm ich einfach $pw = md5($eingabe) und schon hab ich den md5 hash der eingabe. aber wie mache ich das in vb .net? die passwörter werden mit der php md5 funktion gehasht ( ist das der richtige ausdruck? ). ich ahb jetzt so ne dll gefunden, für ne vb verschlüsselung. sie heisst ebcrypt. sie ist aber weder vb .net kompatibel noch spukt sie im html file ( kommt mit einem modul fürn browser ( activex oder so )) den richtigen hash aus. ich hab mal den md5 hash von dem wort 'cool' genommen, und die php funktion hat mir nen anderen hash gegeben als diese komische activex funktion. dann kann ich natürlich ned vergleichen.
kennt ihr ne unkomplizierte lösung für md5 mit VB .NET? Es muss für .NET sein, VB5 oder VB6 funktionen oder programme alssen sich oft ned so toll updaten, obwohl M$ dafür nen eigenen assisstenten in vb .net hat.

Gnafoo
2005-08-25, 02:34:13
Wenn mich jetzt nicht alles täuscht, müsstest du unter folgendem link genau das finden, was du suchst:
http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=dotnet/tipps/tip0054.shtml

Die Seite hat Google irgendwo ausgespuckt. Anscheinend gibt es die Funktionalität bereits vom .NET-Framework aus.

HellHorse
2005-08-25, 08:56:09
Hallo,

Ich habe eine MySQL datenbank mit usernamen und passwörter. die passwörter liegen dort in hash-form ( md5 ) vor. nun soll man sich mittels einees kleinen vb progs einloggen können. es nimmt einen usernamen und passwort als eingabe., das passwort soll nun mit dem md5 hash auf richtigkeit überprüft werden.in php wüäre das kein problem, da nehm ich einfach $pw = md5($eingabe) und schon hab ich den md5 hash der eingabe. aber wie mache ich das in vb .net? die passwörter werden mit der php md5 funktion gehasht ( ist das der richtige ausdruck? ). ich ahb jetzt so ne dll gefunden, für ne vb verschlüsselung. sie heisst ebcrypt. sie ist aber weder vb .net kompatibel noch spukt sie im html file ( kommt mit einem modul fürn browser ( activex oder so )) den richtigen hash aus. ich hab mal den md5 hash von dem wort 'cool' genommen, und die php funktion hat mir nen anderen hash gegeben als diese komische activex funktion. dann kann ich natürlich ned vergleichen.
kennt ihr ne unkomplizierte lösung für md5 mit VB .NET? Es muss für .NET sein, VB5 oder VB6 funktionen oder programme alssen sich oft ned so toll updaten, obwohl M$ dafür nen eigenen assisstenten in vb .net hat.
Sorry, aber das bringt aus meiner Sicht gar nix. Wenn jemand Lesezugriff auf deine DB hat, was ziemlich sicher nicht vorgesehen ist und auch ziemlich sicher Schreibrechte impliziert, da kein wirkliches Usermanagement vorhanden ist, dann hast du viel gravierendere Probleme und macht es doch keinen Unterschied, ob die Passwörter die er dort sieht gehasht sind oder nicht, denn genau was dort steht wird übertragen.

Mal ganz davon zu schweigen, dass MD5 nicht sicher ist und es solche Sachen gibt:
http://gdataonline.com/

mf_2
2005-08-25, 12:43:47
Ich denke mir für den Anfang sollte es an sicherheit ausreichen.
Ich habe aber ein problem mit dem einbau der funktion.
Hier ist der code:


Dim tmpHash1() As Byte
Dim tmpHash2() As Byte
Dim hash1 As String
Dim hash2 As String
Dim tmpSource() As Byte
Dim sSourcedata As String = txtPassword.Text
tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourcedata)
tmpHash1 = New MD5CryptoServiceProvider().ComputeHash(tmpSource)
hash1 = ByteArrayToString(tmpHash1)
While MyReader.Read

tmpHash2 = MyReader.GetValue(MyReader.GetOrdinal("password"))
' tmpHash2 = MyReader.GetValue(MyReader.GetValue(2))
hash2 = ByteArrayToString(tmpHash2)

End While

If CheckHashes(tmpHash1, tmpHash2) Then
MessageBox.Show("Ok. Die Passwörter sind identisch!", "Passwort-Hash prüfen", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
MessageBox.Show("Falsch. Die Passwörter sind NICHT identisch!", "Passwort-Hash prüfen", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End If



Der mysql reader liest das passwort aus der mysql tabelle. dann soll mit hilfe von CheckHashes verglichen werden ob die passwörter identisch sind.
das kann auch problemlos compiliert werden, aber beim ausführen gibts folgenden fehler: specified cast is not valid. Der fehler liegtb in der zeile:
tmpHash2 = MyReader.GetValue(MyReader.GetOrdinal("password"))

Ich glaube es hat was mit den variablentypen zu tun.
Wisst ihr wie ich daslösen kann?

Pinoccio
2005-08-25, 12:59:14
Mal ganz davon zu schweigen, dass MD5 nicht sicher ist und es solche Sachen gibt:
http://gdataonline.com/Was schlägst du als Alternative vor? ;-)
Außerdem gibt es (meines Wissens nach und google scheint mir da Recht zu geben) keine praktikable preimage-Attacke auf MD5. (Falls doch bin ich für jeden Link dankbar!)
Für nicht-sicherheitsrelevante Daten sollte MD5 also ausreichen.
Was die konkrete Implementation betrifft ist aus Sicht des Angreifers in der Tat egal, was in der DB drin steht, sobald er sie lesen kann, hast du verloren.

mfg Sebatian

Gnafoo
2005-08-25, 13:51:00
Ich glaube es hat was mit den variablentypen zu tun.
Wisst ihr wie ich daslösen kann?
Denke ich auch. Ich habe zwar nicht viel Ahnung von VB, aber ich hätte bei der Fehlermeldung spontan getippt, dass GetValue kein Bytearray zurückgibt, sondern etwas anderes. (String? ka)

mf_2
2005-08-25, 14:25:45
Jetzt habe ich mal das getvalue in getbytes geändert.
Es sieht jetzt so aus:
tmpHash2 = MyReader.GetBytes(MyReader.GetOrdinal("password"))

Da bekomme ich aber n ganzen haufen von fehlern:
Error 1 Argument not specified for parameter 'dataIndex' of 'Public Function GetBytes(i As Integer, dataIndex As Long, buffer() As Byte, bufferIndex As Integer, length As Integer) As Long'.
Error 2 Argument not specified for parameter 'buffer' of 'Public Function GetBytes(i As Integer, dataIndex As Long, buffer() As Byte, bufferIndex As Integer, length As Integer) As Long'.
Error 3 Argument not specified for parameter 'bufferIndex' of 'Public Function GetBytes(i As Integer, dataIndex As Long, buffer() As Byte, bufferIndex As Integer, length As Integer) As Long'.
Error 4 Argument not specified for parameter 'length' of 'Public Function GetBytes(i As Integer, dataIndex As Long, buffer() As Byte, bufferIndex As Integer, length As Integer) As Long'.

ich habs auch mal mit getbyte ( ohne 's' ) vgersucht, aber da bekomm ich den fehler:
Error 1 Value of type 'Byte' cannot be converted to '1-dimensional array of Byte'.

Wisst ihr was ich machen soll?

HellHorse
2005-08-25, 18:41:54
Was schlägst du als Alternative vor? ;-)
....
Was die konkrete Implementation betrifft ist aus Sicht des Angreifers in der Tat egal, was in der DB drin steht, sobald er sie lesen kann, hast du verloren.
Genau, deswegen speichern wir die Passwörter im plaintext. Das zwingt uns wirklich Gedanken über die Sicherheit zu machen.

Falls das Programm auf der gleichen Maschine wie die db läuft deaktivieren wir TCP-sockets und lassen die Verbingung über Unix Domain Sockets laufen. Ansonsten lassen wir die Verbingung über SSL/TLS laufen.

mf_2
2005-08-25, 23:09:22
ich hab jetzt ne lösung gefunden, trotzdem danke für eure Hilfe!

ethrandil
2005-08-25, 23:27:04
Genau, deswegen speichern wir die Passwörter im plaintext.
Das gefiele mir als User aber überhaupt nicht O_O.
(Jaja, Mehrfachpasswörter sind pöhse...)

- Eth

HellHorse
2005-08-26, 10:33:36
Das gefiele mir als User aber überhaupt nicht O_O.
Warum, wie dargelegt bringt hashing nichts ausser eingebildter Sicherheit, sofern der Hash als Passwort verwendet wird oder das Passwort oder Hashwert plaintext übers Netz versendet werden wie bei 3dc. Ich sage nicht, dass hashes für Passwörter grundsätzlich nichts bringen siehe dazu /etc/passwd.

Rein aus Neugier, hashe mal dein 3dc Passwort und schau nach, ob http://gdataonline.com/ einen Eintrag dafür hat.

grakaman
2005-08-26, 10:57:37
Die reinen Passwörter lediglich als Hash speichern bringt auch rein gar nichts, wie das Hellhorse schon sagte. Nur wenn mans richtig machen will, dann hasht man zuerst das Passwort, erstellt ein zufälliges Salt, hängt dieses irgendwo an den Hash, hasht das ganze noch mal und speichert dann diesen Hash + den Salt in der DB. Wenn dann jemand sich authentifiziert, wird dessen Passwort gehasht, dann das Salt aus der DB an die richtige Stelle angefügt, wieder gehasht und dieses mit dem Hash aus der DB verglichen.

edit: Hab da zum Teil Unsinn erzählt. Ein Hash ist hier IMO nur sinnvoll, wenn ich diesen direkt übers Netz verschicke und nicht erst wieder mit dem Salt errechne. Also z.B. könnte man den dann bei einer Webapp in einem Cookie speichern.