Wenn ein passwort oder ähnliches in eurem programm speichern wollt, ohne das man es einfach auslesen kann, nehmt ihr vermutlich einen MD5-hash. nur leider kann man dann einfache kurtze passwörter auch sehr schnell bruteforcen, und längere kann man sich sich schlecht merken. wenn man sich das ganze aber mal genauer überlegt, erkennt man, dass man ja den aus dem hash, nochmal einen hash ersetllen könnte, da er ja auch nur ein string ist.
("ZiG")
Die Annahme ist zwar sehr stark verbreitet, ist aber nicht richtig. Man muß bei einem doppelt oder salted Hash nicht versuchen die 32 Zeichen des Ausgangshash rauszubekommen, also cracken.
Sieh dir Programme wie PasswordsPro oder MDCrack an. Die können sehr wohl mit salted Hashes umgehen.
Ist auch ganz einfach. Die Programme wiederholen einfach den Vorgang des hashens. Hab ich auch schon paarmal für coding hackits programmiert.
Vorgang: Plain generieren oder einlesen plain umwandeln. (Doppelt, salted oder was ihr wollt) Neuen Hash mit dem original vergleichen. Falls der übereinstimmt hat man ebenso den plain rausbekommen wie wenn man den einfachen MD5 Hash gecrackt hätte. Natürlich dauert das länger als bei einem normalen MD5 Hash.
vorhin hab ich das ganze 20000 mal gemacht, es dauerte nur etwa 7 sec.
hier habt ihr mal einen beispiel code: clsmd5 ist die md5-klasse.
Code:
Private Function multimd5(times As Long, ByVal text As String) As String<br />Dim md5 As New clsMD5<br />Dim i As Integer<br />For i = 1 To times<br />text = md5.DigestStrToHexStr(text)<br />Next<br />multimd5 = text<br />End Function
benuzen tut ihr das dann so: hash erstellen:
Code:
multimd5(20, "password")
überprüfen:
Code:
If mmultimd5(20, "password") = "cac43aed3585d7720c148ebeb9aa0076" Then MsgBox "Passwort Richtig!"
weiter so jetzt wollen wir aber auch noch andere verschlüsselungen benuzen ich beschreibe einmal den weiteren verlauf mit unserem salted hash: -sha1 -rc4 -sha256 -rc4 -base 64
so ab jetzt kommt alles in eine function GenerateCryptedHash: als erstes nochmal unseren md5 code und ein paar deklarationen:
Code:
Public Function GenerateCryptedHash(ByVal toCrypt As String) As String<br />Dim MD5 As New clsMD5<br />Dim SHA1 As New clsSHA<br />Dim SHA256 As New clsSHA256<br />Dim i As Integer<br />For i = 1 To 20<br />toCrypt = MD5.DigestStrToHexStr(toCrypt)<br />Next
so machen ich mache einfach mal weiter, sollte ja nicht so schwer sein das zu verstehen:
Code:
For i = 1 To 20<br />toCrypt = SHA1.SHA1(toCrypt)<br />Next<br /><br />toCrypt = RC4(toCrypt, """%&s=)!§§/³2""ö#'*ü<|!§§/|>+=")<br /><br />For i = 1 To 20<br />toCrypt = SHA256.SHA256(toCrypt)<br />Next<br /><br />toCrypt = RC4(toCrypt, "!§§/€??)+*#>>|<<%&§7§ad""""HJI")<br /><br />toCrypt = Base64EncodeUnicode2(toCrypt)<br /><br />GenerateCryptedHash = toCrypt
zum überprüfen machen wir das wie mit einem normalen hash:
Code:
If GenerateCryptedHash(<passwort>) = <hash> Then<br />MsgBox "Passwort Richtig!"<br />Else<br />MsgBox "Passwort Falsch!"<br />End If