2016-06-30 2 views
-1

ich meine alten Code zurück aus dem Jahr 2011 haben die Hash-mcrypt_encrypt(): Schlüssel der Größe 29 nicht durch diesen Algorithmus unterstützt

private static $key = '[email protected]#€2011GAMESITES'; 

/** 
* Computes salted password hash. 
* @param string 
* @return string 
*/ 
public static function calculateHash($password) 
{ 
    $text = $password; 
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 
    $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, self::$key, $text, MCRYPT_MODE_ECB, $iv); 
    return base64_encode($crypttext); 
} 

berechnen Wenn ich versuche, es zu laufen jetzt bekomme ich einen Fehler:

Warning: mcrypt_encrypt(): Key of size 29 not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported in ..\Hash.php on line 27

Ich weiß, dass es eine lange Zeit von 2011 dauert und es kann bessere Möglichkeiten geben, es jetzt zu tun, aber ich muss es aus früheren Version für ein historisches Problem arbeiten lassen. Was mache ich falsch? Ich kann nicht einmal sehen, welche Größe 29 es bedeutet.

Oder gibt es alternativ eine Möglichkeit, einen Hash zu brechen, wenn ich noch eine Funktion habe? mit diesem kann ich potencialy anfangen, die neue Art zu verwenden, Hash zu berechnen.

Vielen Dank für jeden raten

+1

Siehe die Antwort in http://stackoverflow.com/questions/31125545/mcrypt-encrypt-key-of-size. – mattias

+0

Um Passwort-Hashes in Zukunft zu implementieren: erfinden Sie es nicht selbst, sondern verwenden Sie dafür eine bestehende und gut recherchierte [KDF] (https://en.wikipedia.org/wiki/Key_derivation_function). Ein gutes Beispiel wäre 'bcrypt', das durch die PHPs [' password_hash'] (http://php.net/manual/en/function.password-hash.php) und ['password_verify'] unterstützt wird (http://php.net/manual/en/function.password-verify.php). –

Antwort

1

Wenn Sie das Changelog in the documentation for mcrypt_encrypt konsultieren, sollten Sie, dass seit PHP 5.6.0 ... siehe

Invalid key and iv sizes are no longer accepted. mcrypt_encrypt() will now throw a warning and return FALSE if the inputs are invalid. Previously keys and IVs were padded with '\0' bytes to the next valid size.

Die Lösung daher Ihren Schlüssel durch eine solche zu ersetzen, die mit Null-Zeichen zu 32 Byte aufgefüllt .

Leider gibt es dort ein Nicht-ASCII-Zeichen (das Euro-Zeichen), also gibt es mehrere Möglichkeiten, wie das codiert werden soll. Es ist wahrscheinlich am besten, diesen Charakter manuell zu kodieren. In Unicode hat das Euro-Zeichen U + 20AC Codepoint, die übersetzen würde '\ xE2 \ x82 \ XAC' (was erklärt, warum mcrypt 29 Byte zählt statt 27), Ihren neuen Schlüssel

private static $key = '[email protected]#\xE2\x82\xAC2011GAMESITES\0\0\0'; 

Hinweis zu machen, dass wir müssen eine Zeichencodierung für Ihren Code übernehmen; Ich habe UTF-8 angenommen. Es ist unwahrscheinlich, aber möglich, dass es 2011 in einer anderen Zeichencodierung (z. B. ISO-8859-1) codiert werden sollte, was zu einer sehr unterschiedlichen Codierung für das Eurozeichen führt.

0

$key der Schlüssel ist, und muss eine unterstützte Größe von 16, 24 oder 32 Bytes lang sein. Übergeben Sie eine Länge von 29 Byte, müssen Sie einen Schlüssel in der richtigen Größe verwenden. Der Code berechnet keinen Hash, er verschlüsselt $text.

Es verwendet den ECB-Modus, der nicht als sicher gilt. Beachten Sie, dass der ECB-Modus keinen iv $iv benötigt, so dass es keinen Sinn macht, einen zu erstellen. CBC-Modus ist besser und verwendet einen iv.

Wenn Sie wirklich einen Hash erstellen möchten, verwenden Sie eine Hash-Funktion wie SHA-256. Wenn Sie einen "getasteten" oder gesalzenen Hash benötigen, verwenden Sie einen HMAC.

Sogar "zurück zu 2011" Verschlüsselung wurde nicht verwendet, um Hashes zu erstellen, es gibt wirklich nichts Neues seit damals.

Iterate über einen HMAC mit einer zufälligen Salz für etwa 100ms Dauer (das Salz muss mit dem Hash gespeichert werden). Verwenden Sie Funktionen wie password_hash, PBKDF2, Bcrypt und ähnliche Funktionen. Es geht darum, den Angreifer dazu zu bringen, viel Zeit mit der Suche nach Passwörtern zu verbringen.

Siehe OWASP (Open Web Application Security-Projekt) Password Storage Cheat Sheet.

Siehe How to securely hash passwords, The Theory auf Sicherheit Stackexchange.

+0

Ich kann falsch sein, aber $ key ist '[email protected] # es2011GAMESITES' das ist 27 Zeichen nicht 29 – Andurit

+0

Okey, gibt es einen Weg, dann, wie man von Hashes ein echtes Passwort dann bekommen? Um die Änderung auf diese Weise ohne Benutzerinteraktion zu erzwingen < – Andurit

+0

Sie müssen wirklich zurück zur Frage hinzufügen, was Sie versuchen zu erreichen, wenn Sie eine gute Antwort und sicheren Code wollen. – zaph

Verwandte Themen