c# - JavaScript 和 C# 兼容的密码哈希

标签 c# javascript authentication hash password-hash

我需要一种在 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# Controller 生成)存储在本地存储中来实现。然后,当用户输入他的密码时,我会使用 JavaScript 找到它的哈希值,并将它与存储在本地存储中的哈希密码进行比较。

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

最佳答案

Bcrypt is bcrypt .您需要三样东西才能使用 bcrypt 函数:salt、key 和 cost。

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

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


因为在这种情况下,散列在外部公开和生成,所以我会使用比用于远程身份验证的多一轮或两轮 - bcrypt 适当的轮选择旨在减轻暴力/GPU攻击。 (使用不同的回合数也会使本地暴力破解 - 但不是真正的 - key 在应用于服务器时无效。)

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


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

关于c# - JavaScript 和 C# 兼容的密码哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21569234/

相关文章:

c# - 将.net格式字符串转换为java格式字符串

javascript - 在循环中传递参数 onclick

php - SaaS 的身份验证

c# - 返回 Azure TableEntity 对象列表时出现 SerializationException

c# - 如何在 C# 中停止文件循环?

javascript - AngularJS:具有不同属性的对象数组中的 ngIf

asp.net-core - Kubernetes 客户端库 AuthenticationException

angular - 使用 MSAL 保护 ASP.Net Core Web API 和 Angular 应用程序

c# - 为什么每个人都使用带有 ASP.Net Core 的 ILogger 的记录器包?

Javascript : How to detect when the reference of a variable changes