如何快速进行HMAC-SHA1

MrD*_*kii 5 swift

我基本上是在尝试使用String并在php中执行以下操作:

    $signature= base64_encode(hash_hmac('sha1', $data, $secretKey, true));
Run Code Online (Sandbox Code Playgroud)

但是,在Swift中进行操作 ...我看到很多关于其他人试图使用CommonCrypto进行操作的帖子,但是该模块似乎没有安装。

所以确实有3个问题:

  1. CommonCrypto是执行此操作的正确方法吗?
  2. 如果是这样,如何添加框架?
  3. 如果不是CommonCrypto最好的方法,那是什么?

我当前的代码如下所示:

    var authString:String = "PUT\nTEST=BLAH\nTEST2=BLAHBLAHBLAH"
    let hmacResult:String = authString.sha1()

    ...

    extension String {
        func sha1() -> String {
          //Do Something...
        }
    }
Run Code Online (Sandbox Code Playgroud)

sun*_*nce 4

您绝对应该使用 CommonCrypto,因为它已经在所有设备上可用,经过充分测试且速度很快。您只需要添加一个包含的桥接标头

#import <CommonCrypto/CommonCrypto.h>
Run Code Online (Sandbox Code Playgroud)

如前所述,您可以在此处查找如何添加桥接头。

要计算 HMAC,您只需要此扩展:

extension String {

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

}
Run Code Online (Sandbox Code Playgroud)

例子:

let result = "test".hmac(key: "test")
Run Code Online (Sandbox Code Playgroud)

结果:

0c94515c15e5095b8a87a50ba0df3bf38ed05fe6
Run Code Online (Sandbox Code Playgroud)