【发布时间】:2017-12-28 18:05:24
【问题描述】:
password_hash() (http://php.net/manual/en/function.password-hash.php) 的 PHP 手册说:
使用的算法、成本和盐作为散列的一部分返回。因此,验证哈希所需的所有信息都包含在其中。
我的问题是:为什么?
我在另一个 SO 答案中读到了这个:(Static Salt vs Random Salt - Security PHP)
随机盐有一个巨大的好处。如果系统中的所有帐户都使用相同的盐,攻击者可以暴力计算该盐的哈希值,并通过一次计算运行侵入所有帐户。
我明白了。但是,password_hash() 将盐嵌入返回的哈希中,我相信这会将其公开,因此攻击者知道每个密码的盐。
用长的私盐不是更好吗?
我能想到的一件事是,使用相同盐创建的哈希值对于相同的密码是相同的,并且可能允许攻击者通过对数据库中的哈希值进行统计分析来取得进展。
但是,这可能会通过使用私有哈希字典而不是仅使用一个字典来缓解,但在 PHP 7 中使用 password_hash() 不再可能。
我不是安全专家,我相信 PHP 人员知道他们在做什么,所以我很高兴听到为什么 password_hash() 方式被认为是正确的方式。
【问题讨论】:
-
访问您的数据库的攻击者可能也可以访问您的文件系统,能够读取“私有”salt。为每个散列设置唯一的盐可以防止攻击者为特定盐创建彩虹表并将其与数据库中的所有散列进行比较,他必须单独针对每个散列。
标签: php security hash passwords salt