在 Base64 和 HMAC sha1 中转换字符串

Converting string in Base64 and HMAC sha1

我需要帮助在 swift 3 中使用 HMAC SHA1 为 Web 请求签名。 我在 Java 中有一个示例,但真的不知道如何在 swift 中执行。

Java公式:

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

signature = +t2GOKtZt1hU+C7OGBKZbDOKxds=

解决方案:

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="

swift 3 : 首先将图像转换为 data.Then 将此图像数据转换为 base64 字符串。

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

然后随处使用这个 base64 字符串。

问题已解决

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)