【发布时间】:2012-03-26 01:23:36
【问题描述】:
我正在设计一个如下工作的身份验证系统:
- 用户输入密码
- 生成盐。
- 使用漩涡对密码进行哈希处理
- Whirlpool 哈希密码与纯盐连接
- 连接的版本使用 sha1 进行哈希处理并存储在数据库中。
- 我通过在应用层对密码进行哈希处理来检查密码是否正确,然后执行此操作(在 MySQL 中):
MySQL
WHERE `Password` = SHA1(CONCAT('$hashedPassword',`Salt`)) AND [..]
目前我的盐是 64 字节。这足以使字典攻击不可行吗?
我确定 sha1 存在已知漏洞,但它是我的 MySQL (5.1) 版本中唯一可用的函数,我可以在数据库层使用,而不是在应用程序和数据库之间的连接上选择普通 salt层。
【问题讨论】:
-
64 字节听起来方式足够长。但我一定是错过了什么。以后如何验证密码?您需要使用与保存时相同的盐重复哈希序列,但您不会将盐存储在任何地方,只有盐的 SHA-1 和其他东西。
-
应用层只关心whirlpool对明文密码进行散列。它以
SHA1(CONCAT(PHP_WHIRLPOOL('correct horse battery staple'), Salt))的形式存储在 MySQL 中,其中 PHP_WHIRLPOOL 发生在应用程序上。希望这是有道理的? :) -
是的,该伪代码与我认为您在文本中的意思相符。所以我还是不明白你是如何重复操作进行验证的。我想也许您的意思是说 SHA-1 结果 和 盐都存储在 MySQL 中?
-
是的,哈希密码和盐的sha1结果存储在密码字段中。
-
@Will Morgan: Soo,那你要如何验证密码呢?您需要将盐存储在单独的数据字段中。另外,盐的长度并没有太大的影响,只要它足够长以至于已经存在彩虹表的概率非常低(这里8字节应该绰绰有余)。
标签: security encryption cryptography passwords salt