gpt4 book ai didi

来自 "PBKDF2WithHmacSHA512"的 java 散列不同于 python CRYPT(digest_alg ='pbkdf2(1000,20,sha512)' , salt=True)(password)[0])

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:29 27 4
gpt4 key购买 nike

我有一个数据库,其中包含使用以下 python 代码散列的密码:

result = str(CRYPT(digest_alg='pbkdf2(1000,20,sha512)', salt=True)(password)[0])

(详情可见here)

对于 password='123' 它生成

pbkdf2(1000,20,sha512)$b3c56f341284f4be$54297564f7a3be8c6e9c10b27821f8105e0a8120

我需要使用 java 验证密码。我使用以下代码:

    validatePassword("123", "pbkdf2(1000,20,sha512)$b3c56f341284f4be$54297564f7a3be8c6e9c10b27821f8105e0a8120");



private static boolean validatePassword(String originalPassword, String storedPassword) throws NoSuchAlgorithmException, InvalidKeySpecException
{
String[] parts = storedPassword.split("\\$");
byte[] salt = fromHex(parts[1]);
byte[] hash = fromHex(parts[2]);

PBEKeySpec spec = new PBEKeySpec(originalPassword.toCharArray(), salt, 1000, hash.length * 8);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
byte[] testHash = skf.generateSecret(spec).getEncoded();

System.out.println(toHex(testHash));
System.out.println(toHex(hash));

return true;
}


private static byte[] fromHex(String hex) throws NoSuchAlgorithmException
{
byte[] bytes = new byte[hex.length() / 2];
for(int i = 0; i<bytes.length ;i++)
{
bytes[i] = (byte)Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);
}
return bytes;
}

private static String toHex(byte[] array)
{
StringBuilder sb = new StringBuilder();
for(int i=0; i< array.length ;i++)
{
sb.append(Integer.toString((array[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}

但结果如下:

80385948513c8d1826a3a5b8abc303870d41d794
54297564f7a3be8c6e9c10b27821f8105e0a8120

请帮助我做错了什么?

最佳答案

web2py 的代码中存在某种“错误”。

散列看起来像一个十六进制字符串,但它被发送到 hashlib.pbkdf2_hmac(openssl 方法的代理)作为十六进制字符串的字符表示。这意味着你不应该使用

byte[] salt = fromHex(parts[1]);

但是

byte[] salt = parts[1].getBytes("utf-8");

此外,您需要将 KEYLENGTH 而不是盐长度传递给 PBEKeySpec 的构造函数。

更正后的部分应该是:

byte[] salt = parts[1].getBytes("utf-8");
byte[] hash = fromHex(parts[2]);
PBEKeySpec spec = new PBEKeySpec(originalPassword.toCharArray(), salt, 1000, 20*8);

替换它,代码就可以工作了。花了一段时间才发现这一点;)

关于来自 "PBKDF2WithHmacSHA512"的 java 散列不同于 python CRYPT(digest_alg ='pbkdf2(1000,20,sha512)' , salt=True)(password)[0]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43541889/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com