2017-11-10 198 views
0

我正试图学习更多关于密码哈希。我很习惯于Java,并试图编写我自己的密码散列函数。我知道你永远不应该实现你自己的密码安全,这纯粹是一个学术努力。我做了我自己的HashMap和其他数据结构的实现。如果需要,我会很感激哈希如何工作和代码片段的描述。我已经搜索了一个答案,但我能找到的是如何使用SHA 256(或其他)来散列密码。我想让自己更多地了解这些算法。感谢您的帮助。自己实现哈希

p.s. 为了澄清,我知道有一些算法可以在java中导入哈希密码。我正在寻找这些函数如何工作的描述,以及如何类似于一个哈希映射,以便我可以尝试复制它。

+3

这太宽泛了。请求代码示例和有关散列等主题的教程太多了。你需要什么特别的帮助? – Carcigenicate

+0

https://en.wikipedia.org/wiki/Cryptographic_hash_function – nicovank

+0

我知道这是一个广泛的问题,我并不是很难。只需说明密码的不同之处在于将数据散列到地图中。我没有特别寻找任何可以帮助我的项目的信息。 – HoldenDinerman

回答

2

这是一个非常宽泛的问题,但希望有一些高层次的细节可以帮助你。

首先,正如你所说,你通常不应该自己实现一个安全的散列函数,因为犯错很容易导致安全漏洞。加密哈希,例如在SHA-2中以各种位强度提供的,是将输入字节转换为指定长度的输出的单向加密过程。假设有正确的算法,该输出不能直接转换回输入。

在特定的SHA-2算法讨论,您可以用维基百科页面开始:https://en.wikipedia.org/wiki/SHA-2

为了设计自己的算法,你会想考虑下列因素(如SHA-2等散列算法做,维基百科摘录):

  • 它是确定性的,因此同样的消息总是导致相同的哈希
  • 它是快速计算哈希值对于任何给定的消息
  • 是不可行的产生从它的哈希值的消息,除了通过尝试所有可能的消息
  • 一个小改动的消息应该改变的哈希值如此广泛,新的哈希值会出现与旧的哈希值不相关
  • 它是不可行的找到具有相同散列值的两个不同消息

另外,用于特定的密码哈希:

  • 逆着“快速”上述考虑,密码散列算法通常选择n在硬件中较慢并且更难实现(例如, scrypt),以减少在密码和盐已知时强制密码的能力。通常这是通过执行大约1000多轮SHA-2来完成的。

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