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

在Python中为哈希函数实现我自己的哈希算法,python,algorithm,hash,hash-function,Python,Algorithm,Hash,Hash Function,我正在为社交网络的用户登录和帐户创建建模,并且必须使用我自己的哈希算法创建一个哈希函数(不使用hashlib)。它的目的是获取一个密码并将其散列,使其成为一个随机的字母和数字字符串。当密码中只有一个字母被更改时,哈希密码也应该发生显著变化。例如,如果“heyguys”指向7h8362,“hayguys”将指向与“bbb362”完全不同的内容。输入字符串中的一个小变化应该会导致输出字符串中的一个大变化。我这样做的原因是因为我将用户数据存储在字典中,以明文形式存储密码是危险的 我该怎么做呢?我是一个

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


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

正如其他人在这里所说,这是一个高级主题,除非你知道自己在做什么,否则不应该尝试创建可行的Hash函数

但是,如果您想了解哈希的基础知识,这里有一些事情需要考虑

  • 等效输出:在每个散列函数中,您应该能够为每个彼此相同的输入获得相同的输出,这样,
    Hash(8)='y758tff'
    应该是
    'y758tff'
    ,每次调用
    Hash(8)

  • 避免冲突:好的散列函数为尽可能多的输入提供唯一的输出。这意味着,
    Hash(n)
    Hash(x)
    ,不应该给出相同的Hash输出,如果必须这样做,应该非常罕见

  • 不可逆性:一个好的散列函数,几乎不可能反转回它的键。也就是说,对于每个
    散列(n)=n
    ,应该没有函数,因此
    函数(n)=n
    。例如,如果您有一个简单地反转输入的哈希函数,那么创建一个反转该哈希输出的函数将非常容易

  • 相同长度的键:对于一个好的哈希函数,不管输入的长度如何,输出的长度必须与所有输入的长度相同。这样,
    Hash('a')='46fhur78'
    ,和
    Hash('tomatos')='yfih78rr'
    ,两者的长度都是8


  • 如果你是初学者,你不应该这样做。您应该使用标准的散列算法,如SHA-256,如果可能的话,还应该使用其他人的实现,而不是您自己的实现。为了使彩虹表攻击不可行,您还需要使用随机的每个用户盐哈希密码?有太多的选项,谷歌快速搜索“python加密哈希示例”将为您提供所需的大部分信息。由于您是初学者,只需使用标准哈希,而不是自行设计的哈希。设计一个自己的散列算法需要相当多的数学技能,应该留给专业人士去做。@DarkFalcon:见鬼,SHA-256不会解决这个问题的。你需要一个密码哈希算法,如。请按照用户2357112的建议!仅仅散列是不好的,有几个原因;e、 g.如果两个用户使用相同的密码,则会显示。野蛮的强迫太容易了。考虑使用(按顺序):SCRYPT,BCRIPT,PBKDF2。