Rfc2898 / PBKDF2 with SHA256 as digest in c#

前端 未结 8 2309
伪装坚强ぢ
伪装坚强ぢ 2020-12-13 10:01

I want to use Rfc2898 in c# to derive a key. I also need to use SHA256 as Digest for Rfc2898. I found the class Rfc2898DeriveBytes, but it uses SHA-1 and I don\

8条回答
  •  庸人自扰
    2020-12-13 10:40

    See Bruno Garcia's answer.

    Carsten: Please accept that answer rather than this one.


    At the time I started this answer, Rfc2898DeriveBytes was not configurable to use a different hash function. In the meantime, though, it has been improved; see Bruno Garcia's answer. The following function can be used to generate a hashed version of a user-provided password to store in a database for authentication purposes.

    For users of older .NET frameworks, this is still useful:

    // NOTE: The iteration count should
    // be as high as possible without causing
    // unreasonable delay.  Note also that the password
    // and salt are byte arrays, not strings.  After use,
    // the password and salt should be cleared (with Array.Clear)
    
    public static byte[] PBKDF2Sha256GetBytes(int dklen, byte[] password, byte[] salt, int iterationCount){
        using(var hmac=new System.Security.Cryptography.HMACSHA256(password)){
            int hashLength=hmac.HashSize/8;
            if((hmac.HashSize&7)!=0)
                hashLength++;
            int keyLength=dklen/hashLength;
            if((long)dklen>(0xFFFFFFFFL*hashLength) || dklen<0)
                throw new ArgumentOutOfRangeException("dklen");
            if(dklen%hashLength!=0)
                keyLength++;
            byte[] extendedkey=new byte[salt.Length+4];
            Buffer.BlockCopy(salt,0,extendedkey,0,salt.Length);
            using(var ms=new System.IO.MemoryStream()){
                for(int i=0;i>24)&0xFF);
                    extendedkey[salt.Length+1]=(byte)(((i+1)>>16)&0xFF);
                    extendedkey[salt.Length+2]=(byte)(((i+1)>>8)&0xFF);
                    extendedkey[salt.Length+3]=(byte)(((i+1))&0xFF);
                    byte[] u=hmac.ComputeHash(extendedkey);
                    Array.Clear(extendedkey,salt.Length,4);
                    byte[] f=u;
                    for(int j=1;j

提交回复
热议问题