Para el propósito de la herramienta Estoy escribiendo actualmente , necesito realizar algún cifrado / descifrado AES en alguna entrada. Es como una tubería: usted alimenta sus datos, ejecuta el algoritmo y lo pasa al siguiente modificador.
Estoy acostumbrado a openssl enc -aes-256-cbc
para cifrar y descifrar todo. Mi comprensión de esto es que primero deriva la clave que ingresa usando algún tipo de pbkdf-sha1
con unos 8 bytes generados salt
, luego derive el iv
del derived key + salt
.
Obviamente, solo funciona con OpenSSL ya que no pude encontrar ningún estándar sobre cómo comunicar, o escribir en un archivo, los parámetros iv
y salt
. Esperaba algún tipo de RFC (como para los parámetros de curva elíptica) pero no hubo suerte.
Mi idea es tener un encabezado de 64 bytes: salt + iv
primero en el archivo, luego va seguido por los datos cifrados. Usaré salt
con pbkdf2-sha256
para derivar la clave.
Los encabezados no tienen una longitud fija, al ajustar los parámetros correctos al iniciar el programa, se establecerán salt
y iv
en los valores correctos.
No quiero cometer ningún error. Me sorprendió cómo podría ser el enlace más débil y lo fácil que es recuperar una contraseña de una derivación de clave errónea y / o generación IV.
Estoy bastante seguro de que cada implementación de aes hace rodar su propio protocolo sobre parámetros. Y creo que es triste.
Por supuesto, usaré crypto/aes
de Go y su pbkdf2
, tomando siempre la fuente aleatoria de crypto/rand
y no math/rand
.
Para resumir:
-
¿Hay algún estándar para tener parámetros AES como
salt
yiv
? -
¿Debo generar el
iv
o derivarlo delsalt || dk
?
EDIT
Olvidé mencionar que iba a utilizar PKCS 5#2.0
que especifica cómo derivar la clave, pero esta pregunta fue más hacia las mejores prácticas en el almacenamiento de iv
y salt
para una compatibilidad más amplia.