Was ich meine ist:
Original String + Salt or Key --> Encrypted String
Encrypted String + Salt or Key --> Decrypted (Original String)
Vielleicht so etwas wie:
"hello world!" + "ABCD1234" --> Encrypt --> "2a2ffa8f13220befbe30819047e23b2c" (may be, for e.g)
"2a2ffa8f13220befbe30819047e23b2c" --> Decrypt with "ABCD1234" --> "hello world!"
- Wie können Sie dies in PHP tun?
Versucht zu verwenden Crypt_Blowfish
, aber es hat bei mir nicht funktioniert.
Antworten:
Bevor Sie weitere Schritte ausführen, sollten Sie den Unterschied zwischen Verschlüsselung und Authentifizierung verstehen und wissen , warum Sie wahrscheinlich eine authentifizierte Verschlüsselung und nicht nur eine Verschlüsselung wünschen .
Um eine authentifizierte Verschlüsselung zu implementieren, möchten Sie dann MAC verschlüsseln. Die Reihenfolge der Verschlüsselung und Authentifizierung ist sehr wichtig! Eine der vorhandenen Antworten auf diese Frage machte diesen Fehler; ebenso wie viele in PHP geschriebene Kryptographie-Bibliotheken.
Sie sollten die Implementierung Ihrer eigenen Kryptografie vermeiden und stattdessen eine sichere Bibliothek verwenden, die von Kryptografieexperten geschrieben und überprüft wurde.
Verwenden Sie libsodium, wenn Sie PECL-Zugriff haben (oder natrium_compat, wenn Sie libsodium ohne PECL möchten). sonst ...
Verwenden Sie Defuse / PHP-Verschlüsselung ; Rollen Sie nicht Ihre eigene Kryptographie!
Beide oben verlinkten Bibliotheken machen es einfach und problemlos, authentifizierte Verschlüsselung in Ihren eigenen Bibliotheken zu implementieren.
Wenn Sie dennoch Ihre eigene Kryptografiebibliothek schreiben und bereitstellen möchten, müssen Sie diese Schritte unternehmen, die der herkömmlichen Weisheit jedes Kryptografieexperten im Internet widersprechen.
Verschlüsselung:
Entschlüsselung:
hash_equals()
. Wenn dies fehlschlägt, brechen Sie den Vorgang ab.Weitere Überlegungen zum Design:
mb_strlen()
undmb_substr()
den'8bit'
Zeichensatzmodus verwenden, ummbstring.func_overload
Probleme zu vermeiden .mcrypt_create_iv()
, NICHT VERWENDENMCRYPT_RAND
!bin2hex()
,base64_encode()
usw. können Informationen über Ihre Verschlüsselungsschlüssel über das Cache-Timing verlieren. Vermeiden Sie sie wenn möglich.Selbst wenn Sie den hier gegebenen Ratschlägen folgen, kann bei der Kryptografie viel schief gehen. Lassen Sie Ihre Implementierung immer von einem Kryptografieexperten überprüfen. Wenn Sie nicht das Glück haben, mit einem Kryptografiestudenten an Ihrer örtlichen Universität persönlich befreundet zu sein, können Sie sich jederzeit im Cryptography Stack Exchange- Forum beraten lassen.
Wenn Sie eine professionelle Analyse Ihrer Implementierung benötigen, können Sie jederzeit ein seriöses Team von Sicherheitsberatern beauftragen, um Ihren PHP-Kryptografiecode zu überprüfen (Offenlegung: mein Arbeitgeber).
Wichtig: Wann keine Verschlüsselung verwendet werden soll
Kennwörter nicht verschlüsseln . Sie wollen Hash sie stattdessen eine dieser Passwort-HashingAlgorithmen:
Verwenden Sie niemals eine universelle Hash-Funktion (MD5, SHA256) zur Kennwortspeicherung.
Verschlüsseln Sie keine URL-Parameter . Es ist das falsche Werkzeug für den Job.
Beispiel für die Verschlüsselung von PHP-Zeichenfolgen mit Libsodium
Wenn Sie PHP <7.2 verwenden oder auf andere Weise libsodium nicht installiert haben, können Sie Natrium_Kompat verwenden , um dasselbe Ergebnis zu erzielen (wenn auch langsamer).
Dann um es auszuprobieren:
Halit - Libsodium leichter gemacht
Eines der Projekte, an denen ich gearbeitet habe, ist eine Verschlüsselungsbibliothek namens Halite , die darauf abzielt, libsodium einfacher und intuitiver zu machen.
Die gesamte zugrunde liegende Kryptographie wird von libsodium verwaltet.
Beispiel mit Defuse / PHP-Verschlüsselung
Hinweis :
Crypto::encrypt()
Gibt eine hexadezimal codierte Ausgabe zurück.Verwaltung von Verschlüsselungsschlüsseln
Wenn Sie versucht sind, ein "Passwort" zu verwenden, hören Sie sofort auf. Sie benötigen einen zufälligen 128-Bit-Verschlüsselungsschlüssel, kein menschliches, einprägsames Passwort.
Sie können einen Verschlüsselungsschlüssel für die langfristige Verwendung wie folgt speichern:
Und auf Anfrage können Sie es wie folgt abrufen:
Ich empfehle dringend , nur einen zufällig generierten Schlüssel für die langfristige Verwendung anstelle eines Kennworts als Schlüssel zu speichern (oder den Schlüssel abzuleiten).
Wenn Sie die Bibliothek von Defuse verwenden:
$string = $keyObject->saveToAsciiSafeString()
$loaded = Key::loadFromAsciiSafeString($string);
"Aber ich möchte wirklich ein Passwort verwenden."
Das ist eine schlechte Idee, aber okay, so geht's sicher.
Generieren Sie zunächst einen zufälligen Schlüssel und speichern Sie ihn in einer Konstanten.
Beachten Sie, dass Sie zusätzliche Arbeit hinzufügen und diese Konstante einfach als Schlüssel verwenden können, um sich viel Herzschmerz zu ersparen!
Verwenden Sie dann PBKDF2 (wie folgt), um einen geeigneten Verschlüsselungsschlüssel aus Ihrem Passwort abzuleiten, anstatt direkt mit Ihrem Passwort zu verschlüsseln.
Verwenden Sie nicht nur ein 16-stelliges Passwort. Ihr Verschlüsselungsschlüssel wird komisch kaputt gehen.
quelle
password_hash()
und überprüfen Sie sie mitpassword_verify()
.function getKeyFromPassword($password, $keysize = \Sodium\CRYPTO_SECRETBOX_KEYBYTES)
Ich bin zu spät zur Party gekommen, aber auf der Suche nach dem richtigen Weg bin ich auf diese Seite gestoßen. Sie war eine der Top-Suchanfragen bei der Google-Suche. Daher möchte ich meine Meinung zu dem Problem mitteilen, das ich für wichtig halte zum Zeitpunkt des Schreibens dieses Beitrags (Anfang 2017) auf dem neuesten Stand. Ab PHP 7.1.0 wird das
mcrypt_decrypt
undmcrypt_encrypt
veraltet sein, daher sollte beim Erstellen eines zukunftssicheren Codes openssl_encrypt und openssl_decrypt verwendet werdenSie können so etwas tun wie:
Abhängig von Ihren Sicherheitsanforderungen können Sie auch andere Häckslermethoden verwenden. Informationen zu den verfügbaren Chipper-Methoden finden Sie in der Funktion openssl_get_cipher_methods .
quelle
prod_id=123
aber ich möchte 123 nicht für alle lesbar machen, aber selbst wenn sie ihn lesen könnten, wird es kein Problem sein. Ein Angreifer, der in der Lage ist, die 123 durch einen benutzerdefinierten Wert zu ersetzen, verursacht keinen Schaden. Er kann nur Details zu anderen Produkten abrufen, aber Joe Average User hat keine Ahnung, wie er Details abrufen kann Produkt 124 zum Beispiel. Für ein Szenario wie dieses ist es eine perfekte Lösung, für die Sicherheit ist es ein No Go!Was nicht zu tun
Ich habe es auf mich genommen. Eigentlich habe ich auf Google eine Antwort gefunden und einfach etwas geändert. Das Ergebnis ist jedoch völlig unsicher.
quelle
base64_encode(encrypt($string))
decrypt(base64_decode($encrypted))
mcrypt_encrypt
ersetzt habe: php.net/manual/en/function.mcrypt-encrypt.php . Beachten Sie, dass beim Überprüfen jetzt wahrscheinlich einrtrim
for-Zeichen"\0"
am Ende stehen sollte.Für Laravel Framework
Wenn Sie das Laravel-Framework verwenden, ist das Ver- und Entschlüsseln mit internen Funktionen einfacher.
quelle
Aktualisiert
PHP 7-fähige Version. Es verwendet die Funktion openssl_encrypt aus der PHP OpenSSL Library .
quelle
Ich habe diese Antwort aus historischen Gründen hinterlassen - aber einige der Methoden sind jetzt veraltet, die DES-Verschlüsselungsmethode wird nicht empfohlen usw.
Ich habe diesen Code aus zwei Gründen nicht aktualisiert: 1) Ich arbeite nicht mehr mit manuellen Verschlüsselungsmethoden in PHP, und 2) dieser Code erfüllt immer noch den Zweck, für den er bestimmt war: das minimale, vereinfachte Konzept zu demonstrieren, wie Verschlüsselung funktionieren kann in PHP.
Wenn Sie eine ähnlich vereinfachte Quelle für "PHP-Verschlüsselung für Dummies" finden, mit der Benutzer mit 10 bis 20 Codezeilen oder weniger beginnen können, lassen Sie es mich in den Kommentaren wissen.
Darüber hinaus genießen Sie bitte diese klassische Episode der minimalistischen PHP4-Verschlüsselungsantwort der frühen Ära.
Idealerweise haben oder können Sie Zugriff auf die mcrypt PHP-Bibliothek erhalten, da diese sicherlich beliebt und für eine Vielzahl von Aufgaben sehr nützlich ist. Hier finden Sie eine Übersicht über die verschiedenen Arten der Verschlüsselung und einige Beispielcodes: Verschlüsselungstechniken in PHP
Einige Warnungen:
1) Verwenden Sie niemals eine reversible oder "symmetrische" Verschlüsselung, wenn ein Einweg-Hash ausreicht.
2) Wenn die Daten wirklich sensibel sind, wie Kreditkarten- oder Sozialversicherungsnummern, hören Sie auf; Sie benötigen mehr als jeder einfache Codeabschnitt, sondern eine Kryptobibliothek, die für diesen Zweck entwickelt wurde, und viel Zeit, um die erforderlichen Methoden zu erforschen. Darüber hinaus ist die Software-Krypto wahrscheinlich <10% der Sicherheit sensibler Daten. Es ist, als würde man ein Kernkraftwerk neu verkabeln - akzeptieren Sie, dass die Aufgabe gefährlich und schwierig ist und dass Sie dies nicht wissen, wenn dies der Fall ist. Die finanziellen Sanktionen können immens sein, daher ist es besser, einen Dienst zu nutzen und die Verantwortung an sie zu senden.
3) Jede Art von leicht implementierbarer Verschlüsselung, wie hier aufgeführt, kann leicht wichtige Informationen, die Sie vor neugierigen Blicken schützen möchten, angemessen schützen oder die Exposition bei versehentlichem / absichtlichem Auslaufen begrenzen. Da der Schlüssel jedoch im Klartext auf dem Webserver gespeichert ist, können sie den Entschlüsselungsschlüssel erhalten, wenn sie die Daten abrufen können.
Wie auch immer, viel Spaß :)
quelle
M�������f=�_=
seltsame Zeichen als das verschlüsselte. Kann ich keine einfachen Charaktere bekommen? Wie :2a2ffa8f13220befbe30819047e23b2c
. Kann ich die LÄNGE von$key_value
(fest auf 8 ???) und die LÄNGE der Ausgabe nicht ändern$encrypted_text
? (Kann es nicht 32 oder 64 lang sein oder was auch immer länger?)MCRYPT_RIJNDAEL_128
und Chiffretexte authentifiziert werden sollten (hash_hmac()
, überprüft werden) mithash_equals()
).Wenn Sie keine Bibliothek verwenden möchten (was Sie sollten), verwenden Sie Folgendes (PHP 7):
quelle
define("ENCRYPTION_KEY", "123456*"); $string = "This is the original data string!"; $encrypted = openssl_encrypt($string, 'BF-ECB', ENCRYPTION_KEY); $decrypted = openssl_decrypt($encrypted,'BF-ECB',ENCRYPTION_KEY);
Dies sind kompakte Methoden zum Ver- und Entschlüsseln von Zeichenfolgen mit PHP mithilfe von AES256 CBC :
Verwendung:
quelle
Der folgende Code funktioniert in PHP für alle Zeichenfolgen mit Sonderzeichen
quelle