El administrador del sitio web necesita leer los datos del usuario. Por lo tanto, si la clave se deriva del pase de usuario, entonces el administrador debe conocer el pase de usuario, no es exactamente una buena idea.
Polynomial sugirió muy amablemente el siguiente esquema de encriptación.
Básicamente, lo que intentas hacer es crear una puerta trasera en la cuenta de cada usuario de manera que solo el usuario y un único usuario administrativo puedan acceder a sus datos. Esto se puede lograr de la siguiente manera:
us = User salt = Random unique value (not the same salt as used for authentication)
as = Admin salt = Random unique value (not the same salt as used for authentication)
uk = User key = pbkdf2(user_pass, us, 256, rounds)
dk = Data key = random 256-bit key
ak = Admin key = pbkdf2(admin_pass, as, 256, rounds)
P = RSA private key
p = RSA public key
uk' = Encrypted user key = dk ^ uk
dk' = Encrypted data key = RSA_Encrypt(dk, p)
P' = Encrypted private key = AES_Encrypt(P, ak)
m = message
iv = initialisation vector (random unique value)
c = ciphertext = AES_Encrypt(m, iv, dk)
Luego almacenamos uk ', dk' y iv con el registro de datos que estamos cifrando. Nos almacenamos con el registro de la cuenta de usuario. También almacenamos P 'y como con nuestro registro de cuenta de administrador. La clave pública P puede almacenarse en el código. El par de llaves es común entre los registros.
El descifrado del usuario funciona de la siguiente manera:
Compute uk from the user password and us.
Xor uk' with uk to retrieve dk.
Decrypt c using iv and dk, giving us m.
El descifrado de administrador funciona de la siguiente manera (la clave privada se almacena fuera de línea):
Compute ak from the admin password and as.
Decrypt P using AES_Decrypt(P', ak)
Decrypt dk using RSA_Decrypt(dk', P)
Decrypt c using iv and dk, giving us m.
He intentado implementar el esquema de Polynomial en PHP: este es el resultado . Ahora me gustaría saber si mi implementación es correcta y si es segura.
¡Muchas gracias por tu ayuda tan útil!