Java 从目标c到swift base64和hmacsha1

Java 从目标c到swift base64和hmacsha1,java,ios,objective-c,swift,base64,Java,Ios,Objective C,Swift,Base64,我有一个问题,试图解决它关于夫妇日,真的需要你的帮助 我需要连接到API并获取带有签名参数的post请求 范例 原始数据 data ="3tme3bnmepmibhvv1toq4xfed866faaa06aa1b13979653502956" key = "0gkp7n6tnwdn816kyzfp26s3e" 主要问题在于签名。它需要像这样生成 Java示例 signature = Base64.encode(HMAC_SHA1.digest(data, Base64.decode(clien

我有一个问题,试图解决它关于夫妇日,真的需要你的帮助

我需要连接到API并获取带有签名参数的post请求 范例

原始数据

data ="3tme3bnmepmibhvv1toq4xfed866faaa06aa1b13979653502956"
key = "0gkp7n6tnwdn816kyzfp26s3e"
主要问题在于签名。它需要像这样生成

Java示例

signature = Base64.encode(HMAC_SHA1.digest(data, Base64.decode(client_secret)))
我有使用base64和hamcsha1(CommonCrypto)的旧objective-c代码

我试着用StackOverflow社区在swift上运行它,但它不起作用

Swift代码

        let data = Data("3tme3bnmepmibhvv1toq4xfed866faaa06aa1b13979653502956".utf8)
        let key = Data("0gkp7n6tnwdn816kyzfp26s3e".utf8).base64EncodedString()
        let hmac = data.hmacsha1(key: key)

extension Data {

    func hmacsha1(key: String) -> String? {
        guard let keyData = Data(base64Encoded: key) 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()
    }
}
它正在生成

signature = "pd6oB8P8Yq92gn7eYH0qAnSLFbI="
但我需要这个

signature = "1WVoLPXcqJVKaxSK50ArFHtKtnM="
我需要帮助修复swift func或如何使obj-c代码在swift项目中工作。我想这是解码base64的错误,但我现在不知道该如何解决。

问题解决了

let keyData: NSData = Base64.decode(secret_key) as NSData
        let cData = param_signature


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


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)
    }
}

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

通常的方法是逐步运行Objective-C和Swift代码,并比较中间结果(称为“调试”)。当钥匙解码时,Swift代码在哪一步产生与目标C代码不同的值
signature = "pd6oB8P8Yq92gn7eYH0qAnSLFbI="
signature = "1WVoLPXcqJVKaxSK50ArFHtKtnM="
let keyData: NSData = Base64.decode(secret_key) as NSData
        let cData = param_signature


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


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)
    }
}

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