在一次讨论中,我意识到我所做的并不是给密码加盐,而是给它们加上胡椒粉。从那以后,我就开始使用这两种功能,比如:
hash_function($salt.hash_function($pepper.$password)) [multiple iterations]
忽略所选择的哈希算法(我希望这是一个关于盐和胡椒的讨论,而不是特定的算法,但我使用的是一个安全的算法) ,这是一个安全的选项,还是我应该做一些不同的东西?对于那些不熟悉这些术语的人:
盐是一个随机生成的值,通常与数据库中的字符串存储在一起,目的是使用哈希表破解密码成为不可能。由于每个密码都有自己的 salt,因此必须对它们分别进行强制破解; 但是,由于 salt 存储在具有密码 hash 的数据库中,因此数据库折衷意味着同时失去这两个元素。
Pepper是与数据库分开存储的站点范围内的静态值(通常在应用程序的源代码中硬编码) ,它应该是保密的。它的使用是为了使数据库的妥协不会导致整个应用程序的密码表成为强制的。
我是否遗漏了什么东西,并且在我的密码上撒盐和胡椒粉是保护用户安全的最佳选择?这样做有什么潜在的安全漏洞吗?
注意: 为了讨论的目的,假设应用程序和数据库存储在单独的机器上,不共享密码等,所以数据库服务器的破坏并不自动意味着应用程序服务器的破坏。