gpt4 book ai didi

c# - 我的代码真的需要 8 年左右的时间才能破译吗

转载 作者:行者123 更新时间:2023-11-30 12:50:11 25 4
gpt4 key购买 nike

在简明扼要的书中阅读 C# 的散列主题时,我偶然发现了以下引述!

You can provide additional protection against dictionary attack by “stretching” your password hashes—repeatedly rehashing to obtain more computationally intensive byte sequences. If you rehash 100 times, a dictionary attack that might otherwise take 1 month would take 8 years.

所以我是这样实现的!

byte[] data = Encoding.UTF8.GetBytes("Password is 12345679");
byte[] hash = SHA512.Create().ComputeHash(data);
int temp=0;
while (temp < 100)
{
hash = SHA512.Create().ComputeHash(hash);
temp++;
}

上面的代码对吗?字典攻击真的需要 8 年左右的时间才能破译吗?

最佳答案

在没有捷径的情况下(正如@Random832 所指出的),人们应该预计暴力测试已经被哈希 100 次的东西需要 100 倍的时间。如果攻击者正在查看每个字符序列以寻找匹配的散列,那么任何使该散列花费更长时间的事情都会减慢他的速度(或者等价地,使用更多的计算能力)。

继续从 Random832 窃取,这是一个“穷人的拉伸(stretch)”。它足够有用,但如果您有可用的 PBKDF2 函数,那是首选,因为密码学家对 PBKDF2 进行了很好的分析。从最严格的意义上讲,您上面的代码是“基于密码的 key 派生函数”(PBKDF),但 PBKDF2 是一个特定的代码。编辑:我不是 C# 开发人员,但看起来 .NET 确实包含 PBKDF2 函数 Rfc2898DeriveBytes

不过请注意上面文本中的关键短语:“否则可能需要 1 个月。”作者假设完成第一个需要一个月的时间,而 8 年大约是 100 个月。如果第一次执行字典攻击需要 1 分钟,那么第二次执行此操作应该需要大约 1.5 小时。这里没有神奇的“8 年”。它只是第一个数字的 100 倍,无论第一个数字是什么。

编辑:关于拉伸(stretch)还有一点需要注意。在拉伸(stretch)之前,你应该总是撒盐。加盐意味着您将一系列随机字节添加到密码的开头。然后,您将该盐与哈希结果一起编码(盐不是 secret )。因此,与其散列“密码是 12345679”,不如散列“deadbeefPassword 是 12345679”,然后将明文发送“deadbeef”以及最终结果。您这样做的原因是人们总是选择相同的密码。因此,如果攻击者计算出散列“Passw0rd!”的结果然后他可以根据您的哈希检查该结果。便宜得多。类似地,如果他同时拥有 Alice 和 Bob 的散列值,他可以判断它们是相同的还是不同的。但是如果使用随机盐,则无法做到这一点,因为几乎可以肯定 Alice 和 Bob 将使用不同的盐对他们的数据进行哈希处理。

关于c# - 我的代码真的需要 8 年左右的时间才能破译吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9737744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com