gpt4 book ai didi

java - Java 中的散列与 PHP 中的盐完全相同吗? (SHA-256)

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:05:16 27 4
gpt4 key购买 nike

我可以简单地在 PHP 中加盐:

$orig_pw = "abcd";
$salt = 5f8f041b75042e56;
$password = hash('sha256', $orig_pw . $salt);

(我不是这样实现的,这只是一个例子,盐因人而异)

有了这个,存储的密码是:

bc20a09bc9b3d3e1fecf0ed5742769726c93573d4133dbd91e2d309155fa9929

但是如果我尝试在 Java 中做同样的事情,我会得到不同的结果。我试过 String password = "abcd";

byte[] salt = hexStringToByteArray("5f8f041b75042e56");

try {
System.out.println(new String(getHash(password, salt)));
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}

还有两种方法:

public byte[] getHash(String password, byte[] salt) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
digest.update(salt);
try {
return digest.digest(password.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}


public byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}

结果是:

/¬1¶ĆĽëüFd?[$?¶»_9ËZ»ç¶S‘Ęŗש

哪个编码为十六进制甚至不接近它:

2fac31b6434c14ebfc46643f5b243fb6bb5f39cb5abb10e7b65391454c97d7a90d0a

有人可以帮忙吗?

最佳答案

除了被交换的顺序之外,在 PHP 中,您将盐值视为要附加到密码的文字字符串,而在 Java 中,您首先对盐进行十六进制转换,然后使用结果字节来更新 MessageDigest。这显然会产生不同的结果。只看盐:

PHP: Salt -> To bytes (literal) -> SHA-256
Java: Salt -> To bytes (unhex) -> SHA-256

我刚刚尝试了您的 Java 代码,它绝对没问题。我还尝试在 PHP 中对与在 Java 中相同的值进行哈希处理,它给了我相同的结果。

与您的 PHP 代码等效的 Java 代码是:

String password = "abcd";
String salt = "5f8f041b75042e56";

try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");

return digest.digest((password + salt).getBytes("UTF-8"));
} catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
return null;
}

对字节进行十六进制处理后,它返回以下结果:

60359BC8A0B09898335AA5A037B1E1B9CE3A1FE0D4CEF13514901FB32F3BCEB0

在 PHP 中做:

<?
echo hash('sha256', "abcd"."5f8f041b75042e56");
?>

返回完全相同。

关于java - Java 中的散列与 PHP 中的盐完全相同吗? (SHA-256),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24732170/

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