使用md5进行密码加密,希望有特殊字符

时间:2013-08-04 11:37:21

标签: java md5

我正在使用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;
}

3 个答案:

答案 0 :(得分:2)

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

如果您想确保在攻击成功的情况下(这意味着攻击者可以获取您的用户数据),您通常会使用它,攻击者没有所有用户的明文密码(并且黑客例如他们的电子邮件因此信息而烦恼) )。

您无法从md5()中获取特殊字符,也不会改进任何内容。

警告:对于哈希密码,不应再使用MD5,因为它太快而无法计算(more information)。相反,您应该使用bcrypt加盐(example)。

答案 1 :(得分:1)

没有像“md5转换密码”md5生成无法控制的校验和。

答案 2 :(得分:1)

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

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

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

另外需要注意的是:MD5对于密码来说不是一个好的哈希函数,因为它太快了。一个真正快速的哈希函数是一个哈希函数,从生成器中尝试大量密码是一项微不足道的任务。您可能希望查找针对此用例的更多密码。