-1

我在 Md5 中转换我的密码,它工作正常并给我 md5 转换后的密码,但我也想在我的 md5 密码中包含特殊字符。

我怎样才能做到这一点

public String createMd5(String password){
    String salt = "Random$SaltValue#WithSpecialCharacters12@$@4&#%^$*";
    String hash = md5(password + salt);
    return hash;
}

public static String md5(String input) {
    String md5 = null;
    if(null == input) return null;
    try {
        MessageDigest digest = MessageDigest.getInstance("MD5");
        digest.update(input.getBytes(), 0, input.length());
        md5 = new BigInteger(1, digest.digest()).toString(32);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return md5;
}
4

3 回答 3

2

md5()是从任何字符串映射到 {0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}^32 的哈希函数。

当您想确保在成功攻击的情况下(这意味着攻击者可以获取您的用户数据)攻击者不拥有所有用户的明文密码(并破解例如他们的电子邮件帐户与此信息)时,您通常会使用它。

您无法从 md5() 中获取特殊字符,并且它不会改善任何东西。

警告:MD5 不应再用于散列密码,因为计算速度太快(更多信息)。相反,您应该将bcrypt与盐一起使用(示例)。

于 2013-08-04T11:51:10.987 回答
1

没有像“md5 转换密码”这样的东西,md5 会生成您无法控制的校验和。

于 2013-08-04T11:43:34.573 回答
1

我认为这个问题源于对密码哈希的误解。散列密码的工作方式如下:

  • 哈希函数是确定性的,也就是说,对于相同的输入,您总是得到相同的输出。
  • 一个好的散列函数是单向的,也就是说,你不能不费吹灰之力就从散列值到输入。
  • 所以拿一个密码+盐(盐使创建一个详尽的字典变得更加困难)
  • 将其输入散列函数以生成散列。
  • 存储哈希和盐。
  • 要检查密码散列用户输入和存储的盐,并与存储的散列进行比较。

这在字节级别上运行,因此输入中显然包含特殊字符。为方便起见,哈希函数的输出以十六进制表示,不包含特殊字符。如果您确实想要原始输出,只需将十六进制表示解析为字节,但我不明白您为什么要这样做,它仍然是相同数量的输出位以不同的方式表示。

另一件需要注意的事情:MD5 不是一个很好的密码散列函数,因为它太快了。真正快速的散列函数是一个散列函数,其中从生成器尝试大量密码是一项微不足道的任务。您可能想为这个用例寻找更多特定的密码。

于 2013-08-04T13:31:50.887 回答