2016-08-09 4 views
1

現在、私たちのチームはHMACキーを作成していますが、iOSとAndroidの結果は異なります。 Javaの部分は正常に動作していますが、iOSの部分は動作していないようです。目的base16()。decode(String)

私たちは、鍵が最初にbase16バイト[]に変換されるように、JavaのHMAC_KEYに問題があることを確認しました。以下に相当するObjective-Cとは何でしょうか? IOSのまま現在

 byte[] hmacKey = BaseEncoding.base16().decode(HMAC_KEY); 
     SecretKeySpec signingKey = new SecretKeySpec(hmacKey, HMAC_SHA256_ALGORITHM); 
     Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM); 
     mac.init(signingKey); 
     byte[] rawHmac = mac.doFinal(data.getBytes(C_UTF8)); 



     return BaseEncoding.base64().encode(rawHmac); 

我々は、次のしている:

NSData *saltData = [salt dataUsingEncoding:NSUTF8StringEncoding]; 
NSData *paramData = [signingData dataUsingEncoding:NSUTF8StringEncoding]; 
NSMutableData* hash = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH ]; 
CCHmac(kCCHmacAlgSHA256, saltData.bytes, saltData.length, paramData.bytes, paramData.length, hash.mutableBytes); 
NSString *base64Hash = [hash base64Encoding]; 

問題は、我々はObjective-Cでこれを行うのですかBaseEncoding.base16().decode(HMAC_KEY)一部をwithingされますか?

答えて

0

JavaコードからHMAC_KEY(HexDecimalString)をNSDataに変換してから、HMAC_SHA256計算を行う必要があります。

print(dataString.sha256(HMAC_KEY.dataFromHexadecimalString())) 
:これは私のスウィフトソリューション

public extension String { 

    func sha256(key: NSData) -> String { 
     let inputData: NSData = self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! 
     let keyData = UnsafePointer<UInt8>(key.bytes) 

     let algorithm = HMACAlgorithm.SHA256 
     let digestLen = algorithm.digestLength() 
     let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen) 

     CCHmac(algorithm.toCCHmacAlgorithm(), keyData, key.length, inputData.bytes, Int(inputData.length), result) 
     let data = NSData(bytes: result, length: digestLen) 
     result.destroy() 
     return data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength) 
    } 

    func dataFromHexadecimalString() -> NSData? { 
     let data = NSMutableData(capacity: characters.count/2) 

     let regex = try! NSRegularExpression(pattern: "[0-9a-f]{1,2}", options: .CaseInsensitive) 
     regex.enumerateMatchesInString(self, options: [], range: NSMakeRange(0, characters.count)) { match, flags, stop in 
      let byteString = (self as NSString).substringWithRange(match!.range) 
      var num = UInt8(byteString, radix: 16) 
      data?.appendBytes(&num, length: 1) 
     } 

     return data 
    } 
} 

enum HMACAlgorithm { 
    case MD5, SHA1, SHA224, SHA256, SHA384, SHA512 

    func toCCHmacAlgorithm() -> CCHmacAlgorithm { 
     var result: Int = 0 
     switch self { 
     case .MD5: 
      result = kCCHmacAlgMD5 
     case .SHA1: 
      result = kCCHmacAlgSHA1 
     case .SHA224: 
      result = kCCHmacAlgSHA224 
     case .SHA256: 
      result = kCCHmacAlgSHA256 
     case .SHA384: 
      result = kCCHmacAlgSHA384 
     case .SHA512: 
      result = kCCHmacAlgSHA512 
     } 
     return CCHmacAlgorithm(result) 
    } 

    func digestLength() -> Int { 
     var result: CInt = 0 
     switch self { 
     case .MD5: 
      result = CC_MD5_DIGEST_LENGTH 
     case .SHA1: 
      result = CC_SHA1_DIGEST_LENGTH 
     case .SHA224: 
      result = CC_SHA224_DIGEST_LENGTH 
     case .SHA256: 
      result = CC_SHA256_DIGEST_LENGTH 
     case .SHA384: 
      result = CC_SHA384_DIGEST_LENGTH 
     case .SHA512: 
      result = CC_SHA512_DIGEST_LENGTH 
     } 
     return Int(result) 
    } 
} 

あなたは、単にこのようbase64Hashを得ることができ、その結果を検証したあります