首页 > 解决方案 > C# 保持哈希盐的安全,即使是来自开发人员

问题描述

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

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

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

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

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

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

谢谢

标签: c#securityhashpasswordssalt

解决方案


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

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

根据评论,可以轻松地将单个盐切换为每个用户的盐,但是您的流氓开发人员可能仍然知道值得攻击的用户,因此如果只有少数几个用户,它可能无济于事。

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

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


推荐阅读