从字符串获取字节
嘿,我在我的应用程序中实现了哈希密码,我有几个问题。从字符串获取字节
我正在使用以下类来执行此操作。
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(值)
,而不是目前的这个方法的实现?
为什么paramteres传递给
pbkdf2.GetBytes(SaltSize))
是盐的大小?
为什么GetSalt和GetHash方法的结果应该转换为base64?
P.s我知道#encryption标签不适合这个主题,但也许有兴趣加密的程序可以帮助我。
一对夫妇的答案在这里:
为什么paramteres传递给
pbkdf2.GetBytes(SaltSize)
是盐的大小?
Rfc2898DeriveBytes
。 GetBytes(int cb)
以指定的字节大小为给定对象创建一个伪随机密钥。 MSDN Link
为什么GetSalt的结果,并GetHash方法应转换为base64?
在这里作一个假设,但我要去可读性。字节数组对于人类来说是难以读取和存储的,而Base64编码的字节数组非常简单。
您对“除非您拥有传入的字符串并且可以确认它是真正的UTF8”的陈述是没有意义的。传入的字符串是一个'System.String'。任何解码在它变成字符串实例之前就已经发生了。 –
呃,你是对的@JoeWhite。其中一个... –
我还有一个问题 - 为什么GetSalt方法需要值参数?这不会在任何地方使用。 – bielu000
这里有太多的问题,真的有任何形式的答案对任何人都有用。尝试限制每个问题一个问题。你总是可以发布相同的示例代码,并每次提出不同的问题并获得更有用的答案。 –