我正在迁移一个使用帕斯利布1.6.2生成密码哈希的平台。加密密码的代码是(哈希是用默认值调用的):
from passlib.hash import pbkdf2_sha512 as pb
def hash(cleartext, rounds=10001):
return pb.encrypt(cleartext, rounds=rounds)输出格式类似于(密码"Patient3“(无引号)):
$pbkdf2-sha512$10001$0dr7v7eWUmptrfW.9z6HkA$w9j9AMVmKAP17OosCqDxDv2hjsvzlLpF8Rra8I7p/b5746rghZ8WrgEjDpvXG5hLz1UeNLzgFa81Drbx2b7.hg和"Testing123“
$pbkdf2-sha512$10001$2ZuTslYKAYDQGiPkfA.B8A$ChsEXEjanEToQcPJiuVaKk0Ls3n0YK7gnxsu59rxWOawl/iKgo0XSWyaAfhFV0.Yu3QqfehB4dc7yGGsIW.ARQ我可以看出这代表着:
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代理或让用户重新提供密码的另一种解决方案?
发布于 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‘))。到“+”并添加“尾”=“填充”:
pbkdf2 - sha512
10001
0dr7v7eWUmptrfW+9z6HkA==
w9j9AMVmKAP17OosCqDxDv2hjsvzlLpF8Rra8I7p/b5746rghZ8WrgEjDpvXG5hLz1UeNLzgFa81Drbx2b7+hg==被解码为十六进制:
D1DAFBBFB796526A6DADF5BEF73E8790
C3D8FD00C5662803F5ECEA2C0AA0F10EFDA18ECBF394BA45F11ADAF08EE9FDBE7BE3AAE0859F16AE01230E9BD71B984BCF551E34BCE015AF350EB6F1D9BEFE86这是有意义的:16字节(128位) salt和64字节(512位) SHA-512散列.
使用UTF-8将"Patient3“转换为二进制数组,将盐类从修改后的BASE64编码转换为16字节二进制数组,使用迭代计数od 10001将此转换为使用HMAC与sma-512连接的PBKDF2。
我得到了
C3D8FD00C5662803F5ECEA2C0AA0F10EFDA18ECBF394BA45F11ADAF08EE9FDBE7BE3AAE0859F16AE01230E9BD71B984BCF551E34BCE015AF350EB6F1D9BEFE86在Base64编码时,将“+”字符替换为“.”并去掉后面的“=”字符返回: w9j9AMVmKAP17OosCqDxDv2hjsvzlLpF8Rra8I7p/b5746rghZ8WrgEjDpvXG5hLz1UeNLzgFa81Drbx2b7.hg
发布于 2016-08-31 20:45:25
我使用zaph的逻辑并使用来自JimmiTh on 所以回答的代码,快速地拼凑了一个JimmiTh实现。我已经将代码放在GitHub上了(这不应该是生产准备好的)。它似乎与我们的用户基础上的几个例子一起工作。
正如zaph所说,逻辑是:
[0] - Nothing、[1] -算法、[2] -迭代、[3] - Salt和[4] - Hash的5个值数组。https://stackoverflow.com/questions/39166372
复制相似问题