在散列数据库存储密码时,我总是使用正确的每个条目的盐字符串.根据我的需要,将盐存储在哈希密码旁边的数据库中一直运行正常.
但是,有些人建议将盐与数据库分开存储.他们的论点是,如果数据库受到攻击,攻击者仍然可以构建一个彩虹表,将一个特定的盐字符串考虑在内,以便一次破解一个帐户.如果此帐户具有管理员权限,那么他甚至可能不需要破解任何其他帐户.
从安全角度来看,将盐储存在不同的地方是否值得?考虑在同一台机器上具有服务器代码和DB的Web应用程序.如果盐存储在该机器上的平面文件中,则很可能如果数据库受到损害,则salt文件也是如此.
有什么建议的解决方案吗?
据我了解,生成盐的最佳做法是使用源代码中存储的一些神秘公式(甚至魔术常量).
我正在研究一个我们打算作为开源发布的项目,但问题是源代码是生成盐的秘密公式,因此能够在我们的网站上运行彩虹表攻击.
我认为很多人在我面前都考虑过这个问题,我想知道最佳做法是什么.在我看来,如果代码是开源的话,根本就没有盐,因为盐可以很容易地进行逆向工程.
思考?
所以,我发现你应该将密码与"盐"一起散列.(文章可以在这里和这里找到.)
这是代码:
$password = 'fish';
/* should be "unique" for every user? */
$salt= 'ABC09';
$site_key = 'static_site_key';
hash_hmac('sha1', $password . $salt, $site_key);
Run Code Online (Sandbox Code Playgroud)
现在我需要的方法来保存$password和$saltMySQL中,就像这样:
+---------+--------+----------+-------+
| user_id | name | password | salt |
+---------+--------+----------+-------+
| 1 | krysis | fish** | ABC09 |
+---------+--------+----------+-------+
Run Code Online (Sandbox Code Playgroud)
**fish当然会被散列,而不是以纯文本形式存储.
而我只是想知道这样做是否真的有意义,因为这样一个黑客或谁也知道盐?所以,如果他们破解密码并且看到fishABC09它们,他们会自动知道密码是fish什么?或者他可能"永远"无法破解密码,因为他不知道密码secret_key,因为它没有存储在数据库中?
如果我没有任何意义,我很抱歉.我只是一直用于sha1密码,今天我发现这些文章谈到了添加一个salt.
SHA512比SHA1更复杂,但是与使用512对哈希值进行散列相比,使用SHA1对盐渍密码进行哈希处理会损失多少安全性?就拥有数据库的人破解单个密码所需的时间而言.我使用的框架不能让我轻松访问SHA512,我必须覆盖一些东西以使其工作,所以我想只使用SHA1,虽然在过去我总是使用SHA512.
security ×3
hash ×2
salt ×2
sha1 ×2
cryptography ×1
encryption ×1
mysql ×1
open-source ×1
passwords ×1
php ×1
rainbowtable ×1
sha512 ×1