【问题标题】:Own Implementation of Hash [closed]自己的哈希实现[关闭]
【发布时间】:2018-04-24 05:44:49
【问题描述】:

我正在尝试了解有关密码哈希的更多信息。我非常习惯于 java 并且正在尝试为密码编写自己的散列函数。我知道您永远不应该实施自己的密码安全性,这纯粹是一项学术努力。我自己实现了 HashMap 和其他数据结构。如果需要,我将不胜感激散列的工作原理和代码片段的描述。我已经搜索了答案,但我能找到的只是如何使用 SHA 256(或其他)来散列密码。我想自己制作以了解有关算法的更多信息。感谢您的所有帮助。

附言 澄清一下,我知道您可以在 java 中导入一些算法来散列密码。我正在寻找有关这些函数如何工作以及它们与 hashMap 的相似之处的描述,以便我可以尝试复制它。

【问题讨论】:

  • 这太宽泛了。请求代码示例和关于哈希之类的主题的教程太多了。您具体需要哪些帮助?
  • 我知道这是一个广泛的问题,我并不想变得困难。只是描述了拥有密码与将数据散列到地图中的不同之处。我不是在寻找任何可以帮助我的项目的信息。
  • @HoldenDinerman 我相信您正在寻找的术语是加密哈希。我不认为这个问题是可以提出的。它似乎天生就太宽泛了。
  • 我实际上只是搜索了该术语,显然并非所有加密哈希算法都可以安全地用于加密,但这将是一个起点。

标签: java security hash hashmap


【解决方案1】:

这是一个非常广泛的问题,但希望一些高级细节会对您有所帮助。

首先,正如您所说,您通常不应该自己实现安全哈希函数,因为很容易出错导致安全漏洞。

加密散列(例如在 SHA-2 中以各种位强度提供的)是将输入字节转换为指定长度的输出的单向加密过程。假设算法正确,这个输出不能直接转换回输入。

有关 SHA-2 算法的具体讨论,您可以从维基百科页面开始:https://en.wikipedia.org/wiki/SHA-2

在设计您自己的算法时,您需要考虑以下因素(正如 SHA-2 和其他哈希算法所做的那样,摘自维基百科):

  • 它是确定性的,因此相同的消息总是产生相同的哈希
  • 可以快速计算任何给定消息的哈希值
  • 除非尝试所有可能的消息,否则从哈希值生成消息是不可行的
  • 对消息的一个小改动应该会广泛地改变哈希值,以至于新的哈希值看起来与旧的哈希值不相关
  • 不可能找到两条具有相同哈希值的不同消息

进一步,特别是密码哈希:

  • 与上述“快速”考虑相反,密码散列算法通常被选择为更慢且更难在硬件(例如 scrypt)中实现,以降低在知道其散列和盐分时暴力破解密码的能力.通常这是通过执行大约 1000 多轮 SHA-2 来完成的。

最后,在散列算法本身之外,确保密码散列被加盐很重要。这里的盐指的是在散列之前修改密码(例如通过添加前缀),然后使用随机生成的盐值,该盐值也与散列一起存储。这可以防止现有的或单个密码哈希字典被用于数据库中的所有哈希(即它迫使攻击者单独攻击每个哈希)。

【讨论】:

    猜你喜欢
    • 2013-12-21
    • 2013-03-05
    • 1970-01-01
    • 2016-03-05
    • 2010-09-15
    • 1970-01-01
    • 2022-12-15
    • 2011-12-13
    • 2011-08-11
    相关资源
    最近更新 更多