我正在编写一个可以调用各种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个字母?
答案 0 :(得分:1)
请尝试使用https://en.wikipedia.org/wiki/Ascii85及其URL安全变体,以获得更密集的表示形式。
当然,您将必须编码原始字节。 (此外,从加密角度来看,MD5并不是一个好的选择,SHA2更好。)
答案 1 :(得分:0)
您可以执行类似的操作,但这是极端的超载。但是令牌冲突的可能性更多是理论上的,因为正在使用SHA3 512和多种盐。
import uuid
import bcrypt
import base64
import hashlib
import secrets
from datetime import datetime
username = 'testuser'
# three different salts
salt_hex = uuid.uuid4().hex
salt_bcrypt = bcrypt.gensalt(10)
salt_secret = secrets.randbits(256)
s = '%s %s %s %s %s' % (username, salt_hex, salt_bcrypt, salt_secret, datetime.now().timestamp())
token = hashlib.sha3_512(s.encode('utf-8')).hexdigest()
# produces a slightly shorter token
hash = hashlib.sha3_512(s.encode('utf-8')).digest()
token_base64 = base64.b64encode(hash)
答案 2 :(得分:0)
您可以对数据进行哈希处理,然后使用base64对哈希进行编码,而不是直接采用十六进制摘要:
this.onGround
这将使用所有26×2 + 10 = 62个字母数字字符,以及s = '%s %s' % (username, datetime.datetime.now())
digest = hashlib.md5(s.encode('utf-8')).digest()
token = base64.b64encode(digest)
和+
。
您的实现可能会产生以下内容:
/
使用base64对其进行编码会略微减少长度:
d88cc7dea0fee57975187d4b30950f7b
但是,如果要避免发生冲突,则需要增加摘要的长度-因此,例如,使用SHA512之类的哈希函数代替MD5,甚至只是生成一个随机数数字!