La mejor manera de cifrar datos usando php: no estoy seguro de si lo estoy haciendo correctamente [duplicar]

2

Quiero cifrar algunos datos dentro de mi archivo php cuando agrego cosas a mi base de datos mysql.

Así es como lo hago.

Creo una clave estática como:

$key = md5("pass");

Luego tengo dos funciones llamadas cifrar () y descifrar () y hacen esto:

function encrypt($string, $key){
    $string = rtrim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_ECB)));
    return $string;
}

function decrypt($string, $key){
    $string = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($string), MCRYPT_MODE_ECB));
    return $string;
}

No estoy seguro si esta es la mejor práctica pero, ¿cómo puedo generar una clave que no sea md5?

    
pregunta Benj Mikesozery 25.03.2016 - 11:53
fuente

1 respuesta

7

Hay al menos dos problemas con este enfoque.

  1. Su elección de generación de claves
  2. Su elección del modo de encriptación

Generación de claves

Estás haciendo md5("static password") como tu clave. Esto es realmente malo. Primero, está "solo" obteniendo 128 bits de MD5 y está usando AES de 256 bits, lo que hace que pierda ciclos (porque AES-256 es más lento que AES-128) en algo que no está usando de todos modos. En segundo lugar, tu contraseña es débil. "pass" es no una contraseña segura y realmente espero que la reemplace con algo mucho más fuerte para el uso de producción. En tercer lugar, está utilizando plain MD5 para el procesamiento de la contraseña ( también vea nuestra respuesta canónica sobre el hashing de contraseñas ). Esto es tan malo como puede ser, ya que los textos cifrados podrían ser atacados usando tablas precomputadas (arco iris) y MD5 es una función de hashing rápido, que permite forzar rápidamente su contraseña. Cuarto: ¿¡Por qué estás usando una contraseña? No hay ninguna razón lógica para usar una contraseña estática (legible para el usuario) en lugar de una clave segura, generada de forma aleatoria del tamaño deseado. De esta manera, no tiene que preocuparse por la fuerza bruta, no tiene que preocuparse por usar MD5 (lo que dará mala impresión), no tiene que preocuparse por que su clave sea demasiado corta.

Modo de cifrado

Mientras utiliza AES-256 como algoritmo de cifrado (lo cual está bien), está usando ECB como su modo de operación para AES. De esta manera, tiene dos problemas: a) está perdiendo qué bloques AES (16 bytes) son iguales yb) tiene que rellenar sus mensajes para que sean un múltiplo de 16 bytes. Para solucionar estos problemas necesitas cambiar el modo. GCM es la mejor opción que tiene. Desafortunadamente, esto no es soportado adecuadamente por PHP hasta PHP 7.1 a través de openssl_encrypt() o mcrypt_encrypt() (que realmente debería) no usar, porque es más lento, ya no se mantiene y está menos endurecido que el OpenSSL). Si ya tiene PHP 7.1, entonces está bien, puede usar AES-GCM con openssl_encrypt() , que protegerá su texto cifrado para que no se lea y / o modifique, siempre que entregue un número único (no secreto) para cada cifrado. Hasta que tenga el cifrado PHP 7.1 AEAD , debe utilizar una construcción ad-hoc. Esto significa que primero debe cifrar los datos usando un IV (CTR y luego calcula el HMAC - SHA256 del texto cifrado y almacene la etiqueta resultante, para que pueda verificarla en el próximo acceso de lectura.

    
respondido por el SEJPM 25.03.2016 - 12:25
fuente

Lea otras preguntas en las etiquetas