If your API service security authentication protocol requires the use of hmac_sha1 method to encode information,
and your service is implemented by PHP and the client is implemented by JAVA, In order to correctly compare signatures, it is necessary to establish a matching encoding method between the two.
efine('ID','123456');
define(' KEY','k123456');
$strToSign = "test_string";
$utf8Str = mb_convert_encoding($strToSign, "UTF-8");
$hmac_sha1_str = base64_encode(hash_hmac("sha1", $utf8Str, KEY));
$signature = urlencode($hmac_sha1_str);
print_r($signature);
p>
The following points need to be noted on the JAVA side:
1. The hmac_sha1 encoding result needs to be converted into hex format
2. The implementation of base64 in java is inconsistent with php, among which java The = sign is not padded at the end of the string to add the number of bytes to an integer of 8
3. hmac_sha1 is not sha1, hmac_sha1 requires a shared key
The reference implementation is as follows:
[java] view plain copy
import java.io.UnsupportedEncodingException;
import javax.crypto.Mac;
< p>import javax.crypto.spec.SecretKeySpec;import org.apache.wicket.util.crypt.Base64UrlSafe;
public class test {
public static void main(String[] args) {
String key = "f85b8b30f73eb2bf5d8063a9224b5e90";
String toHash = "GET"+"\n"+"Thu, 09 Aug 2012 13 :33:46 +0000"+"\n"+"/ApiChannel/Report.m";
//String toHashUtf8 = URLEncoder.encode(toHash, "UTF-8");
String res = hmac_sha1(toHash, key);
//System.out.print(res+"\n");
String signature;
try {
signature = new String(Base64UrlSafe.encodeBase64(res.getBytes()),"UTF-8");
signature = appendEqualSign(signature);
System.out.print(signature);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public 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
String hexBytes = byte2hex(rawHmac);
return hexBytes;
} catch (Exception e) {
< p> throw new RuntimeException(e);}
}
private static String byte2hex(final byte[] b){
String hs="";
String stmp="";
for (int n=0; n stmp=(java.lang.Integer.toHexString(b[n] & 0xFF)); if (stmp.length()==1) hs=hs+"0"+stmp; else hs=hs+stmp; } return hs; } private static String appendEqualSign(String s){ int len ??= s.length(); int appendNum = 8 - (int)(len/8); for (int n=0; n s += "%3D"; } return s; } } Reference:/topic/1002652