Lo que quiero decir es:
Original String + Salt or Key --> Encrypted String
Encrypted String + Salt or Key --> Decrypted (Original String)
Tal vez algo como:
"hello world!" + "ABCD1234" --> Encrypt --> "2a2ffa8f13220befbe30819047e23b2c" (may be, for e.g)
"2a2ffa8f13220befbe30819047e23b2c" --> Decrypt with "ABCD1234" --> "hello world!"
- En PHP, ¿cómo puedes hacer esto?
Intenté usarlo Crypt_Blowfish
, pero no funcionó para mí.
Respuestas:
Antes de continuar, intente comprender la diferencia entre cifrado y autenticación , y por qué probablemente desee un cifrado autenticado en lugar de solo cifrado .
Para implementar el cifrado autenticado, desea cifrar y luego MAC. ¡El orden de encriptación y autenticación es muy importante! Una de las respuestas existentes a esta pregunta cometió este error; al igual que muchas bibliotecas de criptografía escritas en PHP.
Debe evitar implementar su propia criptografía y, en su lugar, usar una biblioteca segura escrita y revisada por expertos en criptografía.
Use libsodium si tiene acceso PECL (o sodium_compat si quiere libsodium sin PECL); de lo contrario ...
Use defuse / php-encryption ; ¡no tires tu propia criptografía!
Ambas bibliotecas vinculadas anteriormente hacen que sea fácil y sencillo implementar el cifrado autenticado en sus propias bibliotecas.
Si aún desea escribir e implementar su propia biblioteca de criptografía, en contra de la sabiduría convencional de cada experto en criptografía en Internet, estos son los pasos que debe seguir.
Cifrado:
Descifrado:
hash_equals()
. Si falla, aborta.Otras consideraciones de diseño:
mb_strlen()
ymb_substr()
, usando el'8bit'
modo de juego de caracteres para evitarmbstring.func_overload
problemas.mcrypt_create_iv()
, ¡NO LO USEMCRYPT_RAND
!bin2hex()
,base64_encode()
, Etc., puede filtrar información acerca de sus claves de cifrado a través de la sincronización de caché. Evítalos si es posible.Incluso si sigue los consejos dados aquí, muchas cosas pueden salir mal con la criptografía. Siempre haga que un experto en criptografía revise su implementación. Si no tiene la suerte de ser amigo personal de un estudiante de criptografía en su universidad local, siempre puede intentar el foro de intercambio de pila de criptografía para obtener asesoramiento.
Si necesita un análisis profesional de su implementación, siempre puede contratar a un equipo de consultores de seguridad acreditados para revisar su código de criptografía PHP (divulgación: mi empleador).
Importante: Cuándo no usar cifrado
No encriptes las contraseñas . Ensu lugar,deseausar hash , utilizando uno de estos algoritmos de hash de contraseña:
Nunca use una función hash de propósito general (MD5, SHA256) para el almacenamiento de contraseñas.
No cifre los parámetros de URL . Es la herramienta incorrecta para el trabajo.
Ejemplo de cifrado de cadenas PHP con Libsodium
Si tiene PHP <7.2 o no tiene instalado libsodium, puede usar sodium_compat para lograr el mismo resultado (aunque más lento).
Luego para probarlo:
Halita - Libsodium hecho más fácil
Uno de los proyectos en los que he estado trabajando es una biblioteca de cifrado llamada Halite , cuyo objetivo es hacer que libsodium sea más fácil e intuitivo.
Toda la criptografía subyacente es manejada por libsodium.
Ejemplo con defuse / php-encryption
Nota :
Crypto::encrypt()
devuelve salida codificada en hexadecimal.Gestión de claves de cifrado
Si está tentado a usar una "contraseña", deténgase ahora mismo. Necesita una clave de cifrado aleatoria de 128 bits, no una contraseña humana memorable.
Puede almacenar una clave de cifrado para uso a largo plazo de esta manera:
Y, a pedido, puede recuperarlo así:
Yo fuertemente recomiendo que acaba de almacenar una clave generada aleatoriamente para uso a largo plazo en lugar de cualquier tipo de contraseña que la tecla (o deducir la clave).
Si está utilizando la biblioteca de Defuse:
$string = $keyObject->saveToAsciiSafeString()
$loaded = Key::loadFromAsciiSafeString($string);
"Pero realmente quiero usar una contraseña".
Esa es una mala idea, pero está bien, aquí está cómo hacerlo de manera segura.
Primero, genere una clave aleatoria y almacénela en una constante.
¡Tenga en cuenta que está agregando trabajo adicional y podría usar esta constante como la clave y ahorrarse mucha angustia!
Luego use PBKDF2 (así) para derivar una clave de cifrado adecuada de su contraseña en lugar de cifrarla directamente.
No solo use una contraseña de 16 caracteres. Su clave de cifrado se romperá cómicamente.
fuente
password_hash()
y verifíquelaspassword_verify()
.function getKeyFromPassword($password, $keysize = \Sodium\CRYPTO_SECRETBOX_KEYBYTES)
Llegué tarde a la fiesta, pero al buscar la forma correcta de hacerlo, encontré esta página, fue uno de los principales resultados de búsqueda de Google, por lo que me gustaría compartir mi opinión sobre el problema, que considero que es actualizado al momento de escribir esta publicación (principios de 2017). Desde PHP 7.1.0,
mcrypt_decrypt
ymcrypt_encrypt
será obsoleto, por lo que la creación de código de prueba futuro debe usar openssl_encrypt y openssl_decryptPuedes hacer algo como:
También puede usar cualquier otro método de astillador, según su necesidad de seguridad. Para conocer los métodos de chipper disponibles, consulte la función openssl_get_cipher_methods .
fuente
prod_id=123
pero no quiero que 123 sea legible para todos, sin embargo, incluso si pudieran leerlo, no será un problema. Un atacante que pueda reemplazar el 123 a un valor personalizado no causará ningún daño, solo podrá obtener detalles de cualquier otro producto, pero Joe Average User no tendrá idea de cómo obtener detalles para producto 124 por ejemplo. Para un escenario como este, es una solución perfecta, ¡por seguridad no se puede!Qué no hacer
Lo tengo yo mismo. En realidad, encontré alguna respuesta en Google y modifiqué algo. Sin embargo, el resultado es completamente inseguro.
fuente
base64_encode(encrypt($string))
- Para descifrarlo:decrypt(base64_decode($encrypted))
mcrypt_encrypt
reemplazar el código de muestra : php.net/manual/en/function.mcrypt-encrypt.php . Tenga en cuenta que al revisarlo ahora probablemente debería tener unrtrim
carácter for"\0"
al final.Para el marco de Laravel
Si está utilizando el marco Laravel, es más fácil encriptar y desencriptar con funciones internas.
fuente
Actualizado
Versión preparada para PHP 7. Utiliza la función openssl_encrypt de la biblioteca PHP OpenSSL .
fuente
He dejado esta respuesta con fines históricos, pero algunos de los métodos ahora están en desuso, el método de cifrado DES no es una práctica recomendada, etc.
No he actualizado este código por dos razones: 1) ya no trabajo con métodos de cifrado a mano en PHP, y 2) este código todavía cumple el propósito para el que estaba destinado: demostrar el concepto mínimo y simplista de cómo puede funcionar el cifrado en PHP
Si encuentra un tipo de fuente similarmente simplista, "cifrado PHP para tontos" que puede hacer que la gente comience en 10-20 líneas de código o menos, hágamelo saber en los comentarios.
Más allá de eso, disfrute este episodio clásico de la respuesta de cifrado minimalista PHP4 de la era temprana.
Idealmente, usted tiene, o puede obtener, acceso a la biblioteca PHP de mcrypt, ya que es una variedad de tareas muy popular y muy útil. Aquí hay un resumen de los diferentes tipos de cifrado y algunos códigos de ejemplo: Técnicas de cifrado en PHP
Algunas advertencias:
1) Nunca use encriptación reversible o "simétrica" cuando un hash unidireccional servirá.
2) Si los datos son realmente confidenciales, como números de tarjeta de crédito o de seguridad social, deténgase; necesita más de lo que proporcionará un simple fragmento de código, sino que necesita una biblioteca criptográfica diseñada para este propósito y una cantidad significativa de tiempo para investigar los métodos necesarios. Además, el software de cifrado es probablemente <10% de seguridad de los datos confidenciales. Es como volver a cablear una estación de energía nuclear: acepte que la tarea es peligrosa y difícil y que está más allá de su conocimiento si ese es el caso. Las sanciones financieras pueden ser inmensas, por lo que es mejor utilizar un servicio y enviarles la responsabilidad.
3) Cualquier tipo de cifrado fácilmente implementable, como se enumera aquí, puede proteger razonablemente la información levemente importante que desea evitar de miradas indiscretas o limitar la exposición en caso de fuga accidental / intencional. Pero viendo cómo se almacena la clave en texto plano en el servidor web, si pueden obtener los datos, pueden obtener la clave de descifrado.
Sea como fuere, diviértete :)
fuente
M�������f=�_=
personajes extraños como el cifrado. ¿No puedo obtener personajes simples? Al igual que:2a2ffa8f13220befbe30819047e23b2c
. Además, ¿no puedo cambiar la LONGITUD de$key_value
(fijada a 8 ???) y la LONGITUD de salida$encrypted_text
? (¿no puede ser 32 o 64 de largo o lo que sea más?)MCRYPT_RIJNDAEL_128
), y los textos cifrados deben ser autenticados (hash_hmac()
verificados) conhash_equals()
).Si no desea usar la biblioteca (que debería), use algo como esto (PHP 7):
fuente
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);
Estos son métodos compactos para cifrar / descifrar cadenas con PHP usando AES256 CBC :
Uso:
fuente
El siguiente código funciona en php para todas las cadenas con caracteres especiales
fuente