2017-06-13 85 views
-1

我需要關於在swift 3中使用HMACSHA1爲web請求進行簽名的幫助。 我在Java中有一個例子,但真的不知道如何在swift中完成它。在Base64和HMAC sha1中轉換字符串

爪哇式:

signature = Base64.encode(HMAC_SHA1.digest(data,Base64.decode(client_secret)) 

signature = +t2GOKtZt1hU+C7OGBKZbDOKxds= 
+2

[實施HMAC和在迅速SHA1加密](的可能的複製https://stackoverflow.com/questions/26970807/implementing-hmac-and-sha1-encryption-in-swift ) – shallowThought

回答

0

問題解決

extension String { 
    func hmac(algorithm: kCCHmacAlgSHA1, key: NSData) -> String { 
     let cKey = key 
     let cData = self.cString(using: String.Encoding.ascii) 
     var cHMAC = [CC_SHA1_DIGEST_LENGTH] 
     CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA1), cKey.bytes, cKey.length, cData, Int(strlen(cData!)), &cHMAC) 
     let hmacData:NSData = NSData(bytes: cHMAC, length: cHMAC) 
     let hmacBase64 = hmacData.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0)) 
     return String(hmacBase64) 
    } 
} 

let hmacResult: String = cData.hmac(algorithm: HMACAlgorithm.SHA1, key: keyData) 
0

解決方案:

extension Data { 

    func hmacsha1(key: String) -> String? { 
     guard let keyData = Data(base64Encoded: key, options: .ignoreUnknownCharacters) else { 
      return nil 
     } 
     var digest = [UInt8](repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH)) 
     self.withUnsafeBytes({ dataBytes in 
      keyData.withUnsafeBytes({ keyDataBytes in 
       CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA1), keyDataBytes, keyData.count, dataBytes, self.count, &digest) 
      }) 
     }) 
     return Data(bytes: digest).base64EncodedString() 
    } 

} 

測試:

let data = Data("Test".utf8) 
    let key = Data("Key".utf8).base64EncodedString() 
    let hmac = data.hmacsha1(key: key) 

結果:"xIcCRlnXa+IqFtO+9AF3OqeRdAU="

+0

嗨,當我用數據' 「3tme3bnmepmibhvv1toq4xfed866faaa06aa1b13979653502956」'和'鍵 「0gkp7n6tnwdn816kyzfp26s3e」 您的解決方案'我已經得到了這個'「結果= zWYYH5p8jUn6cAHjP + oB6IbOUuU ='但我需要'1WVoLPXcqJVKaxSK50ArFHtKtnM ='。也許它的becouse它不解碼就像在java的例子? 'Base64.decode(client_secret)' –

+0

對不起,我的代碼中有一個錯字。我在'CCHmac'的行中使用了'keyData.count'兩次。我相應地調整了我的答案。現在,一切都應該工作。 – sundance

+0

我解決了一個問題,感謝您的幫助,如果你有興趣我添加一個代碼片段 –

0

迅速3: 第一個C將圖像轉換爲數據。然後將此imageData轉換爲base64字符串。

 imgData = UIImageJPEGRepresentation(image, 0.9)! as Data 
    strBase64 = imgData.base64EncodedString(options: .lineLength64Characters) as NSString 

然後使用這個base64字符串,無論你想要的地方。