3 回答
TA贡献1784条经验 获得超8个赞
盐和胡椒粉的要点是增加称为彩虹表的预先计算的密码查找的成本。
通常,很难为单个哈希找到冲突(假设哈希是安全的)。但是,如果哈希值很短,则可以使用计算机将所有可能的哈希值生成到硬盘上的查找表中。这称为彩虹表。如果创建了彩虹表,则可以进入世界,并快速找到任何(未加盐的未配粉)哈希的合理密码。
胡椒的重点是使破解您的密码列表所需的彩虹表独特。因此,浪费了更多的时间来攻击者来构建彩虹表。
然而,重点在于使每个用户的彩虹表对于用户而言是唯一的,从而进一步增加了攻击的复杂性。
确实,计算机安全的要点几乎是从来没有(在数学上)使其不可能,而在数学和物理上都不可行(例如,在安全系统中,它将利用Universe中的所有熵(甚至更多)来计算单个用户的密码)。
TA贡献1854条经验 获得超8个赞
首先,我们应该谈一谈胡椒粉的确切优点:
Pepper可以保护弱密码免受字典攻击,在特殊情况下,攻击者可以读取数据库(包含哈希),但不能访问Pepper的源代码。
典型的情况是SQL注入,丢弃备份,丢弃服务器...这些情况并不像听起来那样罕见,并且通常不受您的控制(服务器托管)。如果您使用...
每个密码唯一的盐
像BCrypt这样的慢速哈希算法
...强大的密码受到了很好的保护。在那种情况下,即使知道了盐,也几乎不可能强行使用强密码。问题是弱密码,它是蛮力字典的一部分,或者是它们的派生产品。字典攻击将很快显示出这些信息,因为您仅测试最常用的密码。
第二个问题是如何使用胡椒粉?
通常推荐的应用胡椒的方法是在将密码和胡椒传递给哈希函数之前,将密码和胡椒结合起来:
$pepperedPassword = hash_hmac('sha512', $password, $pepper);
$passwordHash = bcrypt($pepperedPassword);
不过,还有另一种更好的方法:
$passwordHash = bcrypt($password);
$encryptedHash = encrypt($passwordHash, $serverSideKey);
这不仅允许添加服务器端机密,还允许交换$ serverSideKey(如果需要)。这种方法需要更多的工作,但是如果代码一旦存在(库),则没有理由不使用它。
添加回答
举报