我正在尝试将消息散列到用PHP编写并由HMAC_SHA1算法编码的服务器端(我无法更改其代码)。我正在用Java编写代码。 php代码如下:
$utf8Str = mb_convert_encoding($strToSign, "UTF-8");
$hmac_sha1_str = base64_encode(hash_hmac("sha1", $utf8Str, KEY));
$signature = urlencode($hmac_sha1_str);
我的java代码是:
private static String HashStringSign(String toHash){
try {
String afterUTF = new String(toHash.getBytes(), "UTF-8");
String res = hmac_sha1(afterUTF, SecretAccessKey);
String signature = new String(Base64.encode(res.getBytes()));
String result = URLEncoder.encode(signature);
return result;
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
private static String hmac_sha1(String value, String key) {
try {
// Get an hmac_sha1 key from the raw key bytes
byte[] keyBytes = key.getBytes();
SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");
// Get an hmac_sha1 Mac instance and initialize with the signing key
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
// Compute the hmac on input data bytes
byte[] rawHmac = mac.doFinal(value.getBytes());
// Convert raw bytes to Hex
byte[] hexBytes = new Hex().encode(rawHmac);
return new String(hexBytes, "UTF-8");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
我遵循了php代码中使用的每种散列方法,并按照您所看到的顺序进行操作。也许在java中有一个函数在php中工作不同?
我正在使用 - com.sun.org.apache.xml.internal.security.utils.Base64 java.net.URLEncoder,javax.crypto和org.apache.commons.codec.binary
谢谢!
答案 0 :(得分:0)
在hash_hmac
函数中,您需要将第4个参数设置为true。
现在你说你不能改变PHP方面,你可以对你的Java代码执行以下操作。
在Java代码的最后一步中,您将原始字节数组转换为hexademical。但是,PHP会生成base64编码的hexademical而不仅仅是hexademical。
因此,在Java步骤结束时,只需对base64进行编码就可以得到相同的值。 https://stackoverflow.com/questions/9845767/base64-encoder-java#