Ich bin zurzeit Student und studiere PHP. Ich versuche, Daten in PHP einfach zu verschlüsseln / entschlüsseln. Ich habe online recherchiert und einige waren ziemlich verwirrend (zumindest für mich).
Folgendes versuche ich zu tun:
Ich habe eine Tabelle bestehend aus diesen Feldern (Benutzer-ID, F-Name, L-Name, E-Mail, Passwort)
Was ich haben möchte, ist, dass alle Felder verschlüsselt und dann entschlüsselt werden (Ist es möglich, sie zu verwenden? sha256
für die Verschlüsselung / Entschlüsselung zu verwenden, wenn nicht irgendein Verschlüsselungsalgorithmus)?
Eine andere Sache, die ich lernen möchte, ist, wie man eine Einbahnstraße hash(sha256)
kombiniert mit einem guten "Salz" schafft . (Grundsätzlich möchte ich nur eine einfache Implementierung von Verschlüsselung / Entschlüsselung haben, hash(sha256)+salt)
Sir / Ma'am. Ihre Antworten wären eine große Hilfe und würden sehr geschätzt. Vielen Dank ++
quelle
Antworten:
Vorwort
Beginnend mit Ihrer Tabellendefinition:
Hier sind die Änderungen:
Fname
,Lname
undEmail
werden verschlüsselt eine symmetrische Chiffre, bereitgestellt von OpenSSL ,IV
Feld speichert den Initialisierungsvektor für die Verschlüsselung verwendeten . Die Speicheranforderungen hängen von der verwendeten Verschlüsselung und dem verwendeten Modus ab. dazu später mehr.Password
Feld wird mit einem Einweg- Passwort-Hash gehasht.Verschlüsselung
Chiffre und Modus
Die Auswahl der besten Verschlüsselung und des besten Verschlüsselungsmodus geht über den Rahmen dieser Antwort hinaus. Die endgültige Auswahl wirkt sich jedoch auf die Größe des Verschlüsselungsschlüssels und des Initialisierungsvektors aus. Für diesen Beitrag verwenden wir AES-256-CBC mit einer festen Blockgröße von 16 Byte und einer Schlüsselgröße von 16, 24 oder 32 Byte.
Verschlüsselungsschlüssel
Ein guter Verschlüsselungsschlüssel ist ein binärer Blob, der von einem zuverlässigen Zufallszahlengenerator generiert wird. Das folgende Beispiel wird empfohlen (> = 5,3):
Dies kann ein- oder mehrmals erfolgen (wenn Sie eine Kette von Verschlüsselungsschlüsseln erstellen möchten). Halten Sie diese so privat wie möglich.
IV
Der Initialisierungsvektor fügt der Verschlüsselung Zufälligkeit hinzu und ist für den CBC-Modus erforderlich. Diese Werte sollten idealerweise nur einmal verwendet werden (technisch einmal pro Verschlüsselungsschlüssel), daher sollte eine Aktualisierung eines beliebigen Teils einer Zeile diese neu generieren.
Eine Funktion hilft Ihnen beim Generieren der IV:
Beispiel
Verschlüsseln wir das Namensfeld mit dem früheren
$encryption_key
und$iv
; Dazu müssen wir unsere Daten auf die Blockgröße auffüllen:Lagerungssansprüche
Die verschlüsselte Ausgabe ist wie die IV binär; Das Speichern dieser Werte in einer Datenbank kann unter Verwendung bestimmter Spaltentypen wie
BINARY
oder erfolgenVARBINARY
.Der Ausgabewert ist wie der IV binär; Um diese Werte in MySQL zu speichern, sollten Sie
BINARY
oderVARBINARY
Spalten verwenden. Wenn dies keine Option ist, können Sie die Binärdaten auch mitbase64_encode()
oder in eine Textdarstellung konvertieren. Diesbin2hex()
erfordert zwischen 33% und 100% mehr Speicherplatz.Entschlüsselung
Die Entschlüsselung der gespeicherten Werte ist ähnlich:
Authentifizierte Verschlüsselung
Sie können die Integrität des generierten Chiffretextes weiter verbessern, indem Sie eine Signatur anhängen, die aus einem geheimen Schlüssel (der sich vom Verschlüsselungsschlüssel unterscheidet) und dem Chiffretext generiert wird. Bevor der Chiffretext entschlüsselt wird, wird zuerst die Signatur überprüft (vorzugsweise mit einer zeitkonstanten Vergleichsmethode).
Beispiel
Siehe auch:
hash_equals()
Hashing
Das Speichern eines umkehrbaren Passworts in Ihrer Datenbank muss so weit wie möglich vermieden werden. Sie möchten nur das Passwort überprüfen, anstatt dessen Inhalt zu kennen. Wenn ein Benutzer sein Passwort verliert, ist es besser, ihm das Zurücksetzen zu erlauben, als ihm sein ursprüngliches Passwort zu senden (stellen Sie sicher, dass das Zurücksetzen des Passworts nur für eine begrenzte Zeit möglich ist).
Das Anwenden einer Hash-Funktion ist eine Einwegoperation. Danach kann es sicher zur Überprüfung verwendet werden, ohne die Originaldaten preiszugeben. Für Passwörter ist eine Brute-Force-Methode aufgrund ihrer relativ kurzen Länge und der schlechten Passwortauswahl vieler Menschen ein praktikabler Ansatz, um sie aufzudecken.
Hashing-Algorithmen wie MD5 oder SHA1 wurden erstellt, um den Dateiinhalt anhand eines bekannten Hashwerts zu überprüfen. Sie sind stark optimiert, um diese Überprüfung so schnell wie möglich und dennoch genau durchzuführen. Aufgrund ihres relativ begrenzten Ausgabebereichs war es einfach, eine Datenbank mit bekannten Passwörtern und ihren jeweiligen Hash-Ausgaben, den Regenbogentabellen, zu erstellen.
Das Hinzufügen eines Salt zum Kennwort vor dem Hashing würde eine Regenbogentabelle unbrauchbar machen, aber die jüngsten Hardware-Fortschritte machten Brute-Force-Lookups zu einem praktikablen Ansatz. Deshalb benötigen Sie einen Hashing-Algorithmus, der bewusst langsam und einfach nicht zu optimieren ist. Es sollte auch in der Lage sein, die Last für schnellere Hardware zu erhöhen, ohne die Fähigkeit zu beeinträchtigen, vorhandene Kennwort-Hashes zu überprüfen, um sie zukunftssicher zu machen.
Derzeit stehen zwei beliebte Optionen zur Verfügung:
Diese Antwort verwendet ein Beispiel mit bcrypt.
Generation
Ein Passwort-Hash kann folgendermaßen generiert werden:
Das Salz wird mit erzeugt
openssl_random_pseudo_bytes()
, um einen zufälligen Datenklumpen zu bilden, der dann durchlaufen wirdbase64_encode()
undstrtr()
mit dem erforderlichen Alphabet von übereinstimmt[A-Za-z0-9/.]
.Die
crypt()
Funktion führt das Hashing basierend auf dem Algorithmus durch ($2y$
für Blowfish), dem Kostenfaktor (ein Faktor von 13 dauert auf einer 3-GHz-Maschine ungefähr 0,40 Sekunden) und dem Salz von 22 Zeichen durch.Validierung
Nachdem Sie die Zeile mit den Benutzerinformationen abgerufen haben, überprüfen Sie das Kennwort auf folgende Weise:
Um ein Passwort zu überprüfen, rufen Sie
crypt()
erneut an, übergeben jedoch den zuvor berechneten Hash als Salt-Wert. Der Rückgabewert ergibt den gleichen Hash, wenn das angegebene Passwort mit dem Hash übereinstimmt. Um den Hash zu überprüfen, wird häufig empfohlen, eine Vergleichsfunktion mit konstanter Zeit zu verwenden, um Timing-Angriffe zu vermeiden.Passwort-Hashing mit PHP 5.5
PHP 5.5 führte die Passwort-Hashing-Funktionen ein , mit denen Sie die oben beschriebene Hashing-Methode vereinfachen können:
Und überprüfen:
Siehe auch :
password_hash()
,password_verify()
quelle
$iv_size = 16;
würde ich verwenden:$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length("AES-256-CBC"))
um die Verbindung zwischen der Größe von iv anzugeben, die mit der verwendeten Chiffre verwendet werden soll. Sie können auch die Notwendigkeit (oder nicht) vonpkcs7_pad()
/pkcs7_unpad()
etwas erweitern oder einfach den Beitrag vereinfachen, indem Sie sie entfernen und "aes-256-ctr" verwenden. Großartiger Beitrag @ Ja͢ckIch denke, dies wurde schon einmal beantwortet ... aber wenn Sie Daten verschlüsseln / entschlüsseln möchten, können Sie SHA256 nicht verwenden
quelle
Antwort Hintergrund und Erklärung
Um diese Frage zu verstehen, müssen Sie zuerst verstehen, was SHA256 ist. SHA256 ist eine kryptografische Hash-Funktion . Eine kryptografische Hash-Funktion ist eine Einwegfunktion, deren Ausgabe kryptografisch sicher ist. Dies bedeutet, dass es einfach ist, einen Hash zu berechnen (entspricht dem Verschlüsseln von Daten), aber es ist schwierig, die ursprüngliche Eingabe mithilfe des Hash zu erhalten (entspricht dem Entschlüsseln der Daten). Da die Verwendung einer kryptografischen Hash-Funktion bedeutet, dass das Entschlüsseln rechnerisch nicht möglich ist, können Sie mit SHA256 keine Entschlüsselung durchführen.
Was Sie verwenden möchten, ist eine Zwei-Wege-Funktion, genauer gesagt eine Block-Verschlüsselung . Eine Funktion, die sowohl die Ver- als auch die Entschlüsselung von Daten ermöglicht. Die Funktionen
mcrypt_encrypt
undmcrypt_decrypt
standardmäßig verwenden den Blowfish-Algorithmus. Die Verwendung von mcrypt durch PHP finden Sie in diesem Handbuch . Es gibt auch eine Liste von Verschlüsselungsdefinitionen zur Auswahl der Verschlüsselung, die mcrypt verwendet. Ein Wiki zu Blowfish finden Sie bei Wikipedia . Eine Blockverschlüsselung verschlüsselt die Eingabe in Blöcken bekannter Größe und Position mit einem bekannten Schlüssel, damit die Daten später mit dem Schlüssel entschlüsselt werden können. Dies kann SHA256 Ihnen nicht bieten.Code
quelle
Hier ist ein Beispiel mit openssl_encrypt
quelle
mcrypt_create_iv()
würde ich verwenden :openssl_random_pseudo_bytes(openssl_cipher_iv_length($encryptionMethod))
, auf diese Weise funktioniert die Methodik für jeden Wert von $ encryptionMethod und würde nur die openssl-Erweiterung verwenden.false
für zurückopenssl_decrypt()
. Siehe stackoverflow.com/q/41952509/1066234 Da für Blockchiffren wie AES Eingabedaten erforderlich sind, muss ein genaues Vielfaches der Blockgröße (16 Byte für AES) aufgefüllt werden.quelle
Es hat eine ganze Weile gedauert, bis ich herausgefunden hatte, wie ich
false
bei der Verwendung keine bekommenopenssl_decrypt()
und verschlüsseln und entschlüsseln kann.Wenn Sie die verschlüsselte Zeichenfolge über eine URL übergeben möchten, müssen Sie die Zeichenfolge mit einem Urlencode versehen:
Um besser zu verstehen, was los ist, lesen Sie:
Um 16 Byte lange Schlüssel zu generieren, können Sie Folgendes verwenden:
Um Fehlermeldungen von openssl anzuzeigen, können Sie Folgendes verwenden:
echo openssl_error_string();
Hoffentlich hilft das.
quelle