Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 转换Base64和HMAC sha1中的字符串_Java_Swift_Base64_Hmac_Hmacsha1 - Fatal编程技术网

Java 转换Base64和HMAC sha1中的字符串

Java 转换Base64和HMAC sha1中的字符串,java,swift,base64,hmac,hmacsha1,Java,Swift,Base64,Hmac,Hmacsha1,我需要帮助在swift 3中使用HMACSHA1为web请求签名。 我有一个Java的例子,但真的不知道如何用swift来做 Java公式: signature = Base64.encode(HMAC_SHA1.digest(data,Base64.decode(client_secret)) signature = +t2GOKtZt1hU+C7OGBKZbDOKxds= 解决方案: extension Data { func hmacsha1(key: String) -&g

我需要帮助在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()
    }

}
测试:

结果:
“xIcCRlnXa+IqFtO+9af3okerdau=“

swift 3: 首先将图像转换为数据。然后将此imageData转换为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)

当我使用数据为“3TME3BNMEPMIBHvvv1toq4xfed866FAAA06AA1B13979653502956”和键为“0GKP7N6NWDN816KYZFP26S3E”的解决方案时,Hi可能重复,我得到了这个结果=ZWYYYH5P8JUN6CAHJP+OB6IBOUUUU=”,但我需要'1WVOLPXCQJVKAXSK50ARFHTNM=
。可能是因为它不像java示例中那样解码
Base64.decode(client_secret)`对不起,我的代码输入错误。我使用了
keyData.count
CCHmac
行中两次。我相应地修改了我的答案。现在,一切都应该正常了。我解决了一个问题,如果你有兴趣,谢谢你的帮助。我添加了一个代码片段
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)