Estoy trabajando en el cifrado por lotes de archivos, para un pequeño proyecto mío. Los archivos se almacenan cifrados en una unidad extraíble y las claves se almacenan en un servidor confiable. Para mayor seguridad, me gustaría usar UNA tecla para UNA archivo. Los archivos se cifran utilizando la "caja sellada" de NaCl / libsodium (Curve25519xsalsa20poly1305).
Cada vez que el cliente agrega un archivo a la unidad, se cifra mediante una clave pública, generada con fun1(masterPublicKey, seed)
. El seed
se genera de manera determinista a partir de un conjunto de atributos de archivo no variables, y el masterPublicKey
es, bueno, una clave pública que pertenece al cliente y se reutiliza para todos los archivos que pertenecen a este cliente.
Cada vez que el cliente solicita el descifrado de un archivo, el seed
se envía al servidor. Luego recopila la clave privada del cliente y llama a fun2(privateKey, seed)
para obtener una clave privada derivada. Esta clave se envía al cliente, que ahora puede descifrar el archivo que quería, pero NINGUNO de los otros archivos.
On the server (decryption):
[master private key] \
\ / seed from client
\ /
\ fun(privateKey, seed)
-> derived private key
On the client (encryption):
[master public key] \
\ / getSeed(attributes)
\ /
\ fun(publicKey, seed)
-> derived public key
Si conoces bitcoin, piensa en BIP32 pero para el cifrado.
¿Cómo lograr tal cosa? ¿Hay incluso una manera de hacer esto?