Was ist die einfachste Methode zur bidirektionalen Verschlüsselung in gängigen PHP-Installationen?
Ich muss in der Lage sein, Daten mit einem Zeichenfolgenschlüssel zu verschlüsseln und am anderen Ende denselben Schlüssel zum Entschlüsseln zu verwenden.
Die Sicherheit ist nicht so wichtig wie die Portabilität des Codes, daher möchte ich die Dinge so einfach wie möglich halten können. Derzeit verwende ich eine RC4-Implementierung, aber wenn ich etwas finde, das von Haus aus unterstützt wird, kann ich wahrscheinlich viel unnötigen Code speichern.
php
security
encryption
cryptography
encryption-symmetric
user1206970
quelle
quelle
Sodium::crypto_secretbox()
undSodium::crypto_secretbox_open()
sind sicher und performant.Antworten:
Bearbeitet:
Sie sollten wirklich openssl_encrypt () & openssl_decrypt () verwenden
Wie Scott sagt, ist Mcrypt keine gute Idee, da es seit 2007 nicht aktualisiert wurde.
Es gibt sogar einen RFC, um Mcrypt aus PHP zu entfernen - https://wiki.php.net/rfc/mcrypt-viking-funeral
quelle
Wichtig : Wenn Sie einen haben sehr speziellen Anwendungsfall, nicht verschlüsseln Passwörter , verwenden Sie stattdessen ein Kennwort - Hashing - Algorithmus. Wenn jemand sagt, dass er seine Passwörter in einer serverseitigen Anwendung verschlüsselt , ist er entweder nicht informiert oder beschreibt ein gefährliches Systemdesign. Das sichere Speichern von Passwörtern ist ein völlig anderes Problem als die Verschlüsselung.
Informiert werden. Entwerfen Sie sichere Systeme.
Portable Datenverschlüsselung in PHP
Wenn Sie PHP 5.4 oder neuer verwenden und kein Kryptografiemodul selbst schreiben möchten, empfehle ich die Verwendung einer vorhandenen Bibliothek, die authentifizierte Verschlüsselung bietet . Die Bibliothek, die ich verlinkt habe, basiert nur auf dem, was PHP bietet, und wird regelmäßig von einer Handvoll Sicherheitsforschern überprüft. (Mich eingenommen.)
Wenn Ihre Portabilität Ziele nicht verhindern PECL - Erweiterungen erfordern, libsodium ist hoch über alles , was Sie empfohlen oder ich kann in PHP schreiben.
Update (12.06.2016): Sie können jetzt Natrium_Kompat verwenden und dieselben Crypto Libsodium-Angebote verwenden, ohne PECL-Erweiterungen zu installieren.
Wenn Sie sich in der Kryptografietechnik versuchen möchten, lesen Sie weiter.
Zunächst sollten Sie sich die Zeit nehmen, um die Gefahren einer nicht authentifizierten Verschlüsselung und das Cryptographic Doom-Prinzip kennenzulernen .
Verschlüsselung und Entschlüsselung
Die Verschlüsselung in PHP ist eigentlich einfach (wir werden sie verwenden
openssl_encrypt()
undopenssl_decrypt()
sobald Sie einige Entscheidungen zur Verschlüsselung Ihrer Informationen getroffen haben.openssl_get_cipher_methods()
Eine Liste der auf Ihrem System unterstützten Methoden finden Sie hier. Die beste Wahl ist AES im CTR-Modus :aes-128-ctr
aes-192-ctr
aes-256-ctr
Derzeit gibt es keinen Grund zu der Annahme, dass die Größe des AES-Schlüssels ein wichtiges Problem darstellt (größer ist wahrscheinlich nicht besser, da die Schlüsselplanung im 256-Bit-Modus schlecht ist).
Hinweis: Wir verwenden es nicht,
mcrypt
da es sich um Abbruchware handelt und nicht gepatchte Fehler aufweist , die möglicherweise die Sicherheit beeinträchtigen. Aus diesen Gründen ermutige ich andere PHP-Entwickler, dies ebenfalls zu vermeiden.Einfacher Verschlüsselungs- / Entschlüsselungs-Wrapper mit OpenSSL
Anwendungsbeispiel
Demo : https://3v4l.org/jl7qR
Die obige einfache Kryptobibliothek ist immer noch nicht sicher zu verwenden. Wir müssen Chiffretexte authentifizieren und überprüfen, bevor wir entschlüsseln .
Hinweis : Standardmäßig
UnsafeCrypto::encrypt()
wird eine rohe Binärzeichenfolge zurückgegeben. Nennen Sie es so, wenn Sie es in einem binärsicheren Format (base64-codiert) speichern müssen:Demo : http://3v4l.org/f5K93
Einfacher Authentifizierungs-Wrapper
Anwendungsbeispiel
Demos : Raw Binary , Base64-codiert
Wenn jemand diese
SaferCrypto
Bibliothek in einer Produktionsumgebung oder in Ihrer eigenen Implementierung derselben Konzepte verwenden möchte, empfehle ich dringend, sich vor Ihnen an Ihre ansässigen Kryptographen zu wenden, um eine zweite Meinung einzuholen. Sie können Ihnen von Fehlern erzählen, die mir vielleicht gar nicht bewusst sind.Mit einer seriösen Kryptografie-Bibliothek sind Sie viel besser dran .
quelle
Verwenden Sie
mcrypt_encrypt()
undmcrypt_decrypt()
mit entsprechenden Parametern. Wirklich einfach und unkompliziert, und Sie verwenden ein kampferprobtes Verschlüsselungspaket.BEARBEITEN
5 Jahre und 4 Monate nach dieser Antwort wird die
mcrypt
Erweiterung derzeit abgelehnt und schließlich aus PHP entfernt.quelle
PHP 7.2 wurde vollständig entfernt
Mcrypt
und die Verschlüsselung basiert nun auf der wartbarenLibsodium
Bibliothek.Alle Ihre Verschlüsselungsanforderungen können grundsätzlich über die
Libsodium
Bibliothek gelöst werden .Libsodium-Dokumentation: https://github.com/paragonie/pecl-libsodium-doc
quelle
crypto_sign
API verschlüsselt keine Nachrichten - dies erfordert eine dercrypto_aead_*_encrypt
Funktionen.WICHTIG Diese Antwort gilt nur für PHP 5, verwenden Sie in PHP 7 integrierte kryptografische Funktionen.
Hier ist die Implementierung einfach, aber sicher genug:
Code und Beispiele finden Sie hier: https://stackoverflow.com/a/19445173/1387163
quelle