C# 重点加强。我做得对吗?

C# 重点加强。我做得对吗?,c#,security,passwords,cryptography,C#,Security,Passwords,Cryptography,我正在编写一个用于散列密码的类,该类通过使用System.Security.Cryptography.Rfc2898DeriveBytes类来生成用于计算散列值的密钥来实现 代码基本上是这样做的: // Higher iterations value results in better key strength var db = new Rfc2898DeriveBytes(password + salt + secretKeyFromConfigFile,

我正在编写一个用于散列密码的类,该类通过使用System.Security.Cryptography.Rfc2898DeriveBytes类来生成用于计算散列值的密钥来实现

代码基本上是这样做的:

// Higher iterations value results in better key strength
var db = new Rfc2898DeriveBytes(password + salt + secretKeyFromConfigFile,
                                saltAsBytes,
                                iterations);

byte[] hashKey = db.GetBytes(64); // 64 bytes is the recommended size for the HMACSHA512 class

var sha512 = new System.Security.Cryptography.HMACSHA512(hashKey);

byte[] hashInput = System.Text.Encoding.UTF8.GetBytes(password + salt + secretKeyFromConfigFile);

byte[] hash = sha512.ComputeHash(hashInput);

return System.Convert.ToBase64String(hash);
System.Security.Cryptography.Rfc2898DeriveBytes的文档表明,它使用“…基于System.Security.Cryptography.HMACSHA1的伪随机数生成器”来派生密钥

既然SHA512比SHA1好,那么像这样简单地应用SHA512哈希函数会更好吗

byte[] hash;

for (int i = 0; i < iterations; i++)
{
    hash = sha512.ComputeHash(hash ?? hashInput);
}

return System.Convert.ToBase64String(hash);
byte[]散列;
对于(int i=0;i
加强密钥(如第1个代码块所示)和加强哈希(如第2个代码块所示)之间有什么区别


对密码进行哈希运算时,首选的密钥拉伸方法是什么?

除非您是密码专家,否则请坚持使用Rfc2898DeriveBytes,这很可能是正确实现的。抵制将破坏系统安全的自定义解决方案拼凑在一起的诱惑

没有理由散列Rfc2898DeriveBytes的输出

直接使用GetBytes(),它就是为此目的而设计的


关键伸展运动的目的是什么?密码还是密码哈希?对于密码散列,您可能希望使用不同的算法。

这是一个非常古老的算法,但我在搜索同一个问题时遇到了这个问题,解决方案确实是坚持Rfc2898DeriveBytes的输出

Rfc2898DeriveBytes是PBKDF2的.NET实现。它需要您的密码、salt和迭代次数。这已经是整个实现,不需要使用另一个哈希算法来重新刷新结果

事实上,强烈建议不要为此创建您自己的实现,因为您可能会破坏其他人在这里已经提到的安全性

正如你在这里看到的那样,这也是它的作用:

目的是创建一个密码哈希系统,该系统包含密钥拉伸功能。我不知道有任何现成的类或库已经这样做了,除非您打算只使用Rfc2898DeriveBytes并将GetBytes()的返回值存储为哈希?我假设“它是为这个目的而设计的”,你的意思是为密钥派生而设计的?我的密钥拉伸的目的是“通过增加测试每个可能密钥所需的时间来防止暴力攻击”。这个问题有一个已知的好解决方案:否则,您可以使用Rfc2898DeriveBytes,存储它并检查密码,在纯文本密码上应用该方法并比较输出。是的,我看过Bcrypt的C#实现,如果我理解正确,它似乎与Rfc2898DeriveBytes类做了相同的事情。除了Bcrypt使用Blowfish算法,而Rfc2898DeriveBytes使用SHA1,我觉得有必要包含一个SHA512散列,其中派生键来自GetBytes(),作为HMACSHA512键。我想我想问的是,如何使用SHA512或其他使用密钥增强的算法实现哈希方法。还是我们只剩下Bcrypt(河豚)和Rfc2898DeriveBytes(SHA1)作为唯一的选择?@Rudy,Bcrypt!=河豚。Bcrypt blowfish算法,并利用所述算法的已知昂贵密钥设置;速度慢是Bcrypt的主要设计特点之一。另外,你说“(…)做同样的事情(…)除了(…)”,在密码学中,这可以翻译成“它们完全不同”。为什么不直接实现PBKDF2,而不是实现你自己的密钥增强方案呢?然后你可以确定你做得对。Rfc2898DeriveBytes是PBKDF2的一个实现。