java - 适用于 Java 和 PHP 的 PBKDF2 算法
问题描述
我有一个网站。本网站使用 PBKDF2 进行用户密码加密。我必须用 Java 编写登录代码。我用谷歌搜索了 Java 的 PBKDF2 算法。但是,Java 和 PHP 的结果不同。
Java 代码是
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.util.Base64;
public class Hash {
public static void main(String[] args) throws Exception {
var password = "test".toCharArray();
var salt = Base64.getDecoder().decode("JvCjRQb/9X8rticKJrDP1uvBCDTz2WEF");
var iterationCount = 12000;
var keyLength = 24 * 8;
System.out.println(Base64.getEncoder().encodeToString(SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256")
.generateSecret(new PBEKeySpec(password, salt, iterationCount, keyLength))
.getEncoded()));
}
}
结果:dvxvBMpmR6i4D9f1orGx9zUjH9cyv0sM(BellSoft Java 13)
PHP代码是
<?php
$algo = "sha256";
$password = "test";
$salt = "JvCjRQb/9X8rticKJrDP1uvBCDTz2WEF";
$count = 12000;
$key_length = 24;
echo base64_encode(hash_pbkdf2($algo, $password, $salt, $count, $key_length, true));
?>
结果:n7znKl8FBPH4ZPbZxPRHPf7vkey+5R2Y (PHP v7.2.24)
我无法编辑 PHP 代码,因为它是框架代码。因此,我需要更改 Java 代码以匹配 PHP 结果。如何更改我的 Java 代码?
解决方案
function derivateKey($password, $salt, $iterations, $keyLengthBits)
{
return base64_encode(hash_pbkdf2(
'sha256',
$password,
base64_decode($salt),
$iterations,
$keyLengthBits/8,
true
));
}
推荐阅读
- python - 在 2D/3D 中查找线段和一般多边形之间的交点
- socket.io - 如何在 flask-socketio 中同时使用 Websocket 传输和 async_mode=threading?
- powershell - 为什么总是提示我确认?
- ios - 关闭 Cordova iOS 应用程序时,安全 cookie 会丢失
- python-3.x - 为什么具有可迭代解包无效语法的元组的扩充分配?
- python - 自动化 Teradata 数据 SQL
- python - 在终端中导入python包的问题
- java - 这些代码与泛型有什么区别
- r - 显示 X 和 Y 轴并使用 spplot 更改它们的范围
- r - 如何使用 Docker 将 Rmarkdown 转换为 HTML?