He enviado algún código a GitHub para demostrar el uso del cifrado de clave simétrica en PHP. Es una pequeña biblioteca de almacenamiento de valor-clave y (opcionalmente) ofrece la capacidad de cifrar la información almacenada. Me gustaría escuchar sus comentarios sobre un par de decisiones de diseño que tomé:
El cifrado se realiza mediante AES en modo CBC (IV aleatorio), con la autenticación "cifrar y luego MAC". La información es básicamente una matriz de PHP, que se serializa y se comprime opcionalmente (gzdeflate). Esta cadena se encripta. Me gustaría escuchar algunas opiniones ¿valdría la pena agregar otra verificación MAC ("interna"), que se encargaría de verificar que los datos sean válidos después de la no compresión? Al principio, esto suena como una pérdida de tiempo, ya que ya hay una comprobación de MAC. Pero, por otro lado, esto podría contrarrestar algunos problemas que pueden surgir debido a errores en la capa de descompresión, etc. ¿Algún comentario sobre esto?
Otra cosa, los expertos en criptografía recomiendan que cuando se usa el modo CTR, el error se genere utilizando un "número de mensaje" único y creciente. Sin embargo, en TCrypto no hay forma de mantener una lista de dichos números de mensajes, por lo que he tomado la decisión de no utilizar el modo CTR. ¿Crees que sería seguro usar el modo CTR generando el "nonce" al azar (/ dev / urandom)? Las claves de cifrado en TCrypto se derivan utilizando una clave constante, marcas de tiempo y el IV (esto garantiza que las claves de cifrado sean únicas para cada operación de cifrado).
¿Algún otro comentario?
¡Muchas gracias!
Timo