为了账号安全,请及时绑定邮箱和手机立即绑定

在nodeJS中验证Identity Server 3/4哈希

在nodeJS中验证Identity Server 3/4哈希

C#
米脂 2021-04-05 21:18:24
我正在尝试写出一个模仿identity server 3in的验证功能的库,nodeJS但是我正在努力验证所生成的缓冲区。我不知道为什么,但是尽管遵循了我认为是等效的方法,但我还是得到了完全不同的长度缓冲区。pbkdf2作为异步任务运行的函数在迭代过程中可能具有不同的行为。该pbkdf2函数可能正在实现sha256的不同版本,或者根本不是hmac。我搞砸了缓冲区管理,并在salt /子键之间吐了出来。从这个意义上说,复制可能无法像blockcopy前述的那样发挥作用。identity server 3尽管请注意,我要验证的哈希是直接从Identity Server 3一个单独的应用程序内部获取的,而该应用程序是从开始的,ABP boilerplate但是根据我自己的研究,我不相信它们实现了自定义哈希算法或更改了设置。c#我用来转换的代码参考可以在这里找到:https://github.com/aspnet/Identity/blob/rel/2.0.0/src/Microsoft.Extensions.Identity.Core/PasswordHasher.cs#L248在对身份服务器2等效项进行了进一步研究之后,该身份服务器使用了一种更平常的算法进行检查,我注意到人们报告他们必须更改编码,但是在测试中仍然无法使其工作。使用此处的类中包含的hashpassword函数进行的进一步测试表明,返回的缓冲区的长度为61,而当验证解码后的缓冲区的大小为84时,听起来像某种形式的不匹配编码或丢失字节的某种形式。该实现如下,可用于测试:import identityHasher from '../IdentityServer3/HashPasswordv3';const hasher = new identityHasher();
查看完整描述

1 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

您的实现在逻辑上是正确的,但是有一些小问题,所有这些都与算法实现无关:


第一的


decodedBuffer.copy(salt, 13, 0, saltLength);

应该


// copy data from "decodedBuffer" buffer to "salt" buffer,    

// from position 13, up to position 13 + saltLength of "decodedBuffer"

// to position 0 of "salt" buffer

decodedBuffer.copy(salt, 0, 13, 13 + saltLength);

只是因为它可以满足您的要求(从源数组中的位置13提取盐),而您的当前版本却做了完全不同的事情。我想您会弄混此功能的签名。


第二


let subkeyLength = hashedPassword.length - 13 - saltLength;

您已经在使用缓冲区,但是使用的长度hashedPassword是base-64字符串。这是不正确的(因为base-64字符串的长度和它表示的字节数组的长度不同),应该为:


let subkeyLength = decodedBuffer.length - 13 - saltLength;

第三


decodedBuffer.copy(expectedSubkey, 0, 13 + saltLength, expectedSubkey.length);

与第一个相同的故事应该是:


decodedBuffer.copy(expectedSubkey, 0, 13 + saltLength, 13 + saltLength + expectedSubkey.length);

进行此更改后,它将按预期工作。


查看完整回答
反对 回复 2021-04-17
  • 1 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信