基于某些十六进制生成随机字符串

时间:2012-04-30 09:48:32

标签: python string random passwords md5

我在python中有一个md5校验和;比如s = '14966ba801aed57c2771c7487c7b194a'

我想要的是缩短它并使其成为'a-zA-Z0-9 _.-'形式的字符串,而不会丢失随机md5校验和的熵。

输出必须是可发音的,所以我不能只做binascii.unhexlify(s)。我也不能base64.encodestring(s)切割它,因为那样我就会失去熵。

关于如何在不将十六进制对(00-> FF)的疯狂数字(256)映射到不同字母的情况下解决此问题的任何想法?

我想要这个的原因是能够通过电话说出整个md5校验和,但是使用整个字母+数字+一些特殊字符。

3 个答案:

答案 0 :(得分:4)

我会快速松散地满足你的要求,并尝试一些我认为可能对你有用的东西。

阅读你写的内容,对我来说突出的要求是一种通过电话阅读消息摘要的方法。

为此,您可能需要查看Bubble Babble。 Bubble Babble旨在将摘要(或其他内容)编码为可发音的字符串:

ASCII Input       Encoding
------------------------------------------------------------------
`' (empty string) `xexax'
`1234567890'      `xesef-disof-gytuf-katof-movif-baxux'
`Pineapple'       `xigak-nyryk-humil-bosek-sonax'

这是一个Python实现:http://code.activestate.com/recipes/299133-bubblebabble/

答案 1 :(得分:2)

既然你想要“数字”(是的,md5哈希只是一个base16号码,我们当然可以把它转换为base-something来缩短字符串)通过手机代词,我建议避免混合上层 - /小写。 当我们只允许[0-9A-Z]时,我们可以简单地使用带有Base36的builtin int()进行解码。

请参阅:

>>> def encode(num):
        import string
        ALPHABET = string.digits + string.ascii_uppercase
        tmp = []
        while num:
            num, rem = divmod(num, len(ALPHABET))
            tmp.append(ALPHABET[rem])
        return ''.join(reversed(tmp))

>>> import hashlib
>>> the_hash = hashlib.md5('test').hexdigest()
>>> decimal_representation = int(the_hash, 16)
>>> encoded = encode(decimal_representation)
>>> the_hash
'098f6bcd4621d373cade4e832627b4f6'
>>> decimal_representation
12707736894140473154801792860916528374L
>>> encoded
'KDISMNX5MOYU6Q6PZT8TQDPY'
>>> decimal_representation == int(encoded, 36)
True
>>> hex(int(encoded, 36))
'0x98f6bcd4621d373cade4e832627b4f6L'

当然,你可以使用更长的字母来缩短生成的字符串,但是你必须编写自己的decode()函数。但不应该太难。

答案 2 :(得分:0)

  • 简答:你不能
  • 更长的回答:
    md5 hashsum包含128位信息,因此要存储您还需要128位。从你那里得到的最接近人类可读的形式可能是对它进行base64编码,这将留下22个字符(24个带填充)。这可能是它的最短时间。*
    无论如何,md5哈希中的随机性来自哪里? md5哈希不是随机的,所以你可能会随机抽取一些东西(什么?)来获取它们(通过这样做你不能以任何方式增加熵,只能减少它)。

*您可能会创建自己的方法来使用unicode范围中更大范围的字符对校验和进行编码...但这意味着您必须选择一组合适的字符,任何人都知道如何发音。 。
☺ ⚓ ⚔ ☂ ☏这样的东西看起来相当清楚,但像这样的符号却没那么多......

相关问题