Die mcrypt-Erweiterung ist veraltet wird in PHP 7.2 nach dem entsandten Kommentar entfernt werden hier . Daher suche ich nach einer alternativen Möglichkeit, Passwörter zu verschlüsseln.
Im Moment benutze ich so etwas wie
mcrypt_encrypt(MCRYPT_RIJNDAEL_128, md5($key, true), $string, MCRYPT_MODE_CBC, $iv)
Ich benötige Ihre Meinung für den besten / stärksten Weg, um Passwörter zu verschlüsseln. Das verschlüsselte Passwort sollte natürlich von PHP 7.xx unterstützt und auch entschlüsselt werden können, da meine Kunden die Möglichkeit haben möchten, ihre Passwörter wiederherzustellen, ohne ein neues zu generieren einer.
password_hash
hashen und verifizierenpassword_verify
?Antworten:
Es wird empfohlen, Kennwörter zu hashen, damit sie nicht entschlüsselt werden können. Dies erschwert Angreifern, die möglicherweise Zugriff auf Ihre Datenbank oder Dateien erhalten haben, etwas.
Wenn Sie Ihre Daten verschlüsseln und entschlüsseln müssen, finden Sie unter https://paragonie.com/white-paper/2015-secure-php-data-encryption eine Anleitung zur sicheren Verschlüsselung / Entschlüsselung . Um diesen Link zusammenzufassen:
quelle
Sodium-compat
( github.com/paragonie/sodium_compat ) gibt, die in PHP> = 5.2.4Wie von @rqLizard vorgeschlagen , können Sie stattdessen
openssl_encrypt
/openssl_decrypt
PHP-Funktionen verwenden, die eine viel bessere Alternative zur Implementierung von AES (The Advanced Encryption Standard) darstellen, auch als Rijndael-Verschlüsselung bekannt.Gemäß dem folgenden Kommentar von Scott auf php.net :
Weiterführende Literatur:
Codebeispiele
Beispiel 1
Beispiel 2
Beispiel 3
Anhand der obigen Beispiele habe ich den folgenden Code geändert, mit dem die Sitzungs-ID des Benutzers verschlüsselt werden soll:
in:
Zur Verdeutlichung ist die obige Änderung keine echte Konvertierung, da die beiden Verschlüsselungen eine unterschiedliche Blockgröße und unterschiedliche verschlüsselte Daten verwenden. Darüber hinaus ist die Standardauffüllung unterschiedlich und
MCRYPT_RIJNDAEL
unterstützt nur nicht standardmäßige Nullauffüllungen. @zaphZusätzliche Hinweise (aus den Kommentaren von @ zaph):
MCRYPT_RIJNDAEL_128
) ist äquivalent zu AES , jedoch Rijndael 256 (MCRYPT_RIJNDAEL_256
) wird nicht AES-256 als 256 eine Blockgröße von 256-Bit gibt an , während AES nur eine Blockgröße hat: 128-Bit. Im Grunde genommen wurde Rijndael mit einer Blockgröße von 256 Bit (MCRYPT_RIJNDAEL_256
) aufgrund der Auswahl durch die mcrypt- Entwickler fälschlicherweise benannt . @zaphDie Verschlüsselung mit unterschiedlichen Blockgrößen für Rijndael erzeugt unterschiedliche verschlüsselte Daten.
Beispielsweise definiert
MCRYPT_RIJNDAEL_256
(nicht äquivalent zuAES-256
) eine andere Variante der Rijndael-Blockverschlüsselung mit einer Größe von 256 Bit und eine Schlüsselgröße basierend auf dem übergebenen Schlüssel, wobeiaes-256-cbc
Rijndael eine Blockgröße von 128 Bit mit einer Schlüsselgröße von ist 256 Bit. Daher verwenden sie unterschiedliche Blockgrößen, wodurch völlig unterschiedliche verschlüsselte Daten erzeugt werden, da mcrypt die Nummer zur Angabe der Blockgröße verwendet, wobei OpenSSL die Nummer zur Angabe der Schlüsselgröße verwendet (AES hat nur eine Blockgröße von 128 Bit). AES ist also im Grunde Rijndael mit einer Blockgröße von 128 Bit und Schlüsselgrößen von 128, 192 und 256 Bit. Daher ist es besser, AES zu verwenden, das in OpenSSL Rijndael 128 heißt.quelle
$session_id = rtrim($decryptedSessionId, "\0");
? Ist es möglichopenssl_decrypt
, am Ende einige unerwünschte Zeichen zurückzugeben? Was ist, wenn die verschlüsselte Variable mit 0 endet (dhencrypt("abc0")
?"\0"
ist"0"
nur das NULL-Zeichen, dessen ASCII-Code 0x00 (hexadezimal 0) ist.Die reine PHP-Implementierung von Rijndael existiert mit phpseclib als Composer-Paket und funktioniert unter PHP 7.3 (von mir getestet).
In den phpseclib-Dokumenten befindet sich eine Seite, auf der nach Eingabe der grundlegenden Variablen (Verschlüsselung, Modus, Schlüsselgröße, Bitgröße) Beispielcode generiert wird . Für Rijndael, EZB, 256, 256 wird Folgendes ausgegeben:
ein Code mit mycrypt
funktioniert so mit der Bibliothek
*
$term
warbase64_decoded
quelle
Wie in anderen Antworten hier beschrieben, ist die beste Lösung, die ich gefunden habe, die Verwendung von OpenSSL. Es ist in PHP integriert und Sie benötigen keine externe Bibliothek. Hier sind einfache Beispiele:
So verschlüsseln Sie:
So entschlüsseln Sie:
Referenzlink: https://www.shift8web.ca/2017/04/how-to-encrypt-and-execute-your-php-code-with-mcrypt/
quelle
Sie können das phpseclib pollyfill-Paket verwenden. Sie können open ssl oder libsodium nicht zum Ver- / Entschlüsseln mit rijndael 256 verwenden. Ein weiteres Problem: Sie müssen keinen Code ersetzen.
quelle
mcrypt_compat
durch Laufen installiert ,composer require phpseclib/mcrypt_compat
aber ich bekomme immer nochPHP Fatal error: Uncaught Error: Call to undefined function mcrypt_get_key_size() in /app/kohana/classes/Kohana/Encrypt.php:124
PHP7.2.26
und Kohana Framwork. Müssen nach der Installation mit Composer weitere Schritte ausgeführt werden?require APPPATH . '/vendor/autoload.php';
am Ende von hinzufügenbootstrap.php
.Sie sollten OpenSSL verwenden,
mcrypt
da es aktiv entwickelt und gewartet wird. Es bietet bessere Sicherheit, Wartbarkeit und Portabilität. Zweitens führt es die AES-Ver- / Entschlüsselung viel schneller durch. Standardmäßig wird PKCS7-Padding verwendet, Sie können jedoch angeben,OPENSSL_ZERO_PADDING
ob Sie es benötigen. Zur Verwendung mit einem 32-Byte-Binärschlüssel können Sie angeben,aes-256-cbc
was viel offensichtlicher ist alsMCRYPT_RIJNDAEL_128
.Hier ist das Codebeispiel mit Mcrypt:
Und hier ist die mit OpenSSL geschriebene Version:
Quelle: Wenn Sie das Wort MCRYPT in Ihren PHP-Code eingeben, machen Sie es falsch .
quelle
Ich poste dies sehr spät, aber ich hoffe, es wird jemand anderem helfen, der das gleiche Problem in der PHP 7.2x-Version hat.
Ich benutze dies auf PHP 7.2x, es funktioniert gut für mich.
und authentifizieren Sie dann den Hash mit der folgenden Funktion:
//Beispiel:
Verwenden Sie zur Authentifizierung dieses Hashs den folgenden Code:
Das ist alles
quelle
Wie bereits erwähnt, sollten Sie die Kennwörter Ihrer Benutzer nicht in einem entschlüsselbaren Format speichern. Die reversible Verschlüsselung bietet Hackern eine einfache Möglichkeit, die Kennwörter Ihrer Benutzer herauszufinden. Dies erstreckt sich auch darauf, die Konten Ihrer Benutzer an anderen Standorten zu gefährden, wenn sie dort dasselbe Kennwort verwenden.
PHP bietet zwei leistungsstarke Funktionen für die zufällige Einweg-Hash-Verschlüsselung -
password_hash()
undpassword_verify()
. Da der Hash automatisch zufällig gesalzen wird, können Hacker keine vorkompilierten Tabellen mit Kennwort-Hashes verwenden, um das Kennwort zurückzuentwickeln. Stellen Sie diePASSWORD_DEFAULT
Option ein und zukünftige Versionen von PHP verwenden automatisch stärkere Algorithmen, um Passwort-Hashes zu generieren, ohne dass Sie Ihren Code aktualisieren müssen.quelle
Sie sollten die
openssl_encrypt()
Funktion verwenden.quelle
Ich konnte mein Crypto-Objekt übersetzen
Holen Sie sich eine Kopie von PHP mit mcrypt, um die alten Daten zu entschlüsseln. Ich ging zu http://php.net/get/php-7.1.12.tar.gz/from/a/mirror , kompilierte es und fügte dann die Erweiterung ext / mcrypt hinzu (configure; make; make install). Ich glaube, ich musste der Zeile php.ini auch die Zeile extenstion = mcrypt.so hinzufügen. Eine Reihe von Skripten zum Erstellen von Zwischenversionen der Daten, wobei alle Daten unverschlüsselt sind.
Erstellen Sie einen öffentlichen und einen privaten Schlüssel für openssl
Verwenden Sie zum Verschlüsseln (mit öffentlichem Schlüssel) openssl_seal. Nach dem, was ich gelesen habe, ist openssl_encrypt mit einem RSA-Schlüssel auf 11 Byte weniger als die Schlüssellänge begrenzt (siehe http://php.net/manual/en/function.openssl-public-encrypt.php Kommentar von Thomas Horsten).
Sie könnten wahrscheinlich die rohe Binärdatei speichern.
Entschlüsseln (mit privatem Schlüssel)
PS Sie können die leere Zeichenfolge ("") nicht verschlüsseln.
PPS Dies ist für eine Kennwortdatenbank, die nicht zur Benutzerüberprüfung dient.
quelle