【发布时间】:2021-06-06 07:00:33
【问题描述】:
我正在尝试将 php 代码转换为 java 代码,但是在 sha1 ,我从 php 和 java 得到不同的字符串。例如,我为 php 编写了代码;
$password = 'pass123';
$hassedPasswordInDB = 'e1NTSEF9ZWxtNWlJcjJOVkVaenphZjA5dnlnUWFYdVlHaEU3dzQ=';
$sPasswordHash = base64_decode(substr(base64_decode($hassedPasswordInDB), 6));
$sSecretSalt = substr($sPasswordHash, 20); // $sSecretSalt is ��8 here
$sPasswordHash = substr($sPasswordHash, 0, 20);
$hashedPassword = sha1($password.$sSecretSalt); // $hashedPassword is 7a59b9888af6355119cf369fd3dbf2810697b981
我也为 java 写过代码;
String password = "pass123";
String hassedPasswordInDB = "e1NTSEF9ZWxtNWlJcjJOVkVaenphZjA5dnlnUWFYdVlHaEU3dzQ=";
String subFirstDecode = new String(Base64Coder.decode(hassedPasswordInDB)).substring(6);
String sPasswordHash = new String(Base64Coder.decode(subFirstDecode));
String secretSalt = sPasswordHash.substring(19); // secretSalt is ��8
sPasswordHash = sPasswordHash.substring(0, 19);
String hashedPassword = sha1(password + secretSalt); //hashedPassword is b15fe1e7e0abce8284d3695af6c57d7540387ae4
还有Java sha1方法;
private static String sha1(String input) {
try {
// Create MD5 Hash
MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
digest.update(input.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < messageDigest.length; i++)
hexString.append(String.format("%02X", 0xFF & messageDigest[i]));
return hexString.toString().toLowerCase();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
因此,当我尝试使用像“abcabc”这样的 Utf-8 字符串时,它可以工作,但是具有复杂输入的相同代码,例如“��8”,会给出两个不同的输出。
Java : b15fe1e7e0abce8284d3695af6c57d7540387ae4,
PHP : 7a59b9888af6355119cf369fd3dbf2810697b98
为什么会这样?
【问题讨论】:
-
我对 Java 的了解不够,无法提供帮助,但我会进一步分解。您可以从任一端开始,但例如,忽略除 SHA-1 之外的所有内容并继续处理。使用诸如
A????♠之类的复杂字符串来确保您没有编码问题。获取适用于 PHP 和 Java 的该字符串的 SHA-1 的工作示例。一旦你知道这是可行的,退后一步,处理你的字符串/编码的事情。对于 Java 代码,始终创建一个单一步骤(函数)的变量,并将结果与 PHP 版本进行比较,然后逐个函数重复。
标签: java php unicode utf-8 decode