Me gustaría almacenar copias de seguridad cifradas de archivos de texto en mi computadora. Estoy desarrollando un script en Python usando Pycrypto para lograr eso, basado en el código este código para usar la biblioteca. ( código actual )
La idea básica es:
- Genere claves de firma AES + nuevas / leídas
- Cifre los datos utilizando la primera clave (AES 256-CBC)
- Firme los datos cifrados usando la segunda clave con HMAC-SHA256
La generación de bytes para las claves es simplemente el resultado de Random.get_random_bytes(KEY_SIZE + SIG_SIZE)
, por lo que 64 bytes en mi caso.
Ahora, para mejorar la seguridad, me gustaría agregar una protección de contraseña a la clave (si alguien encuentra el archivo de claves). Mi idea inicial es hash salt + password y XOR el resultado con los bytes aleatorios en el archivo de clave.
Si uso SHA256 (para ser consistente), significa que produzco 32 bytes y debo XOR dos veces (por cada clave de 32 bytes) y no me gusta (no estoy seguro, pero suena como un posible ataque). ¿Usando una sal diferente para cada llave?
Finalmente, ¿hay una forma estándar para almacenar la sal y las claves? No me gusta la idea de inventar mi propio esquema (generalmente una mala idea en criptografía). ¿Hay algunas buenas prácticas ?
Actualización: gracias a la respuesta de Polynomial , obtuve el siguiente código :
from Crypto import Random
from Crypto.Protocol.KDF import PBKDF2
def generate_new_keys(password, enc_key_size=32, sig_key_size=32):
rand_bytes = Random.get_random_bytes(enc_key_size + sig_key_size)
# save the salt
with open('keys.salt','w') as f:
f.write(rand_bytes.encode("base64").replace("\n",""))
# derive the two keys using PBKDF2
enc_key = PBKDF2(password, rand_bytes[:enc_key_size], dkLen=enc_key_size)
sig_key = PBKDF2(password, rand_bytes[enc_key_size:], dkLen=sig_key_size)
return (ency_key, sig_key)