我正在使用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;
}
答案 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对于密码来说不是一个好的哈希函数,因为它太快了。一个真正快速的哈希函数是一个哈希函数,从生成器中尝试大量密码是一项微不足道的任务。您可能希望查找针对此用例的更多密码。