为了账号安全,请及时绑定邮箱和手机立即绑定

最佳做法:添加密码?

最佳做法:添加密码?

米脂 2020-02-04 14:05:13
我遇到了一个讨论,在那次讨论中,我了解到我实际上并不是在给密码加盐,而是在给它们添加胡椒粉,从那时起,我就开始使用以下功能:hash_function($salt.hash_function($pepper.$password)) [multiple iterations]忽略选择的哈希算法(我希望这是关于盐和胡椒的讨论,而不是特定算法的讨论,但是我使用的是安全算法),这是安全的选择还是我应该做一些不同的事情?对于不熟悉的术语:甲盐是通常存储与设计,使其不可能使用哈希表来破解密码的数据库中的字符串中的随机生成值。由于每个密码都有自己的特色,因此必须将所有密码单独强行破解。但是,由于盐与密码哈希一起存储在数据库中,因此数据库泄密意味着同时丢失两者。甲胡椒是从中旨在是秘密的数据库(在应用程序的源代码通常硬编码)分开存储站点范围静态值。使用它是为了避免对数据库的损害,不会导致整个应用程序的密码表都是蛮力的。我有什么想念的吗?给密码加盐和胡椒粉是保护用户安全的最佳选择吗?这样做是否存在潜在的安全缺陷?注意:出于讨论目的,假设应用程序和数据库存储在单独的计算机上,不共享密码等,因此违反数据库服务器并不意味着违反应用程序服务器。
查看完整描述

3 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

盐和胡椒粉的要点是增加称为彩虹表的预先计算的密码查找的成本。

通常,很难为单个哈希找到冲突(假设哈希是安全的)。但是,如果哈希值很短,则可以使用计算机将所有可能的哈希值生成到硬盘上的查找表中。这称为彩虹表。如果创建了彩虹表,则可以进入世界,并快速找到任何(未加盐的未配粉)哈希的合理密码。

胡椒的重点是使破解您的密码列表所需的彩虹表独特。因此,浪费了更多的时间来攻击者来构建彩虹表。

然而,重点在于使每个用户的彩虹表对于用户而言是唯一的,从而进一步增加了攻击的复杂性。

确实,计算机安全的要点几乎是从来没有(在数学上)使其不可能,而在数学和物理上都不可行(例如,在安全系统中,它将利用Universe中的所有熵(甚至更多)来计算单个用户的密码)。


查看完整回答
反对 回复 2020-02-04
?
哔哔one

TA贡献1854条经验 获得超8个赞

首先,我们应该谈一谈胡椒粉的确切优点:


Pepper可以保护弱密码免受字典攻击,在特殊情况下,攻击者可以读取数据库(包含哈希),但不能访问Pepper的源代码。

典型的情况是SQL注入,丢弃备份,丢弃服务器...这些情况并不像听起来那样罕见,并且通常不受您的控制(服务器托管)。如果您使用...


每个密码唯一的盐

像BCrypt这样的慢速哈希算法

...强大的密码受到了很好的保护。在那种情况下,即使知道了盐,也几乎不可能强行使用强密码。问题是弱密码,它是蛮力字典的一部分,或者是它们的派生产品。字典攻击将很快显示出这些信息,因为您仅测试最常用的密码。


第二个问题是如何使用胡椒粉?


通常推荐的应用胡椒的方法是在将密码和胡椒传递给哈希函数之前,将密码和胡椒结合起来:


$pepperedPassword = hash_hmac('sha512', $password, $pepper);

$passwordHash = bcrypt($pepperedPassword);

不过,还有另一种更好的方法:


$passwordHash = bcrypt($password);

$encryptedHash = encrypt($passwordHash, $serverSideKey);

这不仅允许添加服务器端机密,还允许交换$ serverSideKey(如果需要)。这种方法需要更多的工作,但是如果代码一旦存在(库),则没有理由不使用它。


查看完整回答
反对 回复 2020-02-04
  • 3 回答
  • 0 关注
  • 608 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信