我需要为登录服务创建一些散列类(C#),其中(不幸的是)密码需要存储在SQL server数据库中。在过去,我一直在使用BCrypt或PBKDF2,但也存在一些问题。这是针对在美国运行的企业级解决方案。我看到3条有效的路径,我希望你能对此发表评论。
BCrypt:不是NIST标准,这可能是某些客户所需要的。我也不愿意在企业级软件中使用BCrypt,因为我需要一家大公司或一些专门的开发人员支持的东西。我所能找到的只是一些(旧的)实现,这些实现是由一个人在业余时间维护的。这难道不应该引起一些担忧吗?我的意思是,虽然它本身是伟大的,但它的实现可能不是。当然也必须维持下去。
2016年迭代(工作因素)建议是什么- 12?
PBKDF2:我为C#找到的唯一解决方案是Microsofts "PasswordHasher“(或类似的Rfc2898DeriveBytes实现)。发布的版本使用HMAC SHA1进行1000次迭代。这在2016年似乎是无效的。有一个更新的版本这里,但这似乎是在Nuget的预发行版。在任何情况下,这也只是使用静态迭代计数为10000的HMAC SHA256。我预计2016年这一数字至少会达到256000。此外,如果您查看代码,实现会在幕后调用一些Win8Pbkdf2Provider,这往往是BCrypt派生(无论如何,使我的NIST需求变得很困难)。
SHA1 + AES:另一种方法是使用标准Rfc2898DeriveBytes使用SHA1,然后使用SHA1加密数据库值--将AES密钥存储在磁盘上。我最喜欢这种方法,但是如果你搜索这些东西,这个解决方案永远不会浮出水面,所以我可能遗漏了什么.
你们有什么建议?当您研究保护企业级软件时,您会做什么?
发布于 2016-09-05 09:27:11
你的实际要求是什么?“企业级”并不能说明什么,至少不会超过一个大型项目。如果NIST是一个要求,那么PBKDF2就是您所拥有的全部。从安全的角度来看,我推荐bcrypt,因为它比基于SHA变体的PBKDF2稍微安全一些。bcrypt本身已经烤了足够长的时间,可以成为PBKDF2的一个很好的替代方案,尽管NIST没有提到它(目前为止)。
当涉及到实现时,您确实应该使用一个完善的库。您不希望手动检查实现细节,您也不应该。快速搜索发现,C#有几个bcrypt实现,这些实现在C#社区中得到了很好的支持。
有关PBKDF2 2对bcrypt的更多细节,请参见Thomas的答案。
我不会使用SHA1+AES选项。这样做并不能真正解决问题,只会减轻某些类型攻击的风险。不过,如果应用程序以某种方式泄漏数据库内容,则只能信任SHA1。我觉得这就像个黑客,而你最不想做的就是自己做点什么。
发布于 2016-09-05 11:49:19
我看不出有什么理由不使用BCrypt,有一个很好的库名为BCrypt.Net。
安全性来自于算法,而不是实现,因此您可以直接与其他知名库检查结果。可能出错的是安全的随机盐的产生。但是,如果查看源代码,可以看到它们使用了来自DotNet库的加密随机数生成器,因此这是正确的。
https://security.stackexchange.com/questions/135893
复制相似问题