security - 对加盐(密码学)感到困惑吗?

标签 security cryptography passwords sha1 salt

我是这方面的新手,所以这个问题很可能很简单。我只是不太明白加盐。

无需加盐并使用 sha1,您可以将密码哈希为 sha1('password') 并验证用户,只需比较 sha1_stored ==? sha1(用户输入)。

通过加盐和 sha1,您可以将密码哈希为 sha1('password' + salt),但我不知道如何验证它。

根据我读到的内容,盐总是随机的。因此,如果您 sha1('password' + random_salt1),是否必须将 random_salt 存储在某处,因为当您验证 sha1('password' + random_salt1) == 时? sha1(user_input + random_salt2),你不能保证random_salt1 == random_salt2。或者盐像 site_key (一种随机盐,但整个站点只存储一个盐)?我知道盐如何提高安全性,但我不确定如何正确实现它,以便我可以验证我存储的内容(也不知道这一点)。那么有人可以向我解释一下这一点,并可能给我一个加盐和验证字符串的示例吗?

最佳答案

是的,你必须将随机盐存储在某个地方。

不,您不应该让整个网站都相同,因为它完全违背了加盐的目的。

加盐的目的是提高整个密码列表的安全性。如果您不加盐,并且您的数据库遭到破坏,攻击者就会获取您的所有帐户和密码。如果它们没有加盐,攻击者只需 sha1 一堆单词,并将所有所有 sha1 密码进行比较。其中一些会与某些密码匹配,然后某些帐户就会被盗用。

通过加盐,攻击者必须独立地操作每个密码,从整个单词词典开始,对它们进行加盐、散列,然后将它们与加盐、散列的密码进行比较。您可以看到,这会降低效率,因为攻击者每次都必须更改盐。通过这种方式,从受损的数据库中获取密码就变得更加困难。

存储盐的一种常见方法是将其附加或添加到哈希值并将其存储在数据库中。由于盐和哈希的长度已知,因此很容易将它们独立地拉出来。

关于security - 对加盐(密码学)感到困惑吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7590471/

相关文章:

java - 与 Spring Security 的 Cors

security - 什么是学习系统安全的好资源列表?

从数据库读取时PHP清理字符串

Neo4J:命令失败:未设置初始密码,因为检测到实时 Neo4j 用户

ruby-on-rails - Rails 4 - 仅当当前密码正确时才允许更改密码

security - 公司中的 PGP 密码

c - 实现公平硬币翻转

c++ - OpenSSL EVP_DigestSignFinal 段错误

.net - 在 .NET 中使用 AES 加密 - CryptographicException 表示填充无效且无法删除

sql - 关于在数据库中保存密码的问题