4

我需要一种在 C# 中散列密码的方法以及在 JavaScript 中散列相同密码并获得相同结果的能力,以实现离线浏览身份验证机制。

我在这里找到了 bCrypt 的 JavaScript 版本:http ://code.google.com/p/javascript-bcrypt/downloads/detail?name=jBCrypt-v2.2.tar.gz ,还有 C# 实现,但我不知道他们是否兼容。

对于我正在开发的网络应用程序,我需要这个,在网络连接可能并不总是可用的情况下,该应用程序可能会被群组中的不同人使用。所有数据都将加载到 Web 应用程序中,但每个用户只能看到他共享的数据。为了实现这一点,即使没有网络连接,我也需要用户进行身份验证。我想我可以通过将所有用户名及其密码哈希(由 ASP.NET MVC / C# 控制器生成)存储在本地存储中来做到这一点。然后,当用户输入他的密码时,我会使用 JavaScript 找到其哈希值,并将其与存储在本地存储中的哈希密码进行比较。

该网络应用程序不处理银行信息或任何类型的此类敏感数据,因此安全要求最低。

4

2 回答 2

2

Bcryptbcrypt。使用 bcrypt 函数需要三件事:盐、密钥和成本。

只要您可以通过某种方式提供三个所需的值,并且库没有损坏,那么 bcrypt 哈希结果是相同的 - 参数和结果可能需要在 byte[] 和十六进制字符串或诸如此类之间进行转换,但哈希值是相同的。

盐和成本有时被编码为“散列”——例如被连接成一个字符串。在这种情况下,创建/提取适当的参数和交换格式应该只是一个简单的转换。


由于在这种情况下散列暴露并在外部生成,因此我将使用比用于远程身份验证的额外一轮或两轮 -具有适当轮选择的 bcrypt 旨在减轻蛮力/GPU攻击。(使用不同的轮数也会使本地暴力破解(但不是真实的)密钥在应用于服务器时无效。)

还要确保使用良好的盐函数,例如来自大域的随机数的散列。如上所述,我会选择与远程身份验证不同的盐。


当然,由于这都是客户端,精明的用户可以绕过任何类型的身份验证。上面的注释,我相信 bcrypt 的初始选择,是为了确保密码保持秘密- 至少在代码能够维护的范围内。(密码重用是一场瘟疫;对于某些人来说,这很可能是他们的银行密码..)

于 2014-02-05T05:36:52.800 回答
1

如果安全性最低,我建议将这个 md5 哈希库用于 c# http://msdn.microsoft.com/en-us/library/system.security.cryptography.md5cryptoserviceprovider%28v=vs.110%29.aspx
阅读它的实现,它不会做任何加盐或花哨的东西,所以任何基本的 md5 javascript 库都应该兼容。
在这里,您将找到可以计算 md5 的 javascript 库列表,它们都应该运行最快 MD5 在 JavaScript 中实现

于 2014-02-05T05:28:46.877 回答