我的密码真的需要8年左右才能破译吗

本文关键字:左右 8年 密码 真的 我的 | 更新日期: 2023-09-27 18:27:57

在一本简单的书中阅读C#的哈希主题时,我发现了以下引号!

您可以通过以下方式提供针对字典攻击的额外保护"拉伸"你的密码散列——反复重新散列以获得更多计算密集型字节序列如果你重复使用100次,a否则可能需要1个月的字典攻击将需要8个月年

所以我是这样实现的!

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年左右才能破解吗?

我的密码真的需要8年左右才能破译吗

在没有快捷方式的情况下(正如@Random832所指出的),人们应该期望用100倍的时间来强力测试被散列了100次的东西。如果攻击者正在查看每个字符序列,以寻找匹配的哈希,那么任何使该哈希花费更长时间的操作都会减慢他的速度(或者等效地,使用更多的计算能力)。

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

不过,请注意上面文本中的关键短语:"否则可能需要1个月。"作者假设第一次需要一个月,8年大约是100个月。如果对第一个进行词典攻击需要1分钟,那么对第二个进行字典攻击大约需要1.5小时。这里没有神奇的"8年"。它只是第一个数字的100倍,不管第一个数字是什么

编辑:关于拉伸还有一点需要注意。伸展前你应该经常加盐。Salting意味着在密码的开头添加一系列随机的字节。然后将salt与散列结果一起编码(salt不是秘密)。因此,与其散列"密码是12345679",不如散列"deadbeef密码是1234567",然后将"deadbeaf"与最终结果一起发送到clear中。你这样做的原因是人们总是选择相同的密码。因此,如果攻击者计算出哈希"Passw0rd!"的结果,那么他可以将该结果与您的哈希进行比较。便宜多了。同样,如果他同时拥有爱丽丝和鲍勃的散列,他就能判断出它们是相同还是不同。但对于随机盐,你不能这样做,因为几乎可以肯定的是,爱丽丝和鲍勃会用不同的盐对他们的数据进行散列。

这是错误的,您只是在做另一个与初始哈希具有相同总体特征的哈希。

一个好的黑客会诱骗你访问一个充斥着十几个漏洞的网站,以此为基础在你的机器上安装一个击键记录器,然后通过电子邮件向自己发送一份你在接下来一两个月内键入的所有内容的日志。那个黑客会轻而易举地得到你的密码。