在C#ASP.NET中添加自定义hashAlgorithmType

我有一个页面,我需要加强安全性。 我正在使用内置的MembershipProviderfunction,并且当前将hashAlgorithmType设置为SHA512。 我有BCrypt.NET库(http://bcrypt.codeplex.com/),当我从代码调用它的函数时似乎工作得很好但是我遇到了最糟糕的时间来弄清楚如何创建适当的Web.config中的部分让我创建一个hashAlgorithmType

我在网上找到了以下代码段:

               

如果你愿意的话,叫我一个菜鸟,但我显然没有必要的知识来做出正面或反面。 我需要的是一种方法来告诉成员资格提供者像这样的东西对应于string hashed = BCrypt.HashPassword(password, BCrypt.GenerateSalt(12)); 加密和bool matches = BCrypt.CheckPassword(candidate, hashed); 解密。 请告诉我一个简单的答案。 如果必须的话,我可以从头开始重写登录系统,但我已经有了一个工作实现,我真的只想改变哈希算法。

我相信配置模式必须应用于machine.config文件; 如果您需要能够轻松地推出此代码,这不一定是一个很好的举措。

您可以通过调用AddAlgorithm以编程方式向CryptoConfig类注册BCrypt加密原语,该名称可以在以后使用。

只要BCrypt哈希提供程序实现HashAlgorithn您应该能够简单地注册它,您也可以通过调用HashAlgorithm.Create(string)来测试它,并使用您用来validation它是否正确构建算法的名称。

然后,会员提供商应该能够毫无问题地使用它。 这是一篇关于这个主题的好文章 。

更新

(深呼吸) – 道歉,如果这是tl;博士。

好的,所以阅读了关于BCrypt.Net的密码哈希 – 它显然很好,并遵循公认的做法。 它也与HashAlgorithm类的工作方式完全不兼容,因为它需要额外的状态才能实现它的魔力,并且不能简单地扩展为实现HashAlgorithm契约。

因此,您可以选择 – 坚持使用MembershipProvider并使用SHA512 – 您正在谈论加强页面上的安全性,所以我认为可能存在身份validation本身的问题,而不是密码的存储(当然,这仍然必须正确完成) – 所以考虑简单地确保通过HTTPS发送身份validation流量(如果尚未发送)。

盲目使用密码拉伸算法有其自身的问题 – 请参阅我自己最近关于此主题的SO的回复 – 如果您在服务器上进行拉伸,则可能最终导致对该站点的DOS攻击!

正如您所建议的那样,另一个选项是完全自己管理会员资格 – 因此您可以使用您想要的任何类型并手动管理必要的密码信息存储。

我的网站现在使用的算法非常类似于PBKDF2,我从Bruce Schneier和Niels Ferguson的书“Practical Cryptography”中提取,我使用512位随机盐和SHA512(存储便宜)加上数千次迭代来散列明文。 服务器每个appdomain对自己进行一次基准测试,以建立等同于毫秒范围的“级别”保护 – 因此,即使硬件改进,新的散列密码也会随着时间的推移获得恒定的保护级别。 该库也是独立的,如果我们必须在SQL级别生成密码记录,我已经能够将它部署到SQL Server 2008 R2以提供CLR SP。

但这只保护密码 – 然后你需要一个可以保护登录行为的认证机制; 加上另一个用于保护经过身份validation的会话令牌的系统(.Net的Authentication Cookie系统实际上非常有用)。

接下来我已经花了一周时间实现SCRAM原语,然后插入我的MVC Web服务进行身份validation,我打算做同样的事情来启用使用Javascript从Web浏览器登录(锁定非JS客户端) )。 客户端的关键是进行所有哈希计算; 因此我坚持使用SHA,因为成熟的实现几乎可以在任何环境中使用(例如我们也有iPhone应用程序 – 他们也需要进行身份validation)。

但是,在你的情况下,对于MembershipProvider的现有投资,我会考虑512位SHA加SSL和Asp.Net的auth cookie足够 – 只要数据库真的安全(!)并且你没有SQL注入在网站上的洞。

对于HashAlgorithm的BCrypt实现,请参阅我在此处对类似问题的回答。

您需要在我的答案中使用示例代码创建一个已签名的程序集,然后根据需要修改您的设置:

       

为了能够注册自定义hashAlgorythmType,您需要的第一件事是实际实现HashAlgorythm的类型。 如果BCrypt实现它,那是你的幸运日,但显然它没有实现它,所以这是你的问题。

实际上没有解决方法,因为实现HashAlgorithm是能够像这样注册它的要求。

所以你需要做的就是在BCrypt周围编写一个包装来实现HashAlgorithm ,或者,这是不可能的,修改BCrypt本身来实现它。

除非你真的很幸运,并且BCrypt的编写方式很容易适应这种修改,否则它可能需要一些非常重要的工作。