如何将hash_hmac函数从PHP转换为iOS Swift?

时间:2017-05-10 06:20:38

标签: php ios swift hash sha

您好我需要将 hash_hmac php方法实现为 swift 并尝试这样:

var hexString = ""
var result: [CUnsignedChar]
if let cKey = keyStr.cString(using: String.Encoding.utf8),
    let cData = messageStr.cString(using: String.Encoding.utf8)
{
    let algo  = CCHmacAlgorithm(kCCHmacAlgSHA256)
    result = Array(repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
    CCHmac(algo, cKey, cKey.count, cData, cData.count, &result)
} else {
    fatalError("ERROR...")
}

for byte in result {
    hexString += String(format:"%2hhx", UInt8(byte))
}

print(hexString)

但这并不像 PHP 完全那样模拟。

我尝试了这段代码:

let secretData : Data = messageStr.data(using: .utf8)!
let signatureData : Data = keyStr.data(using: .utf8)!
let digest = UnsafeMutablePointer<UInt8>.allocate(capacity:Int(CC_SHA256_DIGEST_LENGTH))
var hmacContext = CCHmacContext()
CCHmacInit(&hmacContext, CCHmacAlgorithm(kCCHmacAlgSHA256), [UInt8](secretData), secretData.count)
CCHmacUpdate(&hmacContext, [UInt8](signatureData), [UInt8](signatureData).count)
CCHmacFinal(&hmacContext, digest)
let cryptData = Data(bytes: digest, count: Int(CC_SHA256_DIGEST_LENGTH))
macStr = cryptData.hexEncodedString()

但它不起作用......

编辑:

  

消息:a3FQZHJ1Z0hnOFhpZ2xkWg == 8v8Fs6LXKTJOha69tsvUew ==
  键:   u6KuXJLIUwEUl7noY8J8H1ffDRwLC / 5gjaWW1qTQ3hE =
  快速输出:   37987524d1a379d67b2bae0a1618296d48b7a1f058a3b5816bf8070cb2fdf2ec
  php输出:   30f39f78a24ae2e6037114708f97fae1f3fede8dabece012a12b6625f3329302

2 个答案:

答案 0 :(得分:0)

Swift代码中有错误:

CCHmacInit(&hmacContext, CCHmacAlgorithm(kCCHmacAlgSHA256), [UInt8](secretData), secretData.count)
CCHmacUpdate(&hmacContext, [UInt8](signatureData), [UInt8](signatureData).count)

CCHmacInit取得钥匙 CCHmacUpdate获取数据 问题代码有倒退。

  

注意:

在这种情况下,有一个单击HMAC功能更容易使用,更难出错:
CCHmac(CCHmacAlgorithm algorithm, const void *key, size_t keyLength, const void *data, size_t dataLength, void *macOut);

答案 1 :(得分:0)

已解决此问题: (Swift 3)

extension Data {

    func hexEncodedString() -> String {
        return map { String(format: "%02hhx", $0) }.joined()
    }
}

func HMAC_CREATOR(MIX_STR mixStr:String,KEY_DATA_UINT8 keyDataUint8:Array<UInt8>) -> String {
        let signatureData : Data = mixStr.data(using: .utf8)!
        let digest = UnsafeMutablePointer<UInt8>.allocate(capacity:Int(CC_SHA256_DIGEST_LENGTH))
        var hmacContext = CCHmacContext()
        CCHmacInit(&hmacContext, CCHmacAlgorithm(kCCHmacAlgSHA256), (keyDataUint8), (keyDataUint8.count))
        CCHmacUpdate(&hmacContext, [UInt8](signatureData), [UInt8](signatureData).count)
        CCHmacFinal(&hmacContext, digest)
        let macData = Data(bytes: digest, count: Int(CC_SHA256_DIGEST_LENGTH))
        return  macData.hexEncodedString()
    }