gpt4 book ai didi

java - 为什么这些 PHP 和 Java 密码生成器会产生不同的输出?

转载 作者:IT老高 更新时间:2023-10-28 20:22:47 25 4
gpt4 key购买 nike

我正在为 PHP 中的脚本编写密码生成器,我希望它与我用 Java 编写的类兼容,以便它们可以共享资源。

PHP 代码:

public function PasswordGen($password, $rounds) { 
for($i = 0; $i < $rounds; $i++) {
$password = substr(base64_encode(md5($password)), 0, 16);
echo $i . " " . $password . PHP_EOL; // debugging //
}
return $password;
}

Java 代码:

public static String PasswordGen(String password, int rounds) {
try {
for(int i = 0; i < rounds; i++) {
byte[] md5 = MessageDigest.getInstance("MD5").digest(password.getBytes("UTF-8"));
String md5h = (new BigInteger(1, md5)).toString(16);
password = Base64.getEncoder().encodeToString(md5h.getBytes()).substring(0, 16);
System.out.println(Integer.toString(i) + " " + password); // debugging //
}
} catch(Exception ex) {
ex.printStackTrace();
return null;
}
return password;
}

PHP 调试输出:

0 MWExZGM5MWM5MDcz  
1 NDVkZmMxNWVjNWZi
2 ODY5YzVkODBhNTRh
3 ZGE2OTNiOWMxOWM1
4 OTcxMTY3MzgxMmRk
5 NWNjNDI2N2IzMDlj
6 NGVkYzY0YjVkMWUy
7 MjdhMGU4NjhhNmU3
8 OWY5OGE3ZGZiODZl
9 Y2I1ZjBkNjRmMjkx
10 YTk5NDA1MGI1OWY1
11 YzRmYWE5ZTk0ZDdl
12 NDBiZWZkNmQ5Yjhj
13 MzQyNzcwNGRjMTYw
14 N2U4ZmUxOGMyNWYx
15 MjBjOTZhNGE4ZDQ1
16 MjdmMzkwMzI0NDdj
17 YjM4NDI0YWU0YzUw
18 NDRiNjA1MWUwOGZi
19 MGI1YmIyMDViMGYz

Java 调试输出:

0 MWExZGM5MWM5MDcz  
1 NDVkZmMxNWVjNWZi
2 ODY5YzVkODBhNTRh
3 ZGE2OTNiOWMxOWM1
4 OTcxMTY3MzgxMmRk
5 NWNjNDI2N2IzMDlj
6 NGVkYzY0YjVkMWUy
7 MjdhMGU4NjhhNmU3
8 OWY5OGE3ZGZiODZl
9 Y2I1ZjBkNjRmMjkx
10 YTk5NDA1MGI1OWY1
11 YzRmYWE5ZTk0ZDdl
12 NDBiZWZkNmQ5Yjhj
13 MzQyNzcwNGRjMTYw
14 N2U4ZmUxOGMyNWYx
15 MjBjOTZhNGE4ZDQ1
16 MjdmMzkwMzI0NDdj
17 YjM4NDI0YWU0YzUw
18 NDRiNjA1MWUwOGZi
19 YjViYjIwNWIwZjMy

在第 19 个循环之前,它会按预期工作。为什么之后会产生不同的输出?

最佳答案

在 Java 中,使用 toString(int base) 方法将 BigDecimal 转换为十六进制字符串不会输出前导零。

您可以通过打印中间步骤的输出(将 md5 哈希码转换为十六进制字符串)来发现这一点 - 在 Java 中给出 b5bb205b0f32a7bf2a80fc870cbd2b7 而在 PHP 中给出 0b5bb205b0f32a7bf2a80fc870cbd2b7。只是一个前导零的差异,但应用base64编码后,它们看起来就大不相同了。

获取前导零的更简单方法是使用 String.format 方法。

替换这一行:

String md5h = ( new BigInteger(1, md5) ).toString(16);

用这一行:

String md5h = String.format("%032x", new BigInteger(1, md5));

您将获得与您的 php 代码相同的输出。

关于java - 为什么这些 PHP 和 Java 密码生成器会产生不同的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43197738/

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