Wie verschlüsseln / entschlüsseln Daten in PHP?
Ich bin zurzeit ein student und ich studiere in PHP, den ich versuche zu machen, eine einfache ver - /entschlüsseln von Daten in PHP. Ich habe einige online-Forschung und einige von Ihnen waren ziemlich verwirrend(zumindest für mich).
Hier ist, was ich versuche zu tun:
Ich habe eine Tabelle, die aus diesen Bereichen (Benutzer-id,Fname,Lname,E-Mail,Passwort)
Was ich haben will, haben die alle Felder verschlüsselt und dann wieder entschlüsselt werden(Ist es möglich mit sha256
für die Verschlüsselung/Entschlüsselung, wenn nicht jede Verschlüsselung Algorithmus)
Andere Sache, die ich lernen will ist, wie man eine one-way hash(sha256)
kombiniert mit einem guten "Salz".
(Im Grunde will ich nur eine einfache Umsetzung der Verschlüsselung/Entschlüsselung hash(sha256)+salt)
Sir/Ma bin, Eure Antworten wären eine große Hilfe und wird sehr geschätzt. Danke++
InformationsquelleAutor der Frage Randel Ramirez | 2012-06-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorwort
Beginnend mit dem Tabellen-definition:
Hier sind die änderungen:
Fname
,Lname
undEmail
werden verschlüsselt mit einem symmetrischen Schlüssel, die zur Verfügung gestellt von OpenSSL,IV
Feld speichern der Initialisierungsvektor für die Verschlüsselung verwendet. Die storage-Anforderungen sind abhängig von der Verschlüsselung und-Modus verwendet; mehr dazu später.Password
Feld wird Hash mit einem one-way - Passwort-hash,Verschlüsselung
Cipher-Modus und
Auswahl der besten Verschlüsselungs-cipher-Modus und sprengt den Rahmen dieser Antwort, aber die endgültige Wahl beeinflusst die Größe der sowohl die Verschlüsselung, Schlüssel und Initialisierungsvektor; aus diesem post wir werden mit AES-256-CBC, die eine Feste Blockgröße von 16 bytes und einer Schlüssellänge von entweder 16, 24 oder 32 bytes.
Verschlüsselungsschlüssel
Eine gute Verschlüsselung Schlüssel ist ein binärer blob, erstellt von einem zuverlässigen Zufallszahlengenerator. Das folgende Beispiel wäre zu empfehlen (>= 5.3):
Diese kann getan werden, um einmal oder mehrfach (wenn Sie möchten, erstellen Sie eine Kette von Schlüsseln). Halten Sie diese so privat wie möglich.
IV
Den Initialisierungsvektor ergänzt Zufälligkeit der Verschlüsselung und benötigt für die CBC-Modus. Diese Werte sollten im Idealfall nur einmal verwendet werden (technisch einmal pro encryption key), so dass ein update auf einen beliebigen Teil einer Zeile sollte regenerieren.
Eine Funktion ist bereitgestellt, um Ihnen helfen, generieren die IV:
Beispiel
Let ' s encrypt-der name-Feld, mit dem früheren
$encryption_key
und$iv
; um dies zu tun, müssen wir pad-unsere Daten in die block-Größe:Storage-Anforderungen
Die verschlüsselte Ausgabe, wie die IV, ist Binär, das speichern dieser Werte in einer Datenbank kann erreicht werden, indem die benannten Spalte Typen wie
BINARY
oderVARBINARY
.Den Ausgang Wert, wie die IV, ist binary; zum speichern dieser Werte in MySQL, sollten Sie die Verwendung
BINARY
oderVARBINARY
Spalten. Ist dies nicht eine option, können Sie auch konvertieren Sie die binäre Daten in eine textuelle Darstellung mitbase64_encode()
oderbin2hex()
, dies erfordert, dass zwischen 33% bis 100% mehr Speicherplatz.Entschlüsselung
Entschlüsselung der gespeicherten Werte ist ähnlich:
Authentifizierte Verschlüsselung
Können Sie weitere Verbesserung der Integrität der erzeugten verschlüsselten text durch Anhängen einer Signatur, erzeugt aus einem geheimen Schlüssel (unterscheidet sich von der encryption key) und der cipher text. Vor dem verschlüsselten text entschlüsselt, die Signatur wird zunächst überprüft (am besten mit einem konstant-Zeit-Vergleich-Methode).
Beispiel
Siehe auch:
hash_equals()
Hashing
Speichern eine reversible Passwort in der Datenbank muss so weit wie möglich vermieden werden; Sie wollen nur überprüfen Sie das Kennwort, eher als zu wissen, seinen Inhalt. Wenn ein Benutzer verliert Ihr Passwort, ist es besser, Ihnen zu erlauben, setzen Sie es vielmehr als das senden Sie Ihr original ein (stellen Sie sicher, dass der Passwort-reset kann nur durchgeführt werden, für eine begrenzte Zeit).
Anwenden einer hash-Funktion ist eine one-way-operation; danach kann es sicher verwendet werden, die für die überprüfung grundsätzlich ohne Offenlegung der ursprünglichen Daten; für Kennworte, ein brute-force-Methode ist ein möglicher Ansatz, um aufzudecken, die es aufgrund seiner relativ kurzen Länge und Armen Kennwort Entscheidungen vieler Menschen.
Hashing algorithmen wie MD5 oder SHA1 vorgenommen wurden, überprüfen Sie den Inhalt der Datei mit einem bekannten hash-Wert. Sie sind stark optimiert, um diese überprüfung so schnell wie möglich, während immer noch genau sind. Angesichts Ihrer relativ begrenzten output-Raum, war es einfach, bauen Sie eine Datenbank mit bekannten Passwörtern und Ihren jeweiligen hash-Ausgänge, die rainbow-Tabellen.
Hinzufügen von Salz, um das Passwort vor dem Hashen machen würde eine rainbow-table-nutzlos, aber neuere hardware Fortschritte gemacht, brute-force-lookups ein brauchbarer Ansatz. Deshalb brauchen Sie einen hashing-Algorithmus, die bewusst langsam und einfach unmöglich zu optimieren. Es sollte auch in der Lage sein, um die Last zu erhöhen, die für schnellere hardware, ohne die Möglichkeit zu überprüfen, bestehende Passwort-hashes zu machen es zukunftssicher.
Derzeit gibt es zwei beliebte Möglichkeiten zur Verfügung:
Diese Antwort wird ein Beispiel mit bcrypt.
Generation
Einen Passwort-hash erzeugt werden kann, wie diese:
Den salt generiert wird, mit
openssl_random_pseudo_bytes()
, um die form eines random-blob von Daten, welche dann durchbase64_encode()
undstrtr()
angepasst alphabet[A-Za-z0-9/.]
.Den
crypt()
Funktion führt die hashing basiert auf dem Algorithmus ($2y$
für Blowfish), die Kosten-Faktor (Faktor 13 dauert etwa 0.40 s auf einer 3GHz-Maschine) und das Salz von 22 Zeichen.Validierung
Sobald Sie abgerufen haben, die Zeile, in der der Benutzer Informationen, überprüfen Sie das Kennwort in dieser Art und Weise:
Überprüfen Sie ein Kennwort, rufen Sie
crypt()
wieder, aber Sie pass des zuvor berechneten hash, als der salt-Wert. Der Rückgabewert ergibt den gleichen hash, wenn das angegebene Passwort passt der hash. Zum überprüfen des hash, ist es oft empfehlenswert, eine konstant-Zeit-Vergleich-Funktion zu vermeiden-timing-Angriffe schützt.Passwort-hashing mit PHP 5.5
PHP 5.5 eingeführt, die Passwort-hashing-Funktionen, die Sie verwenden können, um die Vereinfachung der oben genannten Methode hashing:
Überprüfen und sicherstellen:
Siehe auch:
password_hash()
,password_verify()
InformationsquelleAutor der Antwort Ja͢ck
Ich bin der Meinung dies wurde beantwortet vor...aber trotzdem, wenn Sie möchten, zu verschlüsseln/entschlüsseln von Daten, die Sie nicht verwenden können, SHA256
InformationsquelleAutor der Antwort romo
Antwort Hintergrund und Erklärung
, Diese Frage zu verstehen, müssen Sie zuerst verstehen, was SHA256 ist. SHA256 ist eine Kryptographische Hash-Funktion. Eine Kryptographische Hash-Funktion ist eine one-way-Funktion, deren Ausgabe ist kryptographisch sicher. Dies bedeutet, es ist leicht zu berechnen ist ein hash (äquivalent zur Verschlüsselung von Daten), aber schwer zu bekommen die original-Eingabe mit der Raute (äquivalent zum entschlüsseln der Daten). Da unter Verwendung einer Kryptographischen hash-Funktion entschlüsseln ist rechnerisch unmöglich, deshalb können Sie nicht führen Sie die Entschlüsselung mit SHA256.
Was Sie verwenden möchten, ist ein zwei-Wege-Funktion, sondern eher speziell, ein Block Cipher. Eine Funktion, die es ermöglicht sowohl die Verschlüsselung und Entschlüsselung von Daten. Die Funktionen
mcrypt_encrypt
undmcrypt_decrypt
standardmäßig verwendet den Blowfish-Algorithmus. PHP ist die Verwendung von mcrypt kann man in diesem Handbuch. Eine Liste der Chiffre Definitionen wählen Sie die Chiffre-mcrypt verwendet besteht auch. Ein wiki von Blowfish finden Sie unter Wikipedia. Eine Blockchiffre verschlüsselt die Eingabe in Blöcke der bekannten Größe und die position mit einem bekannten Schlüssel, so dass die Daten können später entschlüsselt werden, die mit dem Schlüssel. Dies ist, was SHA256 nicht Ihnen zur Verfügung stellen.Code
InformationsquelleAutor der Antwort cytinus
Hier ist ein Beispiel mit openssl_encrypt
InformationsquelleAutor der Antwort Vivek
Es dauerte eine ganze Weile, um herauszufinden, wie Sie sich nicht eine
false
bei der Verwendungopenssl_decrypt()
und bekommen ver-und entschlüsseln funktioniert.Wenn Sie übergeben möchten, die verschlüsselte Zeichenfolge über eine URL, die Sie benötigen, um die Zeichenfolge urlencode:
Besser zu verstehen, was Los ist, Lesen:
Generieren, die 16 Byte lange Schlüssel, die Sie verwenden können:
Sehen Fehlermeldungen von openssl, die Sie verwenden können:
echo openssl_error_string();
Hoffe, das hilft.
InformationsquelleAutor der Antwort Kai Noack
InformationsquelleAutor der Antwort gaurav daxini