Problem
My application (which I will be writing in C#) uses a key derivation method (Rfc2898DeriveBytes, 4000 iterations) along with a salt to generate a "hash" of a password. This hash is then sent to a database so that the user can use that password in the future to authenticate to their account.
So far that should be secure, but after that, I want to use Rfc2898DeriveBytes on the same password to generate a key which can then be used for encryption. Now the way I was going to do that was to use 5000 iterations of the same method to get a different key, but I am concerned that if the hash stored in the database was compromised (or I was forced to reveal it) it would be possible to derive the second key somehow. Is that possible?
Potential Solutions
- Ideally I would like to use the same salt, but would using a different one fix the problem?
- What about using SHA for the database hash and Rfc for the encryption key?
- Appending a unique but hard coded string (like "website" and "encryption" respectively) to each before deriving the key. (Damien_the_Unbeliever)
- Generate a double-length key, and use the first half of the derived key for authentication, and the second half for encryption. (erickson)
I would appreciate any advice on how best to improve this process. I would post code but I haven't written it yet.