C# 保持哈希盐的安全,即使是来自开发人员

Posted

技术标签:

【中文标题】C# 保持哈希盐的安全,即使是来自开发人员【英文标题】:C# Keep Hash Salt safe, even from developers 【发布时间】:2020-11-14 22:15:04 【问题描述】:

我们使用 MD5 和 salt 来散列用户密码并存储在数据库中。 但是盐是硬编码在代码中的。

因此,任何有权访问代码和数据库的开发人员都可以使用暴力算法来匹配/重新创建哈希。

有人可以帮助我什么是远离盐的最佳做法,即使是对开发人员也是如此。比方说,我只想限制我(应用程序所有者)访问 salt

我在考虑 U2F 或 HSM,但我不明白它们如何适合这里。

我不想为每个用户使用随机/不同的盐,因为它不能解决我的问题。我仍然必须将这些盐保存在数据库中,以便开发人员可以访问。

注意:我想保护开发应用程序的内部用户/开发人员的密码

谢谢

【问题讨论】:

这能回答你的问题吗? The necessity of hiding the salt for a hash @KlausGütter 这个线程解决了类似的问题,但没有人提供任何解决方案。我有一个解决方案,但我正在寻找最佳实践,专家们正在使用它。这是一个非常正常和真正的问题,但似乎没有人满足它。 我的想法是创建和托管我自己的密码服务。开发人员调用此密码服务来获取密码的哈希值。所以 CreateUser/SetPassword APi 调用 --> PasswordService 来获取哈希。并且服务代码仅供我个人使用。 Imo 你最大的问题是硬编码的盐。 salt 的整个想法是为每个用户提供一个唯一的值,因此一旦黑客知道了 salt 值,他就必须对每个用户进行暴力破解,而不是对整个数据库进行一次暴力破解。之后你担心的是暴力破解单个用户的成本可能仍然太便宜,但你需要改变其他东西而不是盐来更强大 SHA 并不比 MD5 好,因为它们仍然运行得很快,因此可以进行暴力破解。是的,你需要一个盐,但保护它并不是带来真正安全的东西,单点故障不一定是散列服务器,而是 - 你被公共汽车撞了,然后获取盐的途径与您同归于尽。我是说您需要通过使其花费很长时间来消除暴力破解的动机。例如,一种每秒只能进行 X 次哈希的哈希算法,X 是每秒有多少用户登录的一个因素。一个慢速算法的盐是人人皆知的 【参考方案1】:

您当前加密盐的想法所遇到的问题仅仅是“将罐子踢得更远” 为了可用,盐需要被解密,这意味着代码必须知道如何进行解密,什么时候意味着开发人员将知道代码如何解密及其参数

当然,您可以只将解密密钥保存在内存中的安全字符串中,永远不要将其保存到磁盘并创建一个界面,让公司 CEO 从他携带的 USB 中(通过加密连接)粘贴密钥在他脖子上的一条链子上,上面有指纹锁……等等……每次服务器重新启动时,他都需要这样做……

根据 cmets,可以轻松地将单个盐切换为每个用户的盐,但是您的流氓开发人员可能仍然知道值得攻击的用户,因此如果只有少数几个可能没有多大帮助他们。

您确实需要查看慢得多的哈希算法(每秒执行数十亿次 MD5 哈希的设备已经存在了很长时间),这意味着暴力破解密码是不可行的。当然,这些需要权衡取舍;它们在计算上为您的服务器做更多的工作,并且通过故意实现一些缓慢且占用大量资源的东西,您可以为 DOS 攻击排好队,然后需要通过单独的方式进行缓解。

如果这种情况正在发生,立即解决您的问题的方法是更改​​所有用户的密码并让他们将其重置为其他密码。您可以检测它们是否将它们更改回原来的状态(因为新的哈希将与您在更改所有内容之前创建的备份表中的哈希相同)。这具有让您的用户知道您已被入侵的副作用,但是如果您需要避免透露您已经被入侵,您可以装扮成“令人敬畏的安全系统已检测到可疑活动并为他们的安全锁定了他们的帐户”妥协。处理由此对公司形象造成的影响并不是我保证可以一劳永逸的事情,但这对你的营销部门来说是个问题,而不是 SO..

【讨论】:

我的计划是创建和托管密码服务。除了我,没有人可以访问它或源代码。当然,我必须为其他服务打开套接字或 http 连接才能调用 GetHashedValue() 方法。【参考方案2】:

盐有它自己的工作,当攻击者知道存储的哈希值时,它可以减少彩虹表的使用。您要防止的是完全不同的威胁,因此我们应该让盐发挥作用并使用不同的解决方案。另请参阅我关于 safely storing passwords 的教程。 BTW MD5 适合存储密码,请改用 BCrypt、Argon2、PBKDF2 或 SCrypt 等密码哈希函数。

您可以做的是,使用额外的服务器端密钥加密已经计算的哈希值。如果需要,可以将此加密/解密委托给另一台服务器上的服务 (HSM)。

特别是如果你想防止内部攻击,你应该切换到上面提到的哈希算法之一,每个密码都有一个唯一的盐,它们可能是你免受成功暴力攻击的唯一保护,MD5 也是如此速度快,可以以 100 Giga MD5/sec 的速度计算。

【讨论】:

以上是关于C# 保持哈希盐的安全,即使是来自开发人员的主要内容,如果未能解决你的问题,请参考以下文章

App Store Connect 添加用户时允许开发人员资源复选框

敏捷开发

前端开发人员的十个安全建议,做了以后老板给你点赞(转载)

开发人员的 iOS6 差异 [关闭]

C# 中对重返 .NET 的开发人员来说非常棒的新特性

即使目标不起作用,也必须为开发人员设定目标[关闭]