python中的HMAC SHA1摘要

时间:2015-04-29 14:56:35

标签: python flask sha1 hmac hmacsha1

我使用Moves API获取一些健身数据。我不想定期查询API,而是使用storyline notifications

它有效,我从API收到请求,但我无法验证请求中提供的hmac sha1签名。

文档说:

  

所有通知请求都使用Base64编码的HMAC-SHA1进行签名   签名。签名计算为HMAC_SHA1(<您的客户端)   secret>,< request body> |< timestamp> |< nonce>),换句话说客户端   密钥作为密钥和请求体,时间戳和nonce连接   作为消息数据。签名中不包含HTTP标头。   标题X-Moves-Signature,X-Moves-Timestamp和X-Moves-Nonce   包含签名,时间戳和随机数值。时间戳是   unix时间戳,自1970年1月1日00:00:00 GMT以来的秒数。

我的实施:

from hmac import new as hmac_new
from hashlib import sha1

def check_signature(signature, timestamp, nonce, client_secret, request_body):
    msg = request_body + timestamp.encode('utf-8') + nonce.encode('utf-8')
    hmac = hmac_new(key=client_secret, msg=msg, digestmod=sha1)
    return hmac.digest().encode('base64') == signature

我从烧瓶那里得到了请求并且调用我的函数喜欢这个:

check_signature(headers['X-Moves-Signature'], headers['X-Moves-Timestamp'], headers['X-Moves-Nonce'], settings['client-secret'], request.data)

值:

client-secret= mnMuu6rDMkeG5FL0Fm0ho2z14JUhMVWAntUnGz0VyXc446RtqP8J7ETfag0TQa58
request-body = {"userId": 34511428141091768, "storylineUpdates": [{"reason": "DataUpload", "endTime": "20150429T121602Z", "lastSegmentType": "place", "lastSegmentStartTime": "20150429T101434Z", "startTime": "20150429T101434Z"}]}
X-Moves-Nonce = eqVCO4bnNbN+8Hhiz7ZceA== 
X-Moves-Signature = BRMwYCxglul01wbyXpfpdtiJh2Y=
X-Moves-Timestamp = 1430309780
my-digest = paWR/3yiJ8NT8KukorGVJlpmQeM=
my-hexdigest = a5a591ff7ca227c353f0aba4a2b195265a6641e3
moves_signature = BRMwYCxglul01wbyXpfpdtiJh2Y=

我也尝试了http://www.freeformatter.com/hmac-generator.html并收到了a5a591ff7ca227c353f0aba4a2b195265a6641e3

(客户端密码不再有效)。

正如您从值中看到的,我的摘要和moves_signature不相等。可悲的是,我无法获得与移动中的摘要相同的摘要,但我无法找到问题所在。有没有人知道如何解决这个问题?

0 个答案:

没有答案