我正在迁移一个使用 Passlib 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
并且是 "测试123"
$pbkdf2-sha512$10001$2ZuTslYKAYDQGiPkfA.B8A$ChsEXEjanEToQcPJiuVaKk0Ls3n0YK7gnxsu59rxWOawl/iKgo0XSWyaAfhFV0.Yu3QqfehB4dc7yGGsIW.ARQ
我看到的表示为:
- 算法 SHA512
- 迭代次数 10001
- 盐值 0dr7v7eWUmptrfW.9z6HkA(可能)
我发现 passlib.net 看起来有点像被放弃的 beta 版本,并且它使用 '$6$' 作为算法。我无法验证密码。我尝试将算法更改为 $6$,但我怀疑这实际上也会更改盐。所有由 Passlib 定义的 pbkdf2 哈希都遵循相同的格式:$pbkdf2-digest$rounds$salt$checksum。
$pbkdf2-digest$ 用作模块化加密格式标识符(例如,在本例中为 $pbkdf2-sha256$)。 digest - 这指定了与 HMAC 结合使用以形成 PBKDF2 的伪随机函数的特定加密哈希(在本例中为 sha256)。 rounds - 应执行的迭代次数。这被编码为没有零填充的正十进制数(在本例中为 6400)。 salt - 这是传递到 PBKDF2 函数的原始盐字节的适应的 base64 编码。 checksum - 这是从 PBKDF2 函数返回的原始派生键字节的适应的 base64 编码。每个方案都将其特定哈希算法(digest)的摘要大小用作原始派生密钥的大小。这通过 base64 编码增大了约 4/3,从而产生了每个列出的算法的 27、43 和 86 的校验和大小。
我还尝试过使用 PWDTK 并提供不同的盐值和哈希值,但可能是我在错误地拆分阴影密码,或者在某些地方提供了 $,导致无法成功操作。
是否有任何方法可以在 .NET 中根据此哈希值验证密码?或者其他不需要使用 Python 代理或让用户重新输入密码的解决方案?