Suche Funktion zum Erstellen des MD5-Hashs eines std::wstring (mit Unicode Zeichen)
-
Für welche Plattform programmierst du?
-
Sasa Fuchs schrieb:
Woher kommt die Funktion MD5_Update()?
Jede MD5 Library hat eine Funktion die so oder so ähnlich heißt. Nimm einfach irgendeine aus dem Internet.
-
Sorry, WIN32...
-
-
Die WinAPI hat eine Crypto API, die eine MD5 Hashfunktion mitbringt:
HCRYPTPROV hCryptProvider = 0; HCRYPTHASH hCryptHash = 0; ::CryptAcquireContext( &hCryptProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ); ::CryptCreateHash( hCryptProvider, CALG_MD5, 0, 0, &hCryptHash ); ::CryptHashData( hCryptHash, Data, DataLength, 0 ); DWORD Size = 0; ::CryptGetHashParam( hCryptHash, HP_HASHSIZE, 0, &Size, 0 ); std::vector<BYTE> Buffer( Size ); ::CryptGetHash( hCryptHash, HP_HASHVAL, &Buffer.front(), Size ); ::CryptDestroyHash( hCryptHash ); ::CryptReleaseContect( hCryptProvider );Ohne Netz und doppelten Bode...
-
DocShoe schrieb:
Die WinAPI hat eine Crypto API, die eine MD5 Hashfunktion mitbringt:
HCRYPTPROV hCryptProvider = 0; HCRYPTHASH hCryptHash = 0; ::CryptAcquireContext( &hCryptProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ); ::CryptCreateHash( hCryptProvider, CALG_MD5, 0, 0, &hCryptHash ); ::CryptHashData( hCryptHash, Data, DataLength, 0 ); DWORD Size = 0; ::CryptGetHashParam( hCryptHash, HP_HASHSIZE, 0, &Size, 0 ); std::vector<BYTE> Buffer( Size ); ::CryptGetHash( hCryptHash, HP_HASHVAL, &Buffer.front(), Size ); ::CryptDestroyHash( hCryptHash ); ::CryptReleaseContect( hCryptProvider );Ohne Netz und doppelten Bode...
OMG

-
Hallo,
ich würde auch gerne die Crypto-API mit der MD5-Hash-Funktion benutzen. Aber ich weiß grad nicht, wie! Wo kommt der String rein? Wo habe ich denn den MD5-Hash-Wert?
Vielen Dank Michel
-
HCRYPTPROV hCryptProvider = 0; HCRYPTHASH hCryptHash = 0; ::CryptAcquireContext( &hCryptProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ); ::CryptCreateHash( hCryptProvider, CALG_MD5, 0, 0, &hCryptHash ); ::CryptHashData( hCryptHash, Data, DataLength, 0 ); DWORD Size = 0; ::CryptGetHashParam( hCryptHash, HP_HASHSIZE, 0, &Size, 0 ); std::vector<BYTE> Buffer( Size ); ::CryptGetHash( hCryptHash, HP_HASHVAL, &Buffer.front(), Size ); ::CryptDestroyHash( hCryptHash ); ::CryptReleaseContect( hCryptProvider );@MichelM: In Zeile 5 wird Data übergeben..ich tippe mal auf den Datentyp BYTE
Der Hash müsste dann in Buffer stehen..bei meinen Versuchen scheiterte es aber daran, dass CryptGetHash() nicht gefunden wurde...das müsste soweit ich es jetzt gesehen habe auch CryptGetHashParam lauten
Hier noch ein Link zum Thema:
http://msdn.microsoft.com/en-us/library/aa382380
-
MD5 ist veraltet und nicht mehr sicher. Wenn möglich solltest du ein anderes Hash-Verfahren benutzen (zB SHA-256). http://en.wikipedia.org/wiki/MD5#Security
-
Oder man Hasht einfach mehrmals mit MD5 und nimmt nen Salt.
-
Äh, ja, natürlich. Hab den Quelltext nicht aus dem Produktionscode kopiert sondern nur die Kernfunktionen runtergeschrieben, da hat sich wohl der ein- oder andere Fehler eingeschlichen.
- CryptGetHash() muss durch CryptGetHashParam ersetzt werden
- Data ist ein Pointer auf BYTE und DataLength die Anzahl der zu hashenden Bytes
- Buffer enthält schließlich den MD5 Hash als Binärfolge von BytesWindows unterstützt ab XP/2000 noch CALG_SHA und CALG_SHA1, ab 2003 Server und Vista auch noch SHA256, SHA384 und SHA512. Mann braucht lediglich in Zeile 4 die ALGID durch die entsprechende Konstante ersetzen.
-
314159265358979 schrieb:
Oder man Hasht einfach mehrmals mit MD5 und nimmt nen Salt.
Nein.
bzw. mit salt hasht man sowieso immer - aber md5 verwendet man nicht.
-
Lustig, dass hier immer implizit angenommen wird, dass es sich um einen Vorgang handelt, bei dem die Sicherheit von MD5 gegenüber gezielten Angriffen ein Thema wäre.
Zugegeben, wenn einer danach fragt wie man Strings hasht, ist es naheliegend an Passwörter zu denken.
Falls es nicht so sein sollte, also falls der Hash nicht kryptographisch sicher sein muss: es gibt einen guten Grund MD5 zu wählen, und das ist die Geschwindigkeit. SHA-xxx und RIPEMD-xxx sind je nach verwendeter Library & CPU nur etwa halb so schnell wie MD5, bzw. noch langsamer. Merklich schneller als MD5 sind nur sehr einfache Prüfsummen wie Adler32. Im Vergleich mit CRC32 ist MD5 10-15% langsamer. Kurz: MD5 ist ein sehr guter Kompromiss wenn man bessere Sicherheit braucht als Adler32 bieten kann, aber trotzdem "den schnellsten" Hash verwenden will.
-
Also für mich ist es nötig, MD5-Hash zu nehmen. Aber ich komme immer noch nicht damit klar, diesen Algorithmus in mein Programm zu integrieren!
Bau ich den Code der Main-Funktion aus dem Link einfach als eigene Funktion in meine cpp-Datei ein, oder muss ich dafür extra eine neue Datei erstellen und diese dann einbinden?Gruß Michel