Как создать подпись HMAC-SHA1 в Android?

Это моя базовая строка:

String args ="oauth_consumer_key="+enc(consumerkey) + "&oauth_nonce="+enc(generateNonce()) + "&oauth_signature_method=HMAC-SHA1" + "&oauth_timestamp="+ timestamp + "&oauth_token="+enc(Home.consToken) + "&oauth_verifier="+verifier+"&oauth_version=1.0"; String base ="POST&"+enc("https://api.linkedin.com/uas/oauth /accessToken") +"&"+ enc(args); String signature =computeHmac(base,consumer_secret+"&"+secretToken); 

Это мой заголовок:

  String header = "OAuth " + "oauth_consumer_key=\""+ enc(consumerkey)+ "\"," + "oauth_nonce=\""+ enc(generateNonce()) + "\"," + "oauth_signature_method=\"HMAC-SHA1\"," + "oauth_timestamp=\""+ timestamp + "\"," + "oauth_token=\""+Home.consToken + "\"," + "oauth_signature=\""+enc(signature)+"\","+ "oauth_verifier=\""+verifier +"\","+ "oauth_version=\""+1.0+"\"" ; 

Я использую следующий метод для генерации Подписи:

 public String computeHmac(String baseString, String key) throws NoSuchAlgorithmException, InvalidKeyException, IllegalStateException, UnsupportedEncodingException { Mac mac = Mac.getInstance("HmacSHA1"); SecretKeySpec secret = new SecretKeySpec(key.getBytes(), mac.getAlgorithm()); mac.init(secret); byte[] digest = mac.doFinal(baseString.getBytes()); byte[] result=Base64.encodeBase64(digest); return new String(result); } 

При выполнении этого кода я получаю следующую ошибку …

 oauth_problem=signature_invalid& oauth_problem_advice=com.linkedin.security.auth.pub.LoginDeniedInvalidAuthTokenException 

Может ли кто-нибудь помочь мне в этом?

Благодаря…

Solutions Collecting From Web of "Как создать подпись HMAC-SHA1 в Android?"

Ответ intval(b) абсолютно правильный, однако для меня не было очевидно, что именно является intval(b) . Как я понял, это b & 0xFF .

Также я применил некоторые оптимизации (которые я нашел здесь ), и вот мой код:

 private static String hmacSha1(String value, String key) throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException { String type = "HmacSHA1"; SecretKeySpec secret = new SecretKeySpec(key.getBytes(), type); Mac mac = Mac.getInstance(type); mac.init(secret); byte[] bytes = mac.doFinal(value.getBytes()); return bytesToHex(bytes); } private final static char[] hexArray = "0123456789abcdef".toCharArray(); private static String bytesToHex(byte[] bytes) { char[] hexChars = new char[bytes.length * 2]; int v; for (int j = 0; j < bytes.length; j++) { v = bytes[j] & 0xFF; hexChars[j * 2] = hexArray[v >>> 4]; hexChars[j * 2 + 1] = hexArray[v & 0x0F]; } return new String(hexChars); } 

Беспокойство, но я использую это:

 static String hash_hmac(String type, String value, String key) { try { javax.crypto.Mac mac = javax.crypto.Mac.getInstance(type); javax.crypto.spec.SecretKeySpec secret = new javax.crypto.spec.SecretKeySpec(key.getBytes(), type); mac.init(secret); byte[] digest = mac.doFinal(value.getBytes()); StringBuilder sb = new StringBuilder(digest.length*2); String s; for (byte b : digest){ s = Integer.toHexString(intval(b)); if(s.length() == 1) sb.append('0'); sb.append(s); } return sb.toString(); } catch (Exception e) { android.util.Log.v("TAG","Exception ["+e.getMessage()+"]", e); } return ""; } 

Затем вы вызываете его так:

 hash_hmac("HmacSHA1", value, key);