java - Android端和php端的HmacSHA1结果不同

标签 java php base64 hmac

PHP 代码:

$secret = "mtHa5YRivVrQ/ZNtoe2oxg==";
$var3 = 11112222;
$signature  = hash_hmac('sha1', $var3, $secret, true);
$data = base64_encode($signature);
echo $data;

输出:Prpji0PmtBsmDo1grDbXMJnJUTs=

Android 代码:

String data = 11112222;
String secret = mtHa5YRivVrQ/ZNtoe2oxg==
SecretKeySpec key = new SecretKeySpec((secret).getBytes("UTF-8"), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(key);
byte[] bytes = mac.doFinal(data.getBytes("UTF-8"));
return new String(Base64.encodeToString(bytes, Base64.DEFAULT));

输出:q85cCMvVB7PX39upoT5/+9J0bWM=

不知道出了什么问题,请帮帮我

最佳答案

您有 Base64 编码的 key ,因此您必须首先将其解码为纯字节数组:

PHP:

$secret64 = "mtHa5YRivVrQ/ZNtoe2oxg==";
$secret = base64_decode($secret64);
$data = "11112222";
$hmac  = hash_hmac('sha1', $data, $secret, true);
$hmac64 = base64_encode($signature);
echo $hmac64;

Java:

String data = "11112222";
String secret64 = "mtHa5YRivVrQ/ZNtoe2oxg==";
byte[] secret = Base64.decode(secret64, Base64.DEFAULT);
SecretKeySpec key = new SecretKeySpec(secret, "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(key);
byte[] bytes = mac.doFinal(data.getBytes("UTF-8"));
return Base64.encodeToString(bytes, Base64.DEFAULT);

结果:

LdKcsVyMX0BAhugGFEr4dAlFfe8=

关于java - Android端和php端的HmacSHA1结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22716659/

相关文章:

java - 使 Canvas 的画线可点击

php - 输出一个类别,然后输出其中的产品

ruby - 在 Ruby 中将十六进制摘要转换为 base64

ios - 将base64解码为uiimage iOS Swift

java - 用分治法java将两个十进制整数相乘

java - 使用 Spring 和 GsonHttpMessageConverter 进行嵌套 JSON 解析?

php - WooCommerce 更改加载微调器图标

java - Base64 解码为十六进制转储

java整数数组大小混淆

php - 无法使用 while 循环代替 foreach 循环进行分页 php mysql