【问题标题】:MD5 Hash in JSP for password - generates random hash each timeJSP 中用于密码的 MD5 哈希 - 每次生成随机哈希
【发布时间】:2012-02-12 06:07:34
【问题描述】:

为了保护密码,该密码的哈希值存储在数据库中。我正在使用此代码生成字符串的哈希值:http://www.exampledepot.com/egs/javax.crypto/GenMac.html

但我发现它每次都会为同一个字符串生成随机散列。所以我不能用它来验证密码。

如何使该代码仅基于字符串生成哈希值?也就是说,如果我输入“iloveyou”,它应该每次都生成相同的哈希值。不是一个不同的。

【问题讨论】:

  • 一般来说,不要使用 MD5(对于任何东西:它被认为是损坏的),并且不要使用快速散列进行密码散列,使用慢速散列。有关详细信息,请参阅What makes a hash function good for password hashing?。当然,如果您希望每次都相同,请不要在哈希中包含(不可重现的)随机数据。
  • 感谢您的链接。我是 JSP 新手,在 JSP 中没有内置函数可以轻松生成哈希。但在 PHP 中,有 md5()、shah1() 等。所以我正在寻找这些的 jsp 实现。
  • 在 JSP 中,您可以使用整个 Java 库,java.util.Digest 可以使用哈希函数。虽然您应该看看是否可以使用 PBKDF-2 或 bcrypt(具有足够高的工作因子)而不是简单的快速哈希函数,原因在之前链接的答案中提到。
  • 谢谢。我现在正在尝试使用固定盐。但我不确定如何将字符串作为盐传递。例如:a1Rj*EE 作为盐。参考:owasp.org/index.php/Hashing_Java 是否可行:byte[] bSalt = new byte[8];bSalt=base64ToByte("a1Rj*EE");?我也可以将长字符串传递给该函数吗?

标签: jsp hash cryptography


【解决方案1】:

你引用的代码不是简单的MD5,它是HMAC-MD5,包含一个key。第一段代码,涉及KeyGenerator,每次运行时都会生成一个随机密钥。那个不同的随机密钥每次都会给你不同的 HMAC 结果。

如果您只想要一个简单的 MD5 哈希,那么您将需要单独使用 MD5 代码,而不使用 HMAC 部分。您可能还想研究使用加密盐来保护密码哈希,否则具有相同密码的用户将具有相同的哈希。请参阅Difference between Hashing a Password and Encrypting it 进行讨论。

【讨论】:

  • 谢谢。我知道哈希是不可逆的。这就是为什么我将它用于密码。那么 KeyGenerator 每次都创建一个不同的密钥?如何更改代码以便我只能对所有字符串使用相同的键执行 MD5?在 PHP 中,我所做的是调用 md5() 传递密码。
  • 你当前没有做哈希,你正在做 HMAC (en.wikipedia.org/wiki/HMAC)。恐怕我不懂 PHP,所以我不能专门帮你。寻找 MD5 的 PHP 代码,而不是 HMAC-MD5。它们是不同的东西,并给出不同的结果。
  • 谢谢。我想要做的是在用户注册时只存储密码的哈希值。稍后当用户登录时,他输入的密码被哈希并与存储在数据库中的哈希值进行比较。我从这里找到了这个 crpto 库:stackoverflow.com/questions/9227550/… 但是示例代码每次都会生成一个新密钥。那么,如何在 JSP 中单独使用带有文本键(或默认键)的 MD5 散列并生成散列?
【解决方案2】:

这里有几件事:

  1. 为了管理密码,您不应该简单地使用 MD5 哈希。但问题不在于算法(MD5,其他用户是对的——很弱),而在于“简单地使用”。你应该做的不仅仅是应用你的哈希函数,不管它是什么。您应该以特定方式应用随机盐,并且应该迭代您的哈希函数。

  2. 确切地说,“随机加盐”将使您的加密基础设施在您每次针对相同输入执行它时创建一个新的不同结果,这似乎让您感到困惑——但不要担心,没关系!您将完全可以使用它来比较密码。

...您可能会问...这是怎么回事,我怎样才能做到正确?我建议您阅读我写的这篇文章:http://www.jasypt.org/howtoencryptuserpasswords.html 解释了所有内容。事实上,我还建议您使用 jasypt 来加密您的密码。这很简单,并且开箱即用地执行所有这些操作。

问候。

【讨论】:

  • 谢谢。该教程非常容易理解。我了解固定盐的使用。但我仍然没有使用随机盐的想法。因为每次它都会生成一个新的哈希。那么,我们如何使用它呢?将生成的随机盐存储在每个记录的附加字段中并在登录期间使用它? IE。使用存储的随机盐(每条记录随机)来消化用户在登录期间提交的密码?正确吗?
  • @VppMan 是的,您应该有一个每个用户的随机盐,在密码存储时生成一次并与哈希一起存储。
猜你喜欢
  • 2011-08-17
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 2012-08-17
  • 2020-08-17
  • 2017-05-24
  • 1970-01-01
相关资源
最近更新 更多