¿Cuál es la forma más sencilla de hacer cifrado bidireccional en instalaciones PHP comunes?
Necesito poder cifrar datos con una clave de cadena y usar la misma clave para descifrar en el otro extremo.
La seguridad no es tan importante como la portabilidad del código, por lo que me gustaría poder mantener las cosas lo más simples posible. Actualmente, estoy usando una implementación RC4, pero si puedo encontrar algo compatible de forma nativa, creo que puedo guardar un montón de código innecesario.
php
security
encryption
cryptography
encryption-symmetric
usuario1206970
fuente
fuente
Sodium::crypto_secretbox()
ySodium::crypto_secretbox_open()
son seguros y efectivos.Respuestas:
Editado:
Realmente deberías estar usando openssl_encrypt () & openssl_decrypt ()
Como dice Scott , Mcrypt no es una buena idea, ya que no se ha actualizado desde 2007.
Incluso hay un RFC para eliminar Mcrypt de PHP - https://wiki.php.net/rfc/mcrypt-viking-funeral
fuente
Importante : a menos que tenga un caso de uso muy particular, no cifre las contraseñas , utilice un algoritmo de hash de contraseña. Cuando alguien dice que cifran sus contraseñas en una aplicación del lado del servidor, no están informados o describen un diseño de sistema peligroso. El almacenamiento seguro de contraseñas es un problema totalmente separado del cifrado.
Ser informado. Diseñar sistemas seguros.
Cifrado de datos portátil en PHP
Si está utilizando PHP 5.4 o más reciente y no desea escribir un módulo de criptografía usted mismo, le recomiendo usar una biblioteca existente que proporcione cifrado autenticado . La biblioteca que vinculé se basa solo en lo que PHP proporciona y está bajo revisión periódica por un puñado de investigadores de seguridad. (Yo incluido)
Si sus objetivos de portabilidad no impiden requerir extensiones PECL, se recomienda encarecidamente libsodium sobre cualquier cosa que usted o yo podamos escribir en PHP.
Actualización (2016-06-12): ahora puede usar sodium_compat y usar las mismas ofertas de crypto libsodium sin instalar extensiones PECL.
Si quieres probar suerte en la ingeniería de criptografía, sigue leyendo.
Primero, debe tomarse el tiempo para aprender los peligros del cifrado no autenticado y el Principio de Doom criptográfico .
Cifrado y descifrado
El cifrado en PHP es realmente simple (lo usaremos
openssl_encrypt()
yopenssl_decrypt()
una vez que haya tomado algunas decisiones sobre cómo cifrar su información. Consulteopenssl_get_cipher_methods()
para obtener una lista de los métodos admitidos en su sistema. La mejor opción es AES en modo CTR :aes-128-ctr
aes-192-ctr
aes-256-ctr
Actualmente no hay ninguna razón para creer que el tamaño de la clave AES es un tema importante por el que preocuparse (más grande probablemente no sea mejor, debido a una mala programación de claves en el modo de 256 bits).
Nota: No estamos utilizando
mcrypt
porque es abandonware y tiene errores sin parches que pueden afectar la seguridad. Por estas razones, animo a otros desarrolladores de PHP a evitarlo también.Contenedor de cifrado / descifrado simple usando OpenSSL
Ejemplo de uso
Demostración : https://3v4l.org/jl7qR
La biblioteca criptográfica simple anterior aún no es segura de usar. Necesitamos autenticar los textos cifrados y verificarlos antes de descifrarlos .
Nota : Por defecto,
UnsafeCrypto::encrypt()
devolverá una cadena binaria sin formato. Llámalo así si necesitas almacenarlo en un formato binario seguro (codificado en base64):Demostración : http://3v4l.org/f5K93
Contenedor de autenticación simple
Ejemplo de uso
Demos : binario sin procesar , codificado en base64
Si alguien desea utilizar esta
SaferCrypto
biblioteca en un entorno de producción, o su propia implementación de los mismos conceptos, le recomiendo contactar a sus criptógrafos residentes para obtener una segunda opinión antes de hacerlo. Podrán contarte sobre errores de los que quizás ni siquiera sea consciente.Estará mucho mejor usando una biblioteca de criptografía de buena reputación .
fuente
Uso
mcrypt_encrypt()
ymcrypt_decrypt()
con los parámetros correspondientes. Realmente fácil y directo, y utiliza un paquete de cifrado probado en batalla.EDITAR
5 años y 4 meses después de esta respuesta, la
mcrypt
extensión ahora está en proceso de desaprobación y eventual eliminación de PHP.fuente
PHP 7.2 se alejó completamente
Mcrypt
y el cifrado ahora se basa en laLibsodium
biblioteca mantenible .Todas sus necesidades de cifrado se pueden resolver básicamente a través de la
Libsodium
biblioteca.Documentación de Libsodium: https://github.com/paragonie/pecl-libsodium-doc
fuente
crypto_sign
API no cifra los mensajes, eso requerirá una de lascrypto_aead_*_encrypt
funciones.IMPORTANTE esta respuesta es válida solo para PHP 5, en PHP 7 use funciones criptográficas incorporadas.
Aquí hay una implementación simple pero lo suficientemente segura:
El código y los ejemplos están aquí: https://stackoverflow.com/a/19445173/1387163
fuente