为了账号安全,请及时绑定邮箱和手机立即绑定

替代使用所有 26 个字母的 hexdigest?

替代使用所有 26 个字母的 hexdigest?

千万里不及你 2022-04-23 21:40:16
我正在编写一个调用各种 API 的应用程序。每个 API 都有自己的日志记录,我想让跟踪所有各种日志文件的事务变得容易。为此,我在事务开始时创建一个唯一(ish)字符串,记录它,并将该字符串传递给其他 API,以便它们都可以将其包含在日志记录中。这是我正在使用的代码:s = '%s %s' % (username, datetime.datetime.now())token = hashlib.md5(s.encode('utf-8')).hexdigest()这运行良好,但仍有改进的余地。 hexdigest()(显然)只使用十六进制字符,即0-9和a-f. 如果我偶尔遇到令牌冲突,我不会太在意,但我想尽可能避免它。是否有类似的函数可以使用所有 26 个字母?
查看完整描述

2 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

尝试https://en.wikipedia.org/wiki/Ascii85及其 URL 安全变体以获得更密集的表示。

当然,您必须对原始字节进行编码。(此外,从加密的角度来看,MD5 是一个糟糕的选择,SHA2 更好。)


查看完整回答
反对 回复 2022-04-23
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

您可以对数据进行哈希处理,然后使用 base64 对哈希进行编码,而不是直接获取十六进制摘要:


s = '%s %s' % (username, datetime.datetime.now())

digest = hashlib.md5(s.encode('utf-8')).digest()

token = base64.b64encode(digest)

这使用所有 26×2+10 = 62 个字母数字字符,加上+和/。


您的实现可能会产生如下内容:


d88cc7dea0fee57975187d4b30950f7b

用 base64 编码会稍微减少长度:


2IzH3qD+5Xl1GH1LMJUPew==

然而,如果你想避免冲突,你需要增加摘要的长度——所以使用像 SHA512 这样的散列函数,而不是 MD5,甚至只是生成一个随机数!


查看完整回答
反对 回复 2022-04-23
  • 2 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号