从字符串

时间:2017-10-05 17:44:51

标签: c# encryption hash asp.net-core

嘿我在我的应用中实现了散列密码,我有几个问题。

我使用以下课程来执行此操作。

public class Encrypter : IEncrypter
{
    private static readonly int SaltSize = 40;
    private static readonly int DeriveBytesIterationsCount = 1000;

    public string GetSalt(string value)
    {
        if (String.IsNullOrWhiteSpace(value))
        {
            throw new Exception($"Value cannot be empty.");
        }

        var saltBytes = new byte[SaltSize];
        var rng = RandomNumberGenerator.Create();
        rng.GetBytes(saltBytes);

        return Convert.ToBase64String(saltBytes);
    }

    public string GetHash(string value, string salt)
    {
        var pbkdf2 = new Rfc2898DeriveBytes(value, GetBytes(salt), DeriveBytesIterationsCount);

        return Convert.ToBase64String(pbkdf2.GetBytes(SaltSize));
    }

    private static byte[] GetBytes(string value)
    {
        var buffer = new byte[value.Length * sizeof(char)];

        Console.WriteLine(value.Length*sizeof(char));

        Buffer.BlockCopy(value.ToCharArray(), 0, buffer, 0, buffer.Length);

        return buffer;
    }
}

为什么在GetBytes方法中我不应该只使用

  

String.Encoding.UTF8.GetBytes(value)

而不是当前实现此方法?

为什么paramteres传递给

  

pbkdf2.GetBytes(SaltSize))

是盐的大小?

为什么GetSalt和GetHash方法的结果应该转换为base64?

P.s我知道#encryption标签不适合这个主题,但是对加密感兴趣的程序也许可以帮助我。

1 个答案:

答案 0 :(得分:0)

一对夫妇在这里回答:

  

为什么传递给pbkdf2.GetBytes(SaltSize)的参数是盐大小?

Rfc2898DeriveBytesGetBytes(int cb)以指定的字节大小为给定对象创建伪随机密钥。 MSDN Link

  

为什么GetSalt和GetHash方法的结果应该转换为base64?

在这里做出假设,但我会选择可读性。人类难以读取和存储字节数组,而Base64编码的字节数组很简单。