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

时间:2019-08-02 18:27:29

标签: python python-3.x hash md5

我正在编写一个可以调用各种AP​​I的应用程序。每个API都有自己的日志记录,我想简化跨所有日志文件的事务跟踪。

为此,我在事务开始时创建一个唯一的(ish)字符串,将其记录下来,然后将该字符串传递给其他API,以便它们都可以将其包括在日志中。

这是我正在使用的代码:

s = '%s %s' % (username, datetime.datetime.now())
token = hashlib.md5(s.encode('utf-8')).hexdigest()

这很好,但是还有改进的余地。 hexdigest()(显然)仅使用十六进制字符,即0-9a-f。如果偶尔遇到令牌冲突,我不太在乎,但我想尽可能避免。有没有类似的功能可以使用全部26个字母?

3 个答案:

答案 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,甚至只是生成一个随机数数字!

相关问题