首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证Passlib生成的PBKDF2 SHA512哈希在.NET中

验证Passlib生成的PBKDF2 SHA512哈希在.NET中
EN

Stack Overflow用户
提问于 2016-08-26 12:27:59
回答 2查看 3.9K关注 0票数 2

我正在迁移一个使用帕斯利布1.6.2生成密码哈希的平台。加密密码的代码是(哈希是用默认值调用的):

代码语言:javascript
复制
from passlib.hash import pbkdf2_sha512 as pb

def hash(cleartext, rounds=10001):
    return pb.encrypt(cleartext, rounds=rounds)

输出格式类似于(密码"Patient3“(无引号)):

代码语言:javascript
复制
$pbkdf2-sha512$10001$0dr7v7eWUmptrfW.9z6HkA$w9j9AMVmKAP17OosCqDxDv2hjsvzlLpF8Rra8I7p/b5746rghZ8WrgEjDpvXG5hLz1UeNLzgFa81Drbx2b7.hg

和"Testing123“

代码语言:javascript
复制
$pbkdf2-sha512$10001$2ZuTslYKAYDQGiPkfA.B8A$ChsEXEjanEToQcPJiuVaKk0Ls3n0YK7gnxsu59rxWOawl/iKgo0XSWyaAfhFV0.Yu3QqfehB4dc7yGGsIW.ARQ

我可以看出这代表着:

  • 算法SHA512
  • 迭代10001
  • 盐0dr7v7eWUmptrfW.9z6HkA (可能)

Passlib算法在他们的站点上定义并读取:

passlib定义的所有pbkdf2散列都遵循相同的格式,$pbkdf2 2-摘要$salt$salt$checksum。 $pbkdf2 2-摘要$用作模块Crypt格式标识符(示例中为$pbkdf2-sha256$)。摘要-这指定了与HMAC一起使用的特定密码散列,用于为该特定哈希形成PBKDF2 2的伪随机函数(示例中为sha256)。循环-应该执行的迭代次数。这是一个没有零填充的正十进制数(示例中为6400)。salt --这是传递给PBKDF2函数的原始盐字节的适应的PBKDF2编码。校验和--这是对从base64函数返回的原始派生密钥字节的适应的PBKDF2编码。每个方案使用其特定哈希算法(摘要)的摘要大小作为原始派生密钥的大小。这被base64编码放大了大约4/3,导致上面列出的每个算法的校验和大小分别为27、43和86。

我发现了passlib.net,它看起来有点像一个废弃的测试版,它使用'$6$‘作为算法。我无法得到它来验证密码。我尝试将算法更改为$6$,但我怀疑实际上也会改变盐分。

我还尝试使用带有各种salt和hash值的PWDTK,但可能是我不正确地拆分了影子密码,或者在一些不应该使用的地方提供了$。

在.NET中,有任何方法可以根据这个哈希值来验证密码吗?还是不涉及Python代理或让用户重新提供密码的另一种解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-26 15:16:39

通过将密码传递到PBKDF SHA-256哈希方法中,然后将结果哈希与保存的哈希部分进行比较,从Base64版本转换回来,从而验证哈希。

将散列保存为二进制,然后使用UTF-8编码PBKDF2、HMAC、SHA-256(toBinary(密码,salt,10001) ==哈希密码:"Patient3“将密码转换为二进制。

$pbkdf2 - sha512$10001$0dr7v7eWUmptrfW.9z6HkA$w9j9AMVmKAP17OosCqDxDv2hjsvzlLpF8Rra8I7p/b5746rghZ8WrgEjDpvXG5hLz1UeNLzgFa81Drbx2b7.hg

细分为(将字符串转换为标准Base64 (change‘))。到“+”并添加“尾”=“填充”:

代码语言:javascript
复制
pbkdf2 - sha512
10001
0dr7v7eWUmptrfW+9z6HkA==
w9j9AMVmKAP17OosCqDxDv2hjsvzlLpF8Rra8I7p/b5746rghZ8WrgEjDpvXG5hLz1UeNLzgFa81Drbx2b7+hg==

被解码为十六进制:

代码语言:javascript
复制
D1DAFBBFB796526A6DADF5BEF73E8790
C3D8FD00C5662803F5ECEA2C0AA0F10EFDA18ECBF394BA45F11ADAF08EE9FDBE7BE3AAE0859F16AE01230E9BD71B984BCF551E34BCE015AF350EB6F1D9BEFE86

这是有意义的:16字节(128位) salt和64字节(512位) SHA-512散列.

使用UTF-8将"Patient3“转换为二进制数组,将盐类从修改后的BASE64编码转换为16字节二进制数组,使用迭代计数od 10001将此转换为使用HMAC与sma-512连接的PBKDF2。

我得到了

代码语言:javascript
复制
C3D8FD00C5662803F5ECEA2C0AA0F10EFDA18ECBF394BA45F11ADAF08EE9FDBE7BE3AAE0859F16AE01230E9BD71B984BCF551E34BCE015AF350EB6F1D9BEFE86

在Base64编码时,将“+”字符替换为“.”并去掉后面的“=”字符返回: w9j9AMVmKAP17OosCqDxDv2hjsvzlLpF8Rra8I7p/b5746rghZ8WrgEjDpvXG5hLz1UeNLzgFa81Drbx2b7.hg

票数 1
EN

Stack Overflow用户

发布于 2016-08-31 20:45:25

我使用zaph的逻辑并使用来自JimmiTh on 所以回答的代码,快速地拼凑了一个JimmiTh实现。我已经将代码放在GitHub上了(这不应该是生产准备好的)。它似乎与我们的用户基础上的几个例子一起工作。

正如zaph所说,逻辑是:

  1. 拆分散列以找到迭代计数、salt和hash密码。(我假设了算法,但你会验证的)。您将拥有一个包含[0] - Nothing、[1] -算法、[2] -迭代、[3] - Salt和[4] - Hash的5个值数组。
  2. 通过替换任何“.”将salt转换为标准的Base64编码。带有'+‘字符并附加"==“的字符。
  3. 将密码、盐分和迭代计数传递给PBKDF2-HMAC- the 512生成器。
  4. 将任何“+”字符替换为“.”,从而将其转换回原始base64格式。字符和去掉尾随的"==“。
  5. 与原始散列(拆分字符串中的元素4)相比,该转换值,如果它们相等,您将得到一个匹配。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39166372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档