Python中将某些数据散列为虚拟防碰撞密钥的适当方法

问题描述 投票:0回答:1

在python中,将某些数据散列为虚拟的防碰撞密钥(大概为128位左右)是什么合适的方法?系统仍使用Python 2.7。

我正在研究hashlib的Sha1和MD5,但是很难找到与安全无关的这些哈希信息。

我只需要一些东西:

  • 将为相同的数据产生相同的密钥
  • 不太可能发生键冲突(大约有128位左右)
  • 并不慢(出于安全考虑,散列有意地变慢)
python md5 uuid sha1 hashlib
1个回答
0
投票

这就是我最后要做的。

我喜欢对这样的东西进行base64编码,因为它通过将字符集减少为大多数地方可以接受/兼容的字符集而避免了问题,而不会像十六进制编码那样过度膨胀键的大小。您永远都不知道将来要在哪个位置粘贴此ID /密钥。

我在最后删除了'='符号,因为有时它会导致URL问题。从数学上讲,这使id更有可能发生冲突,因为'='表示信息。但是我认为剩下的数据足以防止冲突,特别是因为sha1是160位而不是128位。UUID是128字节,因为尽管从技术上讲可能会发生UUID冲突,但实际发生的几率如此之小几乎不可能发生冲突(这是假设您使用具有良好随机分布的良好哈希算法)。

import hashlib
import base64 

def get_key(raw_text):

    m = hashlib.sha1()
    m.update(raw_text)
    raw_bytes_key = m.digest()
    key           = base64.urlsafe_b64encode(raw_bytes_key).replace('=', '')

    return key
© www.soinside.com 2019 - 2024. All rights reserved.