如何使用密钥在swift 4中哈希sha256?

时间:2018-01-23 16:03:04

标签: swift hash sha256

我目前正在开发一个项目(在swift 3/4中),我需要散列格式如下的HTTP请求:

    {"request": {"method": "getMyPeople", 
    "params": {"api_key": 00de5089d590e413807343166da22a45,
    "user_id": 8 }, "id": "1"}}

我正在尝试使用密钥在SHA-256中进行哈希处理,这看起来像这样:

    6b107c7ebebf056e1c45924d0546d35e

我需要什么:

  1. 我需要能够使用密钥与sha256进行哈希。
  2. 我需要散列请求为十六进制形式的字符串,以便我向数据库发出请求
  3. 我有什么:

    1. 设置我的标题桥文件以使用objective-c code
    2. 看了很多解决方案,其中没有一个为我工作
    3. 我尝试过的解决方案: 我最近的尝试是Zaph的帖子(https://stackoverflow.com/a/39249920/8093921)。

      问题出在哪里: 当我尝试转换

      的形式时,我的问题似乎发生了
       hashSHA256: <aabc766b 6b357564 e41f4f91 2d494bcc bfa16924 b574abbd ba9e3e9d a0c8920a>
      
      如在Zaph的帖子中所见,他们将其留在这种形式,我需要它以十六进制的字符串形式。

      如果有人需要更多说明,请告诉我。 提前感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

我承认把所有东西放在一起会让人感到困惑,但最终的解决方案非常简单:

extension String {

    func hmac(key: String) -> String {
        var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
        CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), key, key.count, self, self.count, &digest)
        let data = Data(bytes: digest)
        return data.map { String(format: "%02hhx", $0) }.joined()
    }

}

示例:

let result = "test".hmac(key: "test")

结果:

88cd2108b5347d973cf39cdf9053d7dd42704876d8c9a9bd8e2d168259d3ddf7