【问题标题】:Converting string in Base64 and HMAC sha1在 Base64 和 HMAC sha1 中转换字符串
【发布时间】:2017-06-19 05:35:03
【问题描述】:

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

Java 公式:

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

signature = +t2GOKtZt1hU+C7OGBKZbDOKxds=

【问题讨论】:

标签: java swift base64 hmac hmacsha1


【解决方案1】:

迅速 3: 先把图片转成数据,再把这个imageData转成base64字符串。

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

然后在任何你想要的地方使用这个 base64 字符串。

【讨论】:

    【解决方案2】:

    解决方案:

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

    【讨论】:

    • Hi, when I use your solution with Data ` "3tme3bnmepmibhvv1toq4xfed866faaa06aa1b13979653502956" ` and key ` "0gkp7n6tnwdn816kyzfp26s3e" ` i ve got this ` 'result = zWYYH5p8jUn6cAHjP+oB6IbOUuU= ` but i need ` 1WVoLPXcqJVKaxSK50ArFHtKtnM= @987654324 @Base64.decode(client_secret) `
    • 抱歉,我的代码中有错字。我在CCHmac 的行中使用了两次keyData.count。我相应地调整了我的答案。现在,一切都应该正常了。
    • 我解决了一个问题,谢谢你的帮助,如果你有兴趣我添加一个代码sn-p
    【解决方案3】:

    问题解决了

    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)
    

    【讨论】:

      猜你喜欢
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      相关资源
      最近更新 更多