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

|| 我有一个页面需要加强安全性。我正在使用内置的MembershipProvider功能,并且目前已将“ 0”设置为SHA512。我已经有了BCrypt.NET库(http://bcrypt.codeplex.com/),当我从代码中调用它的函数时,它似乎工作得很好,但是我在找出如何创建方法上花费的时间最差。 Web.config中相应的“ 1”部分,让我创建一个“ 0”。 我在网上找到了以下代码段:
<mscorlib>
    <cryptographySettings>
        <cryptoNameMapping>
            <cryptoClasses>
                <cryptoClass   MyHash=\"MyHashClass, MyAssembly
              Culture=neutral, PublicKeyToken=a5d015c7d5a0b012,
              Version=1.0.0.0\"/>
                <cryptoClass   MyCrypto=\"MyCryptoClass, MyAssembly
              Culture=neutral, PublicKeyToken=a5d015c7d5a0b012,
              Version=1.0.0.0\"/>
            </cryptoClasses>
            <nameEntry name=\"System.Security.Cryptography.HashAlgorithm\"
                       class=\"MyHash\"/>
        </cryptoNameMapping>
        <oidMap>
            <oidEntry OID=\"1.3.36.3.2.1\"   name=\"MyCryptoClass\"/>
        </oidMap>
    </cryptographySettings>
</mscorlib>
如果愿意,可以叫我一个菜鸟,但我显然不具备必要的知识。我所需要的只是一种方法,告诉成员资格提供者
<hashAlgorithmType=\"bcrypt\">
对应于
string hashed = BCrypt.HashPassword(password, BCrypt.GenerateSalt(12));
进行加密和
bool matches = BCrypt.CheckPassword(candidate, hashed);
进行解密。请告诉我一个简单的答案。如果需要的话,我可以从头开始重写登录系统,但是我已经有一个有效的实现,我真的很想更改其哈希算法。     
已邀请:
我认为必须将配置模式应用于machine.config文件。如果您需要能够轻松推出此代码,则不一定是一个好举动。 您可以通过对AddAlgorithm的调用以编程名称向CryptoConfig类注册BCrypt加密原语,以供以后使用。 只要BCrypt哈希提供程序实现
HashAlgorithn
,您就可以简单地注册它,也可以通过使用用于验证是否正确构建算法的名称调用
HashAlgorithm.Create(string)
进行测试。 然后,成员资格提供者应该能够毫无问题地使用它。 这是关于该主题的好文章。 更新资料 (深呼吸)-如果这是tl; dr表示歉意。 好的,因此,阅读了有关BCrypt.Net的密码哈希的信息-显然很好,并且遵循了公认的惯例。而且,它与
HashAlgorithm
类的工作方式完全不兼容,因为它需要附加状态才能发挥其魔力,并且不能简单地扩展为实现
HashAlgorithm
合同。 因此,您可以选择-坚持使用
MembershipProvider
并按原样使用SHA512-您正在谈论增强页面上的安全性,因此我认为身份验证本身可能存在问题,而不是身份验证的存储问题密码(当然,仍然必须正确完成)-因此,请考虑简单地确保身份验证流量通过HTTPS发送(如果尚未通过)。 盲目地使用密码扩展算法有其自身的问题-有关该主题,请参阅我最近对SO的回答-如果在服务器上进行扩展,则有可能最终导致对该站点的DOS攻击! 正如您所建议的那样,另一个选择是完全由您自己管理成员资格-因此,您可以使用所需的任何类型,并手动管理密码信息的必要存储。 我的网站现在使用的算法与我从Bruce Schneier和Niels Ferguson的《实用密码学》一书中提出的PBKDF2非常相似,为此,我使用512位随机盐和SHA512(存储很便宜)以及数千次迭代来哈希一个文本。服务器会针对每个appdomain对自己进行一次基准测试,以建立相当于毫秒级的“保护级别”-因此,随着时间的推移,即使硬件有所改进,新的哈希密码也将获得恒定的保护级别。该库也是独立的,如果我们必须在SQL级别生成密码记录,我已经能够将其部署到SQL Server 2008 R2以提供CLR SP。 但这只会保护密码-然后,您需要一种身份验证机制来保护登录行为;加上另一个用于保护经过身份验证的会话令牌的系统(.Net \的Authentication Cookie系统实际上对此非常有用)。 从那以后,我现在花了一个星期的时间来实现SCRAM原语,然后将其插入到我的MVC Web服务中进行身份验证,并且我打算这样做,以启用使用Javascript从Web浏览器登录(锁定非JS客户端) )。客户端的关键是进行所有哈希计算。因此,我坚持使用SHA,因为成熟的实现几乎可以在任何环境中使用(例如,我们也有iPhone应用-他们也需要进行身份验证)。 但是,在您的情况下,如果使用MembershipProvider的现有投资,我认为512位SHA加SSL加Asp.Net的身份验证cookie就足够了-只要数据库确实是安全的(!)并且您已经网站上没有SQL注入漏洞。     
        对于HashAlgorithm的BCrypt实现,请在此处查看我对类似问题的回答。 您需要使用我的答案中的示例代码创建一个签名的程序集,然后根据需要修改设置:
<cryptoNameMapping>
  <cryptoClasses>
    <cryptoClass MyHash=\"BCryptHasher, MySignedAssemblyName
                 Culture=neutral, PublicKeyToken=<my public key for singed assembly>,
                 Version=1.0.0.0\"/>
  </cryptoClasses>
  <nameEntry name=\"System.Security.Cryptography.HashAlgorithm\" class=\"MyHash\"/>
</cryptoNameMapping>
    
        为了能够注册自定义hashAlgorythmType,您需要的第一件事是实际实现HashAlgorythm的类型。如果BCrypt实现了它,那将是您的幸运日,但是显然它没有实现,因此这是您的问题。 确实没有任何解决方法,因为实现
HashAlgorithm
是这样注册的必要条件。 因此,您需要做的是或者在BCrypt周围编写一个包装器以实现
HashAlgorithm
,或者不可能通过修改BCrypt本身来实现它。 除非您真的很幸运,并且以很容易进行此类修改的方式编写BCrypt,否则可能需要付出一些不小的努力。     

要回复问题请先登录注册