如何在Django中签署SHA1签名?

0 投票
1 回答
874 浏览
提问于 2025-04-16 17:53

我还没有深入了解django和签名的相关内容。

我正在尝试根据给定的要求创建一个签名。

这里的内容是:i = 我的用户名,v = 过期时间,s = 签名。

i: MYUSERNAME
v: UNIX时间戳 + 2小时
a: 我的API密钥
s: SHA1签名,格式是 ("i=MYUSERNAME&v=(UNIX_TIMESTAMP + API_KEY)")

这是我目前的进展。

import hashlib
import datetime
from datetime import timedelta
import time

now = datetime.datetime.now()
now = now + timedelta(hours=2)
seconds = time.mktime(now.timetuple())
seconds = seconds
API = "87df234207v4444444"
signature = hashlib.sha1()
signature.update("i=MYUSERNAME&v=%s%s" % (seconds, API))

然后当我访问这个网址时,我得到了一个“签名错误”的回应。

我在这个领域的知识有限,非常感谢你的帮助。

有效的iframe以获取正确的代码是 http://api.myurl.com/i=MYUSERNAME&v=UNIX TIMESTAMP + 2 HOURS&s=MY VALID SIGNATURE

PDF文档

想象一下,我们需要为以下网址计算签名:

http://framed.incloode.com/index.php?i=TEST&arg1=val1&arg2=val2&t=123
计算签名的方法如下:

  • 遍历所有参数和它们的值,
  • 把这些参数拼接成一个长字符串,像普通的GET请求一样,
  • 对于上面的网址,这个长字符串看起来是这样的: i=TEST&arg1=val1&arg2=val2&t=123
  • 为了指定这个链接有效的时间,需要添加一个有效性参数。 有效性是一个UNIX时间戳——如果有效期是2小时,应该传入的值是time() + 7200。这个有效性(参数和值)也必须添加到要签名的字符串中。 对于上面的网址,现在看起来是这样的: i=TEST&arg1=val1&arg2=val2&t=123&v=1444567890 最初网址中的请求应该被这个列表替换。
  • 然后将上面收集的字符串从HTML中解码(htmlspecialchars_decode()),最终得到的字符串看起来是这样的: i=TEST&arg1=val1&arg2=val2&t=123&v=1444567890
  • 你获得的“INCLOODE_API_SECRET”必须添加到这个字符串中: i=TEST&arg1=val1&arg2=val2&t=123&v=1444567890**INCLOODE_API_SECRET**
  • 最后,必须生成这个字符串的SHA1校验和。然后,将其附加到步骤(3)中获取的参数/值列表中。 最终结果可能看起来是这样的: http://framed.incloode.com? i=TEST&arg1=val1&arg2=val2&t=123&v=1444567890&s=abcdef0123456789

1 个回答

0

从你的描述中,我能看到的唯一问题就是你没有在最后获取十六进制的摘要,我只能猜测这是服务器所期待的。你应该发送这个值:

hashed = signature.hexdigest()

如果还有问题,请把这个网络服务的文档发过来,并确保你注意了大小写的要求(你永远不知道...)

撰写回答