If your API Service Security Authentication Protocol requires the hmac_sha1 method to encode information, and your service is implemented by PHP, the client is implemented by JAVA, in order to correctly compare the signature, a matching encoding method needs to be established between the two. the PHP side is as follows: define (ID, 123456); define (KEY, k123456); $ strToSign
If your API Service Security Authentication Protocol requires the hmac_sha1 method to encode information, and your service is implemented by PHP, the client is implemented by JAVA, in order to correctly compare the signature, a matching encoding method needs to be established between the two. the PHP side is as follows: define ('id', '000000'); define ('key', 'k123456'); $ strToSign
If your API Service Security Authentication Protocol requires the hmac_sha1 method to encode the information,
Your service is implemented by PHP and the client is implemented by JAVA. To correctly compare the signature, you need to establish a matching encoding method between the two.
The PHP side is as follows:
define('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);
Pay attention to the following points on the JAVA side:
1. The hmac_sha1 encoding result must be converted to hex format.
2. The implementation of base64 in java is inconsistent with that in php. java does not fill the = sign at the end of the string to add the number of bytes as an integer of 8.
3. hmac_sha1 is not sha1, and hmac_sha1 needs to share the key.
The implementation is as follows:
import java.io.UnsupportedEncodingException;import javax.crypto.Mac;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) { throw new RuntimeException(e); } }private static String byte2hex(final byte[] b){ String hs=""; String stmp=""; for (int n=0; n
iefreer