当前位置: 首页 > 知识库问答 >
问题:

如何在C#中使用PBKDF2 HMAC SHA-256或SHA-512使用salt和迭代对密码进行哈希?

井嘉胜
2023-03-14

我想找到一个解决方案或方法,使我能够添加盐和控制迭代次数。本机Rfc2898DeriveBytes基于HMACSHA1。理想情况下,使用SHA-256或SHA-512将使系统经得起未来的考验。

这是迄今为止我发现的最好的例子:http://jmedved.com/2012/04/pbkdf2-with-sha-256-and-others/但是当我用SHA-256运行它时,它实际上比用SHA-512慢。我使用64k迭代,盐的指南和不同的相同长度的密码进行比较。

我还发现了这个解决方案:http://sourceforge.net/projects/pwdtknet/它有完整的源代码可用。它似乎更加健壮。

到目前为止,我还不能从它们中获得相同的输出。

共有3个答案

崔宇
2023-03-14

这是由SecurityDriven提供的。NET的地狱图书馆。

安装Inferno软件包

鉴于NSA套件B使用SHA-384保护绝密信息,且“其截断设计可有效防御长度扩展攻击”,Inferno推出了SHA-384。

using SecurityDriven.Inferno;
using SecurityDriven.Inferno.Extensions;
using static SecurityDriven.Inferno.SuiteB;
using static SecurityDriven.Inferno.Utils;
using PBKDF2 = SecurityDriven.Inferno.Kdf.PBKDF2;

存储用户密码:

var sha384Factory = HmacFactory;
var random = new CryptoRandom();

byte[] derivedKey
string hashedPassword = null;
string passwordText = "foo";

byte[] passwordBytes = SafeUTF8.GetBytes(passwordText);
var salt = random.NextBytes(384/8);

using (var pbkdf2 = new PBKDF2(sha384Factory, passwordBytes, salt, 256*1000))
    derivedKey=  pbkdf2.GetBytes(384/8);


using (var hmac = sha384Factory()) 
{
    hmac.Key = derivedKey;
    hashedPassword = hmac.ComputeHash(passwordBytes).ToBase16();
}

同时保留salt和hashedPassword。注意,您可以将它们作为二进制文件保存,也可以使用帮助器将它们存储为字符串。请注意,盐是随机创建的。

验证用户的登录:

var user = GetUserByUserName("bob")

var sha384Factory = HmacFactory;

byte[] derivedKey
string hashedPassword = null;
string suppliedPassword = "foo";

byte[] passwordBytes = SafeUTF8.GetBytes(suppliedPassword);

using (var pbkdf2 = new PBKDF2(sha384Factory, passwordBytes, user.UserSalt, 256*1000))
    derivedKey=  pbkdf2.GetBytes(384/8);


using (var hmac = sha384Factory()) 
{
    hmac.Key = derivedKey;
    hashedPassword = hmac.ComputeHash(passwordBytes).ToBase16();
}

isAuthenticated = hashedPassword == user.UserHashedPassword; //true for bob

正如您在这里看到的,过程几乎是相同的。关键区别在于没有使用CryptoRandom,我们在创建PBKDF2实例时使用persistend UserSalt。

GitHub上的源代码

尉迟德惠
2023-03-14

我的CryptSharp库可以对任意HMAC执行PBKDF2。Salt和迭代是可以控制的。看看地下室。实用程序名称空间。它与C#Scrypt实现以及其他一些东西一起出现。

后易安
2023-03-14

PWDTK。网络图书馆(http://sourceforge.net/projects/pwdtknet/)似乎是我能找到的唯一一个实现PBKDF2 HMAC SHA-512并允许salt和迭代的实现。我无法找到PBKDF2 HMAC SHA-512要测试的测试向量。

我很惊讶没有更多的开发者已经在使用这个了。

我不太喜欢回答自己的问题,但是既然评论已经退化为关于速度的讨论,而且还没有人回答,我也可以。

感谢所有评论。

 类似资料:
  • 我正在研究一个已经用MD5(没有salt)散列用户密码的系统。我想使用SHA-512和SALT更安全地存储密码。 虽然这对于将来的密码来说很容易实现,但我也想修改现有的MD5散列密码,最好不强迫所有用户更改他们的密码。我的想法是只使用SHA-512和一个适当的salt来散列现有的MD5散列。然后,我可以在数据库中设置一些标志,指示哪些密码是从纯文本散列出来的,哪些密码是从MD5散列出来的。或者我可

  • 问题内容: 我一直在研究一些有关Java字符串加密技术的信息,但不幸的是,我还没有找到如何在Java中使用SHA-512对String进行哈希处理的很好的教程。我读了一些有关MD5和Base64的博客,但是它们并不像我想要的那样安全(实际上,Base64不是一种加密技术),所以我更喜欢SHA-512。 问题答案: 您可以将其用于SHA-512

  • 作为练习,我用C编写了自己的SHA-512哈希函数实现。我知道它是有效的,因为我从abc 在Base64中。就像在测试现场一样。 我有两个问题: > 如何加密我的密码?如果我有: 我应该创建字符串以输入盐通过="ssssssssmy密钥密码"吗?或者可能以相反的方式?我试图在谷歌上到处寻找答案——我找不到真正合适的东西。 在base64中,我应该使用什么编码来获得像/etc/shadow文件中那样

  • 我想得到的是 使用libnail加密密码salt 我有一个列表的盐,我想用它来加密/解密我的密码。当我加密密码时,我得到一个哈希返回,这样一个似乎可以工作,但在解密时,我总是得到假返回值。 我是否使用了错误的方法对libnaude进行加密/解密,还是完全朝着错误的方向行驶? 我的加密/解密源: 我感谢任何帮助! 多姆

  • 我对密码学是个新手,但是学习。我从网上的研究中收集了许多不同的建议,并制作了自己的类,用于处理哈希、salt、键拉伸以及关联数据的比较/转换。 在研究了内置的。NET密码学库,我发现我拥有的仍然只有SHA-1。但我得出的结论是,这并不坏,因为我使用了哈希过程的多次迭代。对吗? 但如果我想从更健壮的SHA-512开始,我如何在下面的代码中实现它呢?提前谢谢。 注意:我已经参考了很多来自https:/