L'amministratore del sito web deve leggere i dati dell'utente. Quindi, se la chiave è derivata dal passaggio utente, l'amministratore deve conoscere il passaggio utente, non esattamente una buona idea.
Il seguente schema di crittografia è stato gentilmente suggerito da Polynomial.
In sostanza, ciò che stai tentando di fare è mettere in backdoor l'account di ciascun utente in modo tale che solo l'utente e un singolo utente amministrativo possano accedere ai propri dati. Questo può essere ottenuto come segue:
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)
Quindi archiviamo uk ', dk' e iv con il set di dati che stiamo crittografando. Ci archiviamo con il record dell'account utente. Memorizziamo anche P 'e come con il nostro record dell'account amministratore. La chiave pubblica P può essere memorizzata nel codice. La coppia di chiavi è comune tra i record.
La decrittazione dell'utente funziona come segue:
Compute uk from the user password and us.
Xor uk' with uk to retrieve dk.
Decrypt c using iv and dk, giving us m.
La decrittazione dell'amministratore funziona come segue (la chiave privata è archiviata offline):
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.
Ho cercato di implementare lo schema di Polynomial in PHP: questo è il risultato . Ora vorrei sapere se la mia implementazione è corretta e se è sicura.
Grazie mille per il tuo aiuto molto utile!