encryption - 哈希盐除了防止彩虹表攻击之外还有其他用途吗?

标签 encryption hash salt rainbowtable

我听说盐的唯一目的是防止彩虹表攻击,但它肯定有更多的值(value)吗?难道它也不能防止基于字典的攻击吗?那么暴力破解呢,盐有什么用处吗?您能解释一下原因吗?

其次,假设我有一个算法,它采用微时间、128 个字符的盐和 10 亿到 100 亿之间的随机数,并将它们散列在一起。这会提供高水平的安全性吗?因为即使攻击者知道其中一个细节,在我看来,计算其余部分在计算上仍然是不可行的。不过,这是对的吗?

谢谢

编辑:需要澄清的是,攻击者无权访问哈希算法,因此他们无法向系统发送任何垃圾信息。他们所拥有的只是哈希值,并且必须弄清楚它是如何编译的。当然,即使他们知道哈希是如何生成的,尝试用长盐暴力破解所有组合也会变得不现实?

此外,哈希值不是用户的密码或用户名,它只是用于身份验证的随机字符集。因此不需要存储盐和随机数,只需存储生成的哈希值。在这种情况下,用下面的代码表示的上述系统是否是一个很好的系统,可以防止攻击者能够实际猜测用户的哈希可能是什么?

$salt = "some random characters I made up";
hash('sha256', microtime(true).$salt.mt_rand(1000,9999));

我知道这只是 1000-9999,而不是上面提到的数十亿。

再次感谢。

最佳答案

否 - 它只能防止彩虹表攻击。由于攻击者需要为每个密码条目构建彩虹表。因为盐添加了一点香料,可以将密码哈希与其他密码哈希区分开来。

基于字典的攻击和暴力破解攻击本质上是相同的。加盐并不能阻止这些,因为您的验证算法类似于

plain-text-passwd = 'secret provided by user'
salt = getSalt(username) //looks the salt value up in database based on the users username
hash-password-in-db = getPassword(username) // looks up hashed password bassed on users username
if(hash(plain-text-passwd + salt) == hash-password-in-db) //if true, password is correct

通过基于字典和暴力破解的攻击,纯文本密码的值会被用户发送垃圾邮件,而该值又会用盐进行哈希处理。所以加盐没有任何作用

Second, suppose I had an algorithm...

这是没有意义的,您需要根据用户信息表存储所有这些信息,其中 5 个字符的盐值具有相同的目的。

关于encryption - 哈希盐除了防止彩虹表攻击之外还有其他用途吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2368126/

相关文章:

java - 解密位图的像素

node.js - 加密存储在环境变量中的密码

MySQL 电子邮件地址加密

javascript - 在 Node/Express 中散列、加盐并保存密码

asp-classic - 使用 CAPICOM 进行哈希处理和加盐?使用 asp-classic 的 SHA 512

Java Crypto AES/GCM/NoPadding 适用于 Windows,但不适用于 Docker (AEADBadTagException)

c# - 为什么在创建哈希时要将文本转换为字节

c# - .NET 的 HMAC 和 HMAC KeyedHashAlgorithm 有什么区别?

java - 当盐值更改时,基于密码的加密失败

salt - 在基于密码的加密中使用密码盐作为 IV