这个问题可能是重复的。但到目前为止,我还没有看到任何可以解决我的问题的回应。我有这段 Java 代码进行加密SHA-256
:
public static String hashIt(String msg, String key) {
MessageDigest m = null;
String hashText = null;
byte[] actualKeyBytes = TripleDES.hexStringToBytes(key);
try {
m = MessageDigest.getInstance("SHA-256");
m.update(actualKeyBytes, 0, actualKeyBytes.length);
try {
m.update(msg.getBytes("UTF-8"), 0, msg.length());
} catch (UnsupportedEncodingException ex) {
}
hashText = TripleDES.bytesToHexString( m.digest() ); //new BigInteger(1, m.digest()).toString(16);
} catch (NoSuchAlgorithmException ex) {
}
return hashText;
}
使用d38a5cd5
作为键和"ewo10kalavanda"
作为要散列的字符串。
Utils.hashIt("ewo10kalavanda", "d38a5cd5");
我有以下输出:
fc87c73012e11de3a57faabe4d852ce89ec3337504531c16
使用相同SHA256
的PHP
hash_hmac('SHA256', "ewo10kalavanda", "d38a5cd5", $raw=false)
输出1839412f79b9e33c2f810650f79f23f46173792f885dd8d8c9633675e28e792f
与 Java 不匹配。
这里有什么地方做错了吗?已经在这几个小时了。
来自glee8e的另一个答案应该会让你走得很远。但可以肯定的是,这里是如何生成输出:
$k = hex2bin("d38a5cd5");
$m = "ewo10kalavanda";
$in = $k.$m;
$h = hash ("SHA256", $in);
print $h;
最好先编码为 UTF-8,但我没有安装正确的模块:
$m = mb_convert_encoding("ewo10kalavanda", "UTF-8");
对于测试刺,这当然无关紧要,只要平台编码与输入字符的 UTF-8 兼容。
然而,这只是答案的一半:定义 HMAC 是有原因的,主要原因是散列函数本身对于密钥散列或消息身份验证代码 (MAC) 并不那么安全。所以在 PHP 函数中使用 HMAC 应该是首选。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句