在 Python 中为哈希函数实现我自己的哈希算法

Posted

技术标签:

【中文标题】在 Python 中为哈希函数实现我自己的哈希算法【英文标题】:Implement my own hash algorithm for a hash function in Python 【发布时间】:2016-03-05 18:51:12 【问题描述】:

我正在对社交网络的用户登录和帐户创建进行建模,并且必须使用我自己的散列算法创建一个散列函数(不使用 hashlib)。它的重点是获取密码并对其进行哈希处理,使其成为随机的字母和数字字符串。当仅更改密码的一个字母时,散列密码也应发生显着变化。例如,如果“heyguys”转到 7h8362,“hayguys”将转到完全不同的内容,例如“bbb362”。输入字符串的微小变化应该会导致输出字符串的巨大变化。我这样做的原因是因为我将用户数据存储在字典中,并且以明文形式存储密码很危险。

我该怎么做呢?我是初学者并且知道 hashlib,但除此之外,我似乎不知道从哪里开始。

【问题讨论】:

如果您是初学者,您不应该这样做。您应该使用标准化的散列算法,例如 SHA-256,并且如果可能的话,使用其他人的实现,而不是您自己的。您还需要使用随机的每用户盐和密码散列,以使彩虹表攻击不可行。 您是否尝试过查看标准方法?选项太多了,“python 加密哈希示例”的快速 google 将为您提供所需的大部分信息。 由于您是初学者,因此只需使用标准哈希值而不是自行设计的哈希值。设计自己的哈希算法需要相当多的数学技能,应该留给专业人士。 @DarkFalcon:见鬼,SHA-256 不会削减它。你想要一个为密码散列设计的算法,比如bcrypt or scrypt。 请听从user2357112的建议!只是散列不好有几个原因;例如它会显示 2 个用户是否使用相同的密码。暴力破解太容易了。考虑使用(按顺序):scrypt、bcrypt、PBKDF2。 【参考方案1】:

正如其他人在这里所说,这是一个高级主题,除非您知道自己在做什么,否则您不应该尝试制作可行的哈希函数。

但是,如果您想了解散列的基础知识,请考虑以下几点。

    等效输出:在每个哈希函数中,您应该能够为每个彼此相同的输入获得相同的输出,因此,hash(8) = 'y758tff' 应该是 'y758tff' 每次 hash(8) 是调用。

    避免冲突:良好的散列函数为尽可能多的输入提供独特的输出。意思是,Hash(n)Hash(x),不应该给出相同的 Hash 输出,如果必须发生,应该是非常罕见的。

    不可逆性:一个好的散列函数几乎不可能反转回它的键。意思是,对于每个Hash(n) = N,都不应该有函数使function(N) = n。例如,如果您有一个简单地反转输入的哈希函数,那么创建一个反转该哈希输出的函数将非常容易。

    相同长度的键:无论输入的长度如何,对于一个好的散列函数,输出必须是所有输入的相同长度。这样,Hash('a') = '46fhur78'Hash('Tomatoes') = 'yfih78rr' 的长度都是 8。

【讨论】:

以上是关于在 Python 中为哈希函数实现我自己的哈希算法的主要内容,如果未能解决你的问题,请参考以下文章

python之哈希算法

python hash()和哈希算法

Python 请求 - HTTPDigest:在摘要授权中将哈希算法设置为 SHA-512

哈希算法和哈希表的区别?

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 9 哈希表原理

哈希表与哈希(Hash)算法