Swift5を使った、HMAC SHA256 Signatureを実装方法をサイトで調べると「CryptoSwiftを使え」的なことが書かれています。世間は、cocoapodなどのユーザーライブラリに頼ってしまう傾向があります。
HMAC SHA256を利用したSignatureはPythonやJava・C#すべて標準のライブラリが利用できます。
HMAC SHA256は最近流行りのQR決済ペイメントで利用されていて、その他多くのサービスのAuthenticationとして利用されていると思います。そのような標準的な方式なのに、Swiftの標準ライブラリで実現できないはずはないと思いました。
調査すると、https://github.com/soffes/Cryptoここのソースが参考になりました。
CommonCryptoと云う標準のライブラリを使ってHMAC SHA256実装できました。
Swift5を使った下記コード例は、11行程度なのでスマートに実装できます。
import CommonCrypto import Foundation public struct HMAC { public static func hmacsha256Base64(message: String, secretKey: String) -> String{ guard let dMessage:Data = message.data(using: .utf8), let dSecret: Data = secretKey.data(using: .utf8) else { return "" } let signature = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: Int(CC_SHA256_DIGEST_LENGTH)) defer { signature.deallocate() } //最後にメモリー開放 dMessage.withUnsafeBytes { dataBytes in dSecret.withUnsafeBytes { keyBytes in CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), keyBytes.baseAddress, dSecret.count, dataBytes.baseAddress, dMessage.count, signature) } } return Data(bytes: signature, count: Int(CC_SHA256_DIGEST_LENGTH)).base64EncodedString() } }
上記コードではbase64で返したいので最後にbase64EncodedString()しています。
使い方は下記コード例です
let signature = HMAC.hmacsha256Base64(message: "メッセージ", secretKey: "secret12345") print(signature)
signature変数には、「FgN4UUeea4/rUuLymDOULjCwHtTlCerHAq60ZvZeJdM=」が入っていました。PythonでのHMAC SHA256で確認すると同じ値でした