嘿我在我的应用中实现了散列密码,我有几个问题。
我使用以下课程来执行此操作。
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标签不适合这个主题,但是对加密感兴趣的程序也许可以帮助我。
答案 0 :(得分:0)
一对夫妇在这里回答:
为什么传递给
pbkdf2.GetBytes(SaltSize)
的参数是盐大小?
Rfc2898DeriveBytes
。GetBytes(int cb)
以指定的字节大小为给定对象创建伪随机密钥。 MSDN Link
为什么GetSalt和GetHash方法的结果应该转换为base64?
在这里做出假设,但我会选择可读性。人类难以读取和存储字节数组,而Base64编码的字节数组很简单。