我的数据库为每个用户存储唯一的盐。
我正在为一个应用程序创建一个登录脚本,其中每个用户都有自己独特的盐,这是我计划如何实现登录。
- 用户输入详细信息并发送
- 发送用户名,脚本检查是否存在
- 如果是,则返回该用户的盐,否则返回一般错误
我需要脚本为该用户返回盐,因为否则我的应用程序如何验证提交的密码是正确的,当它不能在没有盐的情况下散列密码并将其发送回来?
这是我不确定的。盐是否加密有关系吗,因为黑客可以看到它是什么,看到密码哈希,也许可以对它做点什么。我应该在发送之前加密盐吗?
也许我在下面的回复中没有理解或忽视一些东西。
它并不重要如果你的盐是散列的还是作为普通字符串留下的-重要的一点是盐密码可以防止直接使用字典/彩虹表攻击来暴力破解密码。另一个好处是,每个用户都有一个不同的散列密码。
盐类是随机生成的字符串,在服务器端创建,不涉及任何形式的传输到或从浏览器。
在您的服务器上:
// Password from form
$pw = $_GET['password'];
// Generate salt using unique values
$salt = (rand(8).$registration_date.$username);
// Password to be hashed
$pwthb = ($pw.$salt);
如果黑客获得了对你的数据库的访问权,那么在大多数情况下,你的游戏就结束了,因为你需要存储初始随机盐以进行哈希比较。
一个简单的例子:
- 用户注册时在浏览器中输入初始密码
- 在您的服务器上,密码与唯一的盐组合,散列并作为密码存储在DB 中
- 盐存储在DB
注意:哈希可以使用PHP或使用MySQL/DB函数
用户返回时:
- 用户在浏览器中输入密码
- 从DB中抓取盐,并结合输入的密码
- 哈希密码+盐,并与存储/哈希密码进行比较
- 如果匹配:authenticate
就进一步阅读而言,以下内容可能值得一看:
- 用密码/明文加密盐值是直接哈希的可行替代方案吗?
- 隐藏哈希的盐的必要性
- 如何在分布式环境中储存盐