【问题标题】:Implement my own hash algorithm for a hash function in Python在 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。

标签: python algorithm hash hash-function


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 2016-03-25
    • 2022-12-03
    • 2013-12-21
    • 2015-02-02
    • 2011-06-08
    • 2018-04-24
    • 2019-04-15
    相关资源
    最近更新 更多