title: Different HMAC result for JAVA and iOS
body: <p>I'm trying to generate HMAC based on string value and key</p>
  
  <pre><code>public static byte[] hmacSha1(String value, String key) throws NoSuchAlgorithmException, InvalidKeyException {
  
      // some values hardcoded for simplicity of this code sample
      key = "GET\\n?nodeList\\nThu, 10 Jul 2014 13:35:32 GMT\\nda39a3ee5e6b4b0d3255bfef95601890afd80709\\n";;
      value = "6020834c535670ab1da86f7697241cb43ab6fb90";
      final String type = "HmacSHA1";
      final String charset = "ASCII";
  
      byte[] keyBytes = new byte[0];
      try {
          keyBytes = key.getBytes(charset);
      } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
      }
  
      SecretKeySpec secret = new SecretKeySpec(keyBytes, type);
      Mac mac = Mac.getInstance(type);
      mac.init(secret);
  
      byte[] bytes = new byte[0];
      try {
          bytes = mac.doFinal(value.getBytes(charset));
      } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
      }
  
      Log.d(TAG, "bytes to hex: " + bytesToHex(bytes));
      // result Android:  512B5CE2EA1CD71FF34C9DDB693F59288EF71B42
      // iOS: 96f852a08d3ee255b77364a6bbd106be0dc0e44e
  
      return bytes;
  }
  </code></pre>
  
  <p>And Android result (hex value) doesn't match the one that has iOS app (using same string value and key).</p>
  
  <pre><code>(NSString *)HMAC_SHA1WithKeyData:(NSData* )key
  {
  const char * cData = [self cStringUsingEncoding:NSASCIIStringEncoding];
  
  unsigned char cHMAC[CC_SHA1_DIGEST_LENGTH];
  
  CCHmac(kCCHmacAlgSHA1, [key bytes], [key length], cData, strlen(cData), cHMAC);
  
  NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC
                                        length:sizeof(cHMAC)];
  
  const unsigned char * buffer = (const unsigned char *)[HMAC bytes];
  NSMutableString *HMACString = [NSMutableString stringWithCapacity:HMAC.length* 2];
  for (int i = 0; i &lt; HMAC.length; i++) {
      [HMACString appendFormat:@“%02x”, buffer[i]];
  }
  
  return HMACString;
  }
  </code></pre>
  
  <p>Android HMAC (hex): 512B5CE2EA1CD71FF34C9DDB693F59288EF71B42</p>
  
  <p>iOS HMAC:  96f852a08d3ee255b77364a6bbd106be0dc0e44e</p>
  
  <p>Can someone clarify please how can i get the same HMAC as iOS does (cause it matches the back-end result).</p>