我有一个邮件服务器,它用下面的sql在mysql数据库中存储邮箱的密码:
ENCRYPT([PASSWORT], concat(_utf8"$1$", right(md5(rand()), 8), _utf8"$"))但是数据库中没有存储任何盐。
现在我需要围绕这个数据库构建一个登录过程,但是很难比较存储的密码,因为缺少盐。我注意到,密码散列本身以以下形式保存盐:
$1$[SALT]$[PASSWORD-HASH]如何创建类似的密码哈希来构建登录?
Dovecot能够使用存储的密码登录用户,但是如何登录呢?
发布于 2013-02-11 04:03:15
MySQL ENCRYPT() function调用crypt(3) Unix library function,后者实现各种密码散列算法。要使用的特定算法由salt参数选择,该参数应以用美元符号括起的算法标识符开头;例如,以$1$开头的盐对应于old MD5-based hashing scheme by Poul Henning-Kamp。
(选择算法的这种相当奇怪的方式的原因是历史悠久的;1976年的原始基于DES的加密(3)设计不支持替代散列算法,因此必须在现有接口中硬塞一种指定它们的方法,以便保持与旧密码数据库的兼容性。事实证明,由此产生的系统非常好和灵活,即使它乍看起来有点奇怪。)
无论如何,所有的crypt(3)散列算法(包括original DES-based one)总是在输出的开始处包含salt (以及嵌入其中的算法标识符),并且忽略附加到salt输入末尾的任何额外数据。因此,要验证密码散列,只需将原始散列作为盐输入到ENCRYPT()中,并检查它是否等于输出:
SELECT user_id,
password_hash = ENCRYPT('password', password_hash) AS password_is_correct
FROM user_table WHERE user_id = 12345;https://stackoverflow.com/questions/14800944
复制相似问题