Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较Java和PHP中的SHA256输出_Java_Php_Encryption_Hash - Fatal编程技术网

比较Java和PHP中的SHA256输出

比较Java和PHP中的SHA256输出,java,php,encryption,hash,Java,Php,Encryption,Hash,这个问题可能是重复的。但到目前为止,我还没有看到任何能够解决我的问题的回应。 我使用SHA-256对这段Java代码进行加密: 使用d38a5cd5作为键,使用ewo10kalavanda作为要散列的字符串 Utils.hashIt("ewo10kalavanda", "d38a5cd5"); 我有以下输出: fc87c73012e11de3a57faabe4d852ce89ec3337504531c16 在PHP中使用相同的SHA256 输出为1839412f79b9e33c2f81065

这个问题可能是重复的。但到目前为止,我还没有看到任何能够解决我的问题的回应。 我使用SHA-256对这段Java代码进行加密:

使用d38a5cd5作为键,使用ewo10kalavanda作为要散列的字符串

Utils.hashIt("ewo10kalavanda", "d38a5cd5");
我有以下输出:

fc87c73012e11de3a57faabe4d852ce89ec3337504531c16
在PHP中使用相同的SHA256

输出为1839412f79b9e33c2f810650f79f23f46173792f885dd8d8c9633675e28e792f,与Java不匹配


这里做错什么了吗?在PHP代码中,您使用了HMAC,它不仅仅是对通过连接键和消息体获得的字符串进行哈希运算。我在维基百科上找到了一个图表,解释了HMAC-SHA1的工作原理:

我成功地获得了Java的工作版本:

public static String hashIt(String msg, String key) {
    try {
        byte[] keyBytes = key.getBytes("UTF-8");
        SecretKeySpec spec = new SecretKeySpec(keyBytes, HMAC_SHA256);
        Mac mac = Mac.getInstance(HMAC_SHA256);
        mac.init(spec);
        return TripleDES.bytesToHexString(mac.doFinal(msg.getBytes("UTF-8")));
    } catch (UnsupportedEncodingException | NoSuchAlgorithmException | InvalidKeyException e) {
        throw new RuntimeException(e);
    }
}
我仍然认为味精的长度有问题。如果你对一个两字节的字符进行散列,它将是错误的。我测试了它,它是不同的。例如,尝试使用以前的代码散列111111錒message和1111key,然后使用我先前建议的代码对同一字符串进行散列。您的代码输出81e385eb2bf89f7494a4b0927a4f5d4105450eb4a21152d53d52ddb9c08ed0e1和我的代码输出ef7f82833c865ef4d6089ba7dfbec8ad4f05b58e3fd77ca242c5fd7e7757d8b4

那个汉字是故意的。它用两个字节的字符显示OP的代码是如何失败的。不要移除。

这本应该让你走了很长的路。但可以肯定的是,以下是如何生成输出:

$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 as。

行m.updatemsg.getBytesUTF-8,0,msg.length;有缺陷。@glee8e为什么你认为它有缺陷?请看下面我的anwser。似乎你真的想要PHP和Java中的HMAC,而不是自己动手实现。你的答案和我在这里做的一样byte[]actualKeyBytes=TripleDES.hexStringToByteskey;哇!!这非常有效,并且得到了与Java相同的哈希值输出。谢谢。两个要点:密钥的Hex2bin和密钥与密码的串联。也使用HASH而不是HASH_MAC。再次感谢。
$k = hex2bin("d38a5cd5");
$m = "ewo10kalavanda";
$in = $k.$m;
$h = hash ("SHA256", $in);
print $h;
$m = mb_convert_encoding("ewo10kalavanda", "UTF-8");