Ho uno scenario in cui le password immesse dall'utente devono essere memorizzate per un uso successivo. Non posso usare l'hashing perché ho bisogno di ottenere la password originale per un uso successivo.
Ad esempio, si consideri un'app di invio di posta elettronica in cui un utente immette inizialmente una password per il proprio account di posta elettronica e l'applicazione lo memorizzerà in forma crittografata e quando l'applicazione deve inviare un'email, decodifica la password e la utilizza per invia la posta.
Ora, ecco cosa sto facendo:
- L'applicazione memorizza una chiave principale (generata utilizzando RNGCryptoServiceProvider) nel database
-
Sia la chiave che IV per AES derivano dalla chiave principale utilizzando Rfc2898DeriveBytes (password = masterkey e salt = user_id per Rfc2898DeriveBytes)
// the initial, one time masterkey generation, which will be used for all passwords byte[] masterKeyBytes = new byte[32]; new RNGCryptoServiceProvider().GetBytes(masterKeyBytes); // masterkey is saved in database string masterKey = Convert.ToBase64String(masterKeyBytes); // password encryption of a user's password var derivative = new Rfc2898DeriveBytes(masterKey, 128_bit_guid_of_user_id, numberOfIterations) var aes = new AesCryptoServiceProvider(); aes.Key = derivative.GetBytes(32); aes.IV = derivative.GetBytes(16); var encryptor = aes.CreateEncryptor(aes.Key, aes.IV); // get the encrypted password from encryptor ..... .....
Sto facendo questo nel modo giusto? Ci sono correzioni da fare? Inoltre, le dimensioni utilizzate (per dimensioni della chiave, masterkeysize, ecc.) Sono abbastanza buone?
Poche altre domande (solo per saperne di più):
-
Le chiavi derivate (chiave AES separata per ciascun utente) da una chiave master ad alta entropia non sono considerate degne (o peggio)? (usando semplicemente la chiave principale come tasto AES è più che sufficiente). In tal caso, perché ?, la mia argomentazione è: se qualcuno dovesse dedurre la chiave AES per un particolare utente, non sarà ancora in grado di dedurre la chiave master, quindi gli altri utenti sono al sicuro. Mi sono imbattuto in "Diversificazione chiave" che viene utilizzata in alcune app di smart card in cui derivano una chiave AES separata da una chiave principale per ogni istanza (non vale la stessa cosa qui?)
-
Possiamo usare PBKDF per ricavare le chiavi in questo scenario, o dovremmo usare un KBKDF? in tal caso, potresti citare una libreria (preferibilmente dal framework .NET) che offre KBKDF? So che RfcDerivativeBytes utilizza un PBKDF per derivare una chiave, ma non sono riuscito a scoprire come derivare una chiave utilizzando KBKDF.