我们使用MD5和salt对用户密码进行散列并存储在数据库中。但是盐是硬编码的。
因此,任何有权访问代码和数据库的开发人员都可以使用暴力算法来匹配/重新创建哈希。
有人能帮我什么是最好的做法来避免盐,甚至是开发者。比方说,我想限制我(应用程序所有者(访问salt
我一直在考虑U2F或HSM,但我不知道它们在这里有多合适。
我不想为每个用户使用随机/不同的salt,因为它不能解决我的问题。我仍然需要将这些salt保存在数据库中,以便开发人员可以访问。
注意:我想保护密码不受开发应用程序的内部用户/开发人员的攻击
感谢
当前加密salt的想法所遇到的问题只是"把罐子踢得更远";为了可用,盐需要解密,这意味着代码必须知道如何进行解密,何时意味着开发人员将知道代码如何进行解密及其参数
当然,你可以只将解密密钥保存在内存中的一个安全字符串中,永远不要将其保存到磁盘上,并创建一个接口,让公司首席执行官从脖子上挂着一条带指纹锁的USB上粘贴密钥(通过加密连接(。。他需要在每次重新启动服务器时都这样做。。
根据评论,拥有一个salt可以很容易地切换为每个用户的salt,但你的流氓开发者可能仍然知道值得攻击的用户,所以如果只有少数用户,这可能不会有多大帮助。
你真的需要看看一个慢得多的哈希算法(每秒进行数十亿次MD5哈希的设备已经存在很长时间了(,这意味着暴力强制密码是不可行的。当然,这些都是有代价的;对于你的服务器来说,它们在计算上要多得多,通过故意实现一些速度慢、占用大量资源的东西,你可以为DOS攻击做好准备,然后需要通过单独的手段来缓解。
如果这种情况正在发生,立即解决问题的方法是更改所有用户的密码,并让他们将其重置为其他密码。您可以检测他们是否将其更改回以前的状态(因为新的哈希值将与您在更改所有内容之前创建的备份表中的哈希值相同(。这样做的副作用是让你的用户知道你已经被妥协了,但你可以把它伪装成你的";令人敬畏的安全系统已经检测到可疑活动,并为了他们的安全锁定了他们的账户;如果你需要避免暴露你已经妥协了。处理这件事对公司形象的影响我保证不会被掩盖,但这是你的营销部门的问题,而不是…
salt有自己的工作,当攻击者知道存储的哈希时,可以减少彩虹表的使用。你想要预防的是一种完全不同的威胁,所以我们应该让盐发挥作用,使用不同的解决方案。另请参阅我关于安全存储密码的教程。BTW MD5不适合存储密码,请使用BCrypt、Argon2、PBKDF2或SCrypt等密码哈希函数。
您可以做的是,使用额外的服务器端密钥加密已经计算好的哈希值。如有必要,可以将此加密/解密委托给另一台服务器上的服务(HSM(。
特别是如果你想保护自己免受内部攻击,你应该切换到上面提到的哈希算法之一,每个密码都有一个唯一的salt,它们可能是你免受成功暴力攻击的唯一保护,MD5太快了,可以以100千兆MD5/秒的速度计算。