HMAC-SHA1 python使用/生成签名

时间:2013-11-01 01:38:38

标签: python

给出以下2个基本字符串:

GET&https%3A%2F%2Fapi.trademe.co.nz%2Fv1%2FMyTradeMe%2FWatchlist%2Fall.json&oauth_consumer_key%3DE55FD61CBB8400F67CED12FD35761BEDED%26oauth_nonce%3D83236f86429111e3963c0e4586dd63b1%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1383267848%26oauth_token%3D2A378A062E35415E242AD38EA01DE72977%26oauth_version%3D1.0
GET&https%3A%2F%2Fapi.trademe.co.nz%2Fv1%2FMyTradeMe%2FWatchlist%2Fall.json&oauth_consumer_key%3DE55FD61CBB8400F67CED12FD35761BEDED%26oauth_nonce%3D83236f86429111e3963c0e4586dd63b1%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1383267856%26oauth_token%3D2A378A062E35415E242AD38EA01DE72977%26oauth_version%3D1.0

这两个字符串的唯一区别是oauth_timestamp,它们生成如下签名:

jBy364dHhQ0kVqYSQePXqyzoDQE=
enKa2bqAgghJNXZxRbTx/2ZQYFI=

让我烦恼的是第二个字符串在签名中生成/,但不是第一个,导致oauth签名不正确。

这是我生成签名的python代码:

binascii.b2a_base64(hmac.new('{}&{}'.format(settings.OAUTH_SECRET, oauth_token_secret), base_string, sha1).digest())[:-1]

1 个答案:

答案 0 :(得分:1)

您的代码运行正常。 / is a valid base64 character, specifically 63.

如果您想要不同的行为,可以使用Python的base64 library b64encode方法并指定altchars=参数,您可以为其替换{+。 1}}和/

例如,如果要使用(非标准!)修改后的Base64 for Filenames,则将"+-"指定为altchars参数:

base64.b64encode(hmac.new(...), altchars='+-')

但是,这可能与您选择使用的任何第三方端点不兼容。如果可能的话,你最好坚持使用默认值。