How to hash a password

后端 未结 9 823
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-22 14:49

I\'d like to store the hash of a password on the phone, but I\'m not sure how to do it. I can only seem to find encryption methods. How should the password be hashed properl

9条回答
  •  被撕碎了的回忆
    2020-11-22 15:23

    Most of the other answers here are somewhat out-of-date with today's best practices. As such here is the application of using PBKDF2/Rfc2898DeriveBytes to store and verify passwords. The following code is in a stand-alone class in this post: Another example of how to store a salted password hash. The basics are really easy, so here it is broken down:

    STEP 1 Create the salt value with a cryptographic PRNG:

    byte[] salt;
    new RNGCryptoServiceProvider().GetBytes(salt = new byte[16]);
    

    STEP 2 Create the Rfc2898DeriveBytes and get the hash value:

    var pbkdf2 = new Rfc2898DeriveBytes(password, salt, 100000);
    byte[] hash = pbkdf2.GetBytes(20);
    

    STEP 3 Combine the salt and password bytes for later use:

    byte[] hashBytes = new byte[36];
    Array.Copy(salt, 0, hashBytes, 0, 16);
    Array.Copy(hash, 0, hashBytes, 16, 20);
    

    STEP 4 Turn the combined salt+hash into a string for storage

    string savedPasswordHash = Convert.ToBase64String(hashBytes);
    DBContext.AddUser(new User { ..., Password = savedPasswordHash });
    

    STEP 5 Verify the user-entered password against a stored password

    /* Fetch the stored value */
    string savedPasswordHash = DBContext.GetUser(u => u.UserName == user).Password;
    /* Extract the bytes */
    byte[] hashBytes = Convert.FromBase64String(savedPasswordHash);
    /* Get the salt */
    byte[] salt = new byte[16];
    Array.Copy(hashBytes, 0, salt, 0, 16);
    /* Compute the hash on the password the user entered */
    var pbkdf2 = new Rfc2898DeriveBytes(password, salt, 100000);
    byte[] hash = pbkdf2.GetBytes(20);
    /* Compare the results */
    for (int i=0; i < 20; i++)
        if (hashBytes[i+16] != hash[i])
            throw new UnauthorizedAccessException();
    

    Note: Depending on the performance requirements of your specific application, the value 100000 can be reduced. A minimum value should be around 10000.

提交回复
热议问题