【发布时间】:2015-04-26 16:58:01
【问题描述】:
编辑: 根据 cmets 中的讨论,让我澄清一下,这将发生在服务器端,位于 SSL 后面。我不打算向客户端公开散列密码或散列方案。
假设我们有一个现有的 asp.net 身份数据库,其中包含默认表(aspnet_Users、aspnet_Roles 等)。根据我的理解,密码哈希算法使用 sha256 并将 salt +(哈希密码)存储为 base64 编码字符串。 编辑:这个假设不正确,请参阅下面的答案。
我想用 JavaScript 版本复制 Microsoft.AspNet.Identity.Crypto 类的函数 VerifyHashedPassword 函数。
假设密码是 welcome1,其 asp.net 哈希密码是 ADOEtXqGCnWCuuc5UOAVIvMVJWjANOA/LoVy0E4XCyUHIfJ7dfSY0Id+uJ20DTtG+A==
到目前为止,我已经能够重现获取盐和存储的子密钥的方法部分。
C# 实现或多或少会这样做:
var salt = new byte[SaltSize];
Buffer.BlockCopy(hashedPasswordBytes, 1, salt, 0, SaltSize);
var storedSubkey = new byte[PBKDF2SubkeyLength];
Buffer.BlockCopy(hashedPasswordBytes, 1 + SaltSize, storedSubkey, 0, PBKDF2SubkeyLength);
我在 JavaScript 中有以下内容(无论如何都不优雅):
var hashedPwd = "ADOEtXqGCnWCuuc5UOAVIvMVJWjANOA/LoVy0E4XCyUHIfJ7dfSY0Id+uJ20DTtG+A==";
var hashedPasswordBytes = new Buffer(hashedPwd, 'base64');
var saltbytes = [];
var storedSubKeyBytes = [];
for(var i=1;i<hashedPasswordBytes.length;i++)
{
if(i > 0 && i <= 16)
{
saltbytes.push(hashedPasswordBytes[i]);
}
if(i > 0 && i >16) {
storedSubKeyBytes.push(hashedPasswordBytes[i]);
}
}
再一次,它并不漂亮,但是在运行这个 sn-p 之后,saltbytes 和 storedSubKeyBytes 逐字节匹配我在 C# 调试器中看到的 salt 和 storedSubkey。
最后,在 C# 中,Rfc2898DeriveBytes 的一个实例用于根据所提供的盐和密码生成一个新的子密钥,如下所示:
byte[] generatedSubkey;
using (var deriveBytes = new Rfc2898DeriveBytes(password, salt, PBKDF2IterCount))
{
generatedSubkey = deriveBytes.GetBytes(PBKDF2SubkeyLength);
}
这就是我卡住的地方。我尝试过其他人的解决方案,例如this one,我分别使用了 Google 和 Node 的 CryptoJS 和加密库,我的输出从未生成任何类似于 C# 版本的东西。
(例如:
var output = crypto.pbkdf2Sync(new Buffer('welcome1', 'utf16le'),
new Buffer(parsedSaltString), 1000, 32, 'sha256');
console.log(output.toString('base64'))
生成“LSJvaDM9u7pXRfIS7QDFnmBPvsaN2z7FMXURGHIuqdY=")
我在网上找到的许多指针都表明存在编码不匹配的问题(NodeJS / UTF-8 与 .NET / UTF-16LE),因此我尝试使用默认的 .NET 编码格式进行编码,但无济于事.
或者我可能完全错误地认为这些库在做什么。但是任何指向正确方向的指针都将不胜感激。
【问题讨论】:
-
您是否尝试在客户端生成密码哈希并将哈希传递给服务器进行验证?
-
不,我正在尝试在 node.js 中生成哈希服务器端。本质上,保持数据库相同,但将 IIS / asp.net 层换成节点。我不是安全专家,但我会警惕尝试在客户端进行任何密码操作。
-
啊,这澄清了我的担忧。我会在你的问题中提到这一点。抱歉,这里实际上无法帮助处理 JS 方面的事情(
-
@trailmax 您能否进一步解释一下您对客户端哈希的担忧?
-
@bonh 看这个解释security.stackexchange.com/a/53606
标签: javascript c# asp.net-identity cryptojs rfc2898