JSP中用于密码的MD5哈希-每次生成随机哈希

JSP中用于密码的MD5哈希-每次生成随机哈希,jsp,hash,cryptography,Jsp,Hash,Cryptography,为了保护密码,该密码的哈希值存储在数据库中。我使用以下代码生成字符串的哈希值: 但我发现它每次都会为同一个字符串生成随机哈希。因此,我无法使用它进行密码验证 如何使代码仅基于字符串生成哈希值?也就是说,如果我输入“iloveyou”,它每次都应该生成相同的哈希值。不是另一个。您引用的代码不是简单的MD5,而是HMAC-MD5,它包含一个键。代码的第一部分涉及KeyGenerator,每次运行它时都会生成一个随机键。不同的随机键每次都会给出不同的HMAC结果 如果您只需要一个简单的MD5哈希,那么

为了保护密码,该密码的哈希值存储在数据库中。我使用以下代码生成字符串的哈希值:

但我发现它每次都会为同一个字符串生成随机哈希。因此,我无法使用它进行密码验证


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

您引用的代码不是简单的MD5,而是HMAC-MD5,它包含一个键。代码的第一部分涉及
KeyGenerator
,每次运行它时都会生成一个随机键。不同的随机键每次都会给出不同的HMAC结果


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

您引用的代码不是简单的MD5,而是HMAC-MD5,其中包含一个键。代码的第一部分涉及
KeyGenerator
,每次运行它时都会生成一个随机键。不同的随机键每次都会给出不同的HMAC结果

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

这里有几点:

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

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

  • …你可能会问。。。这怎么可能,我怎么才能把它做好?我建议你读一读我写的这篇文章:一切都在这里解释。事实上,我还建议您使用jasypt加密密码。这很简单,可以直接执行所有这些操作

    问候。

    这里有几件事:

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

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

  • …你可能会问。。。这怎么可能,我怎么才能把它做好?我建议你读一读我写的这篇文章:一切都在这里解释。事实上,我还建议您使用jasypt加密密码。这很简单,可以直接执行所有这些操作


    注意。

    一般来说,不要使用MD5(对于任何东西:它被认为是坏的),也不要使用快速散列进行密码散列,而是使用慢速散列。有关详细信息,请参阅。当然,如果你希望每次都是一样的,不要在你的散列中包含(不可复制的)随机数据。谢谢你的链接。我是JSP新手,在JSP中没有内置函数来轻松生成哈希。但是在PHP中,有md5()、shah1()等,所以我正在寻找这些的jsp实现。在jsp中,您可以使用整个Java库,并且可以通过
    Java.util.Digest
    使用哈希函数。尽管您应该考虑是否可以使用PBKDF-2或bcrypt(具有足够高的工作因子)而不是简单的快速散列函数,原因在前面链接的答案中提到。谢谢。我现在试着用固定的盐。但是我不知道如何把一根绳子当作盐来传递。例如:
    a1Rj*EE
    作为盐。参考:这是否有效:
    byte[]bSalt=新字节[8]
    bSalt=base64ToByte(“a1Rj*EE”)?我也可以向该函数传递一个长字符串吗?一般来说,不要使用MD5(对于任何东西:它被认为是坏的),也不要使用快速散列进行密码散列,而是使用慢速散列。有关详细信息,请参阅。当然,如果你希望每次都是一样的,不要在你的散列中包含(不可复制的)随机数据。谢谢你的链接。我是JSP新手,在JSP中没有内置函数来轻松生成哈希。但是在PHP中,有md5()、shah1()等,所以我正在寻找这些的jsp实现。在jsp中,您可以使用整个Java库,并且可以通过
    Java.util.Digest
    使用哈希函数。尽管您应该考虑是否可以使用PBKDF-2或bcrypt(具有足够高的工作因子)而不是简单的快速散列函数,原因在前面链接的答案中提到。谢谢。我现在试着用固定的盐。但是我不知道如何把一根绳子当作盐来传递。例如:
    a1Rj*EE
    作为盐。参考:这是否有效:
    byte[]bSalt=新字节[8]
    bSalt=base64ToByte(“a1Rj*EE”)?我也能给那个函数传递一个长字符串吗?谢谢。我知道散列是不可逆的。这就是为什么我用它作为密码。那么KeyGenerator每次都在创建不同的密钥?如何更改代码,以便我只能使用