Dieser Artikel richtet sich an Entwickler, die Hash -Funktionen in PHP verstehen und korrekt anwenden möchten. Wir werden MD5 und SHA-1 vergleichen, um klare und pragmatische Vorschläge aus Prinzipien, Ausgang, Kollisionsbeständigkeit, Geschwindigkeit, typischer Verwendungen und praktischer Verwendung in PHP zu machen und sicherere Alternativen und Verwendungsvorsichtsmaßnahmen zu erklären.
Hash (Hash) -Funktion : Akzeptiert Eingabe jeder Länge und gibt eine "Zusammenfassung" der festen Länge aus. Es wird häufig verwendet, um die Datenintegrität zu überprüfen, Signaturbasis zu generieren, Indizes usw. zu erstellen.
Repräsentabilität : Hash-Funktionen sollten einseitig sein-theoretisch kann die ursprüngliche Eingabe nicht aus der Zusammenfassung abgeleitet werden (aber nicht absolut, abhängig von der Fähigkeit des Angreifers).
Kollision : Ein Fall, in dem verschiedene Eingänge den gleichen Ausgang erzeugen. Ideales Hash sollte schwierig sein, Kollisionen zu finden.
Ausgangslänge
MD5: 128 Bit, normalerweise in 32-Charakter-Hexadezimal (wie D41D8CD98F00B204E9800998ECF8427E ).
SHA-1: 160 Bit, normalerweise in 40 Zeichen hexadezimal (wie DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 ).
Sicherheit (abstrakt)
MD5: Es hat sich nachgewiesen, dass es praktische und praktikable Kollisionsangriffe hat und nicht in sicherheitsempfindlichen Szenarien (Signaturen, Zertifikate, Kennwortspeicher usw.) verwendet werden kann.
SHA-1: stärker als MD5, wurde aber auch empirisch geknackt (Forschungs-/experimentelle Beweise für Kollisionen) und wurde als sicherer Hash nach und nach veraltet.
Geschwindigkeit
MD5 ist normalerweise schneller als SHA -1 (kürzerer interner Zustand und weniger Rechenvolumen), aber der Geschwindigkeitsunterschied ist nicht die Hauptüberlegung in der modernen Hardware - die Sicherheit ist wichtiger.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-string">"hello world"</span></span><span>;
</span><span><span class="hljs-comment">// MD5</span></span><span>
</span><span><span class="hljs-variable">$md5</span></span><span> = </span><span><span class="hljs-title function_ invoke__">md5</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>); </span><span><span class="hljs-comment">// 32 hex</span></span><span>
</span><span><span class="hljs-variable">$md5_raw</span></span><span> = </span><span><span class="hljs-title function_ invoke__">md5</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>); </span><span><span class="hljs-comment">// Original binär 16 Byte</span></span><span>
</span><span><span class="hljs-comment">// SHA-1</span></span><span>
</span><span><span class="hljs-variable">$sha1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">sha1</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>); </span><span><span class="hljs-comment">// 40 hex</span></span><span>
</span><span><span class="hljs-variable">$sha1_raw</span></span><span> = </span><span><span class="hljs-title function_ invoke__">sha1</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>); </span><span><span class="hljs-comment">// Original binär 20 Byte</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"MD5: <span class="hljs-subst">$md5</span></span></span><span>\n";
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"SHA1: <span class="hljs-subst">$sha1</span></span></span><span>\n";
</span></span>Für die Nachrichtenauthentifizierung (sicherere Integritätsprüfung), die Schlüssel benötigt, verwenden Sie HMAC:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$key</span></span><span> = </span><span><span class="hljs-string">"secret-key"</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-string">"important payload"</span></span><span>;
</span><span><span class="hljs-comment">// Empfohlen, länger und sicherer Hash zu verwenden(Beispiel:sha256)</span></span><span>
</span><span><span class="hljs-variable">$hmac</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hash_hmac</span></span><span>(</span><span><span class="hljs-string">'sha256'</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>, </span><span><span class="hljs-variable">$key</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"HMAC-SHA256: <span class="hljs-subst">$hmac</span></span></span><span>\n";
</span></span>Nur Nicht-Sicherheit eindeutige Identifizierung/schnelle Überprüfung (kleine Risiken sind akzeptabel)
Sowohl MD5 als auch SHA-1 können verwendet werden, um den Hash, einfachen Cache-Schlüssel und ein schnelles Beurteilung der Deduplizierung zu generieren (kann jedoch nicht als starke Konsistenzgarantie angewiesen werden).
Wird für sichere und empfindliche Szenarien verwendet (absolut nicht empfohlen)
Kennwortspeicher, digitale Signatur, TLS/Zertifikat-Fingerabdruck, Signaturüberprüfung usw.: Verwenden Sie MD5/SHA-1 nicht . Beide haben praktische Kollisionsangriffe (insbesondere MD5), und der Angreifer kann verschiedene Nachrichten aus derselben Verdauung schmieren.
Überprüfung der Dateiintegrität
Wenn nur eine zufällige Korruption während der Übertragung (nicht konfrontatives Szenario) verhindern soll, ist MD5/SHA-1 auf der Datei-Download-Seite immer noch üblich. Wenn Sie sich jedoch Sorgen um böswillige Manipulationen machen, verwenden Sie bitte einen stärkeren Hash (SHA-256/512) oder eine Signatur (HMAC/öffentliche und private Schlüsselsignatur).
MD5 : Seit den frühen 2000er Jahren wurden mehrere Kollisionsangriffe und praktische Angriffe durchgeführt und wurden für Sicherheitszwecke weit verbreitet.
SHA-1 : Lange als sicherer als MD5, aber Forschungen und Experimente haben praktische Kollisionen gezeigt (wie die praktische Kollisionsdemonstration, die 2017 von der Wissenschaft veröffentlicht wurde), sollten sie auch in Situationen vermieden werden, in denen die Sicherheitsanforderungen hoch sind.
(Hinweis: Die oben genannte Übersicht ist ein Überblick. Die veröffentlichte Forschungs- und Ingenieurpraxis zeigt, dass die beiden nicht ausreichend Kollisionen widerstehen.)
Kennwörter verwenden immer spezielle Kennwort -Hash -Funktionen : Verwenden Sie Passage_hash () / password_verify () , PHP -Standard ( password_default ) moderne Sicherheitsalgorithmen (wie BCrypt oder bessere Implementierung) und verarbeitet automatisch zufällige Salze und Kostenfaktoren.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Passwort Hashing und Überprüfung(Beispiel)</span></span><span>
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">'user-password'</span></span><span>;
</span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_DEFAULT);
</span><span><span class="hljs-comment">// Lagerung $hash Gehen Sie zur Datenbank</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_verify</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$hash</span></span><span>)) {
</span><span><span class="hljs-comment">// Überprüfung verabschiedet</span></span><span>
}
</span></span>Die Integrität und Authentifizierung von Nachrichten werden mit HMAC oder Signatur verwendet : Verwenden Sie für die kontroverse Umgebung hash_hmac () (z. B. SHA256 oder SHA512 ) oder verwenden Sie eine öffentliche Schlüsselsignatur (OpenSSL_SIGN usw.):
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$tag</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hash_hmac</span></span><span>(</span><span><span class="hljs-string">'sha256'</span></span><span>, </span><span><span class="hljs-variable">$message</span></span><span>, </span><span><span class="hljs-variable">$secret_key</span></span><span>);
</span></span>Im Allgemeinen werden die SHA-2- oder SHA-3-Serie für Hash bevorzugt : zum Beispiel SHA256 , SHA512 , das in PHP über Hash ('SHA256', $ Data) oder Hash ('SHA512', $ Data) verwendet werden kann; Diese sind in Stärke deutlich besser als MD5/SHA-1.
Wenn Sie die Binärdehnung effizienter verarbeiten müssen, können Sie die ursprüngliche Binärausgabe ( MD5 ($ Data, TRUE) / SHA1 ($ Data, TRUE ) und Base64 -Codierung des Speichers oder der Übertragung der Ergebnisse verwenden.
Versuchen Sie nicht, Ihr eigenes Kennwort -Hashing -Schema "mit Salz + mehreren Hashings" zu erstellen : Fehler sind anfällig für die Wartung. Bitte verwenden Sie die von der Sprache/Framework empfohlene Passwort -Hash -API.
Ausgangslänge: MD5 = 128 Bit (32 Hex), SHA-1 = 160 Bit (40 Hex).
Sicherheit: SHA-1> MD5, aber auch nicht mehr für sicherheitskritische Szenarien geeignet.
Geschwindigkeit: MD5 ist etwas schneller, aber der Unterschied sollte nicht die Auswahlkriterien sein (Sicherheitspriorität).
Empfohlener Zweck: Nur für nicht sichere eindeutige Identifizierung oder kompatible Szenarien; Bitte verwenden Sie SHA-2/SHA-3/HMAC/Passage_Hash für sichere Zwecke.
Wenn Sie einen neuen Code schreiben und über die Sicherheit besorgt sind, verwenden Sie MD5 oder SHA -1 nicht - Verwenden Sie Hash ('SHA256', $ Data) / Hash_HMAC ('SHA256', $ Data, $ Key) für Integrität und Authentifizierung und verwenden Sie Password_Hash () , um Passwörter zu verwalten. Betrachten Sie nur MD5/SHA-1 in Szenarien, die mit historischen Systemen kompatibel sind oder nicht mit der Sicherheit zusammenhängen.