从字符串获取字节

从字符串获取字节

问题描述:

嘿,我在我的应用程序中实现了哈希密码,我有几个问题。从字符串获取字节

我正在使用以下类来执行此操作。

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标签不适合这个主题,但也许有兴趣加密的程序可以帮助我。

+0

这里有太多的问题,真的有任何形式的答案对任何人都有用。尝试限制每个问题一个问题。你总是可以发布相同的示例代码,并每次提出不同的问题并获得更有用的答案。 –

一对夫妇的答案在这里:

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

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

为什么GetSalt的结果,并GetHash方法应转换为base64?

在这里作一个假设,但我要去可读性。字节数组对于人类来说是难以读取和存储的,而Base64编码的字节数组非常简单。

+0

您对“除非您拥有传入的字符串并且可以确认它是真正的UTF8”的陈述是没有意义的。传入的字符串是一个'System.String'。任何解码在它变成字符串实例之前就已经发生了。 –

+0

呃,你是对的@JoeWhite。其中一个... –

+0

我还有一个问题 - 为什么GetSalt方法需要值参数?这不会在任何地方使用。 – bielu000