自己实施哈希

时间:2017-11-10 22:39:15

标签: java security hash hashmap

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

为了设计自己的算法,您需要考虑以下注意事项(如SHA-2和其他哈希算法所做的那样,摘自维基百科):

  • 它是确定性的,因此相同的消息总是会产生相同的散列
  • 可以快速计算任何给定消息的哈希值
  • 除了尝试所有可能的消息之外,从其散列值生成消息是不可行的
  • 对邮件的小改动应该如此广泛地更改哈希值,以使新哈希值与旧哈希值不相关
  • 找到具有相同哈希值的两个不同消息
  • 是不可行的

此外,特别是密码散列:

  • 与上面的“快速”考虑相反,密码哈希算法通常被选择为更慢并且更难以在硬件中实现(例如scrypt),以便在其哈希和盐已知时降低强制密码的能力。通常这是通过做大约1000多轮SHA-2来完成的。

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