0

我对 Swift 相当陌生,目前正在研究 HTTP 签名。我正在使用this answer中的方法,但该实现不起作用,并且给我的哈希值与我在 Python 中的替代实现中得到的哈希值不同(我更熟悉,但只有密码学原理的基本知识) .

这是斯威夫特代码:

let secret = "my-secret"

let headersForSig = "single-string-combining-headers-with-\n"

let keyForHash = SymmetricKey(data: secret.data(using: .utf8)!)
let signatureHash = HMAC<SHA256>.authenticationCode(for: headersForSig.data(using: .utf8)!, using: keyForHash)

- 编辑 -

在下面@sulthan 的评论之后,将签名的最终格式更改为:

let basedSignatureHash = Data(signatureHash).base64EncodedString()

这一切都遵循上述链接的答案。但是具有此签名的 API 调用不起作用,并且看起来不像 Python 实现中的哈希。

Python 中的另一种方法确实有效:

sig_value = "".join(list-of-headers-for-signature)

sig_value_string = str(sig_value)

sig_value_utf = bytes(sig_value_string, encoding='utf-8')

secret = base64.b64decode("my-secret")

hash_value = hmac.new(secret, sig_value_utf, hashlib.sha256)

signature = base64.b64encode(hash_value.digest()).decode("utf-8")

这行得通,不出所料,签名哈希是不同的!如何在 Swift 中模仿这种方法?还是有其他东西,比如标题的顺序,这两者之间可能会有所不同?

两种语言中设置request对象的结构几乎相同:使用目标 URL 创建请求对象,添加所需的非签名标头,然后创建签名并将其添加为最后一个标头。

4

0 回答 0