我的目标是获取一个字符串,(在这种情况下是密码)找到它的MD5哈希,并将其转换为base64。这是我尝试自动登录的浏览器进行加密的第一部分。当我测试密码"测试"时,它会很好。但是,在尝试" asdf"时,我会得到不同的哈希值。我知道这是base64转换部分的问题,因为MD5哈希总是正确的。你可以看到"正确"通过查找" asdf"的MD5哈希来输出(912ec803b2ce49e4a541068d495ab570)并将其粘贴到HEX框中here.
以下代码与"测试"的链接密码 - https://ideone.com/SmaNsR
以下代码与" asdf"的链接password- / OOSrmV(只能发布2个链接)
class myClass {
public static void main(String[] args) {
String password = "asdf";
try {
System.out.println(password);
password = (passwordencrypt(password));
System.out.println(password);
} catch (NoSuchAlgorithmException ex) {
System.out.println("oops");
}
password = base16to64(password);
System.out.println(password);
}
public static String passwordencrypt(String password) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
byte[] b = md.digest();
StringBuffer sb = new StringBuffer();
for (byte b1 : b) {
sb.append(Integer.toHexString(b1 & 0xff).toString());
}
return sb.toString();
}
public static String base16to64(String hex){
return Base64.getEncoder().encodeToString(new BigInteger(hex, 16).toByteArray());
}
}
编辑:根据jrtapsell的建议,样本输入和输出。
输入:"测试"
我的计划:CY9rzUYh03PK3k6DJie09g ==
应该是什么:CY9rzUYh03PK3k6DJie09g ==
输入:" asdf" 我的程序:AJEuyDss5J5KVBaNSVq1cA == 应该是什么:kS7IA7LOSeSlQQaNSVq1cA ==
答案 0 :(得分:2)
不要转换为十六进制,然后解码十六进制并编码为base64,简化您的代码 - 直接编码到base64。像,
public static String passwordencrypt(String password)
throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
byte[] b = md.digest();
return base64(b);
}
public static String base64(byte[] bytes) {
return Base64.getEncoder().encodeToString(bytes);
}
然后移除base16to64
中对main
的号召,我就
kS7IA7LOSeSlQQaNSVq1cA==
与您链接的网站上的base64字符串匹配。