Base64转换导致Java Base64库的结果不正确

Base64转换导致Java Base64库的结果不正确,java,base64,Java,Base64,我的目标是获取一个字符串(在本例中是一个密码),找到它的MD5哈希,并将其转换为base64。这是加密的第一部分,由我正在尝试自动登录的浏览器进行加密。当我测试密码“test”时,它会正常通过。然而,当尝试“asdf”时,我得到了不同的散列值。我知道这是base64转换部分的问题,因为MD5哈希总是正确的。通过查找“asdf”(912ec803b2ce49e4a541068d495ab570)的MD5散列并将其粘贴到十六进制框中,可以看到“正确”的输出 下面带有“测试”密码的代码链接- 下面代码

我的目标是获取一个字符串(在本例中是一个密码),找到它的MD5哈希,并将其转换为base64。这是加密的第一部分,由我正在尝试自动登录的浏览器进行加密。当我测试密码“test”时,它会正常通过。然而,当尝试“asdf”时,我得到了不同的散列值。我知道这是base64转换部分的问题,因为MD5哈希总是正确的。通过查找“asdf”(912ec803b2ce49e4a541068d495ab570)的MD5散列并将其粘贴到十六进制框中,可以看到“正确”的输出

下面带有“测试”密码的代码链接-
下面代码的链接,带有“asdf”密码-/OOSrmV(只能发布2个链接)

编辑:根据jrtapsell的建议,输入和输出样本

输入:“测试”
我的程序:CY9rzUYh03PK3k6DJie09g==
应该是什么:CY9rzUYh03PK3k6DJie09g==

输入:“asdf” 我的课程:Ajeuydss5J5KVANSVQ1CA==
应该是什么:kS7IA7LOSeSlQQaNSVq1cA=

不要转换为十六进制,然后解码十六进制并编码到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);
}
然后在
main
中删除对
base16to64
的调用,我得到

kS7IA7LOSeSlQQaNSVq1cA==

与链接网站上的base64字符串相匹配。

不要先转换为十六进制,然后解码十六进制并编码为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);
}
然后在
main
中删除对
base16to64
的调用,我得到

kS7IA7LOSeSlQQaNSVq1cA==

与链接网站上的base64字符串相匹配。

您能否将您预期的输入和输出添加到问题中,以便更容易地与之进行比较?为什么要将十六进制编码改为base64编码?@ElliottFrisch MD5已经是base64编码的,所以我想对其进行解码,并将其编码为base64。如果你问我为什么要这么做,那是因为我正在尝试构建一个可以自动登录的应用程序,而这就是该站点传输凭据的方式。我正在尝试的过程是hex_md5>Base64md5。您是否可以将您预期的输入和输出添加到问题中,以便更容易地与之进行比较?为什么要将hex编码到base64编码?ElliottFrisch md5已经进行base64编码,所以我想对其进行解码,并在base64中对其进行编码。如果你问我为什么要这么做,那是因为我正在尝试构建一个可以自动登录的应用程序,而这就是该站点传输凭据的方式。我正在尝试的过程是hex_md5>base64_md5Wow。这要简单得多。标记为已解决。而且,你也不知道为什么会这样,对吧?现在我有了一个简单得多的方法,这其实并不重要,但我仍然很好奇。@SampathEaty要么你的十六进制编码器关闭了,要么你的十六进制解码器关闭了。但是你并不真的需要任何一个,所以我不会再花更多的时间在上面了。@SampathEaty可能是以下几点的组合:1
password.getBytes()
依赖于系统的默认字符集,这在所有操作系统中都不相同。2.
Integer.toHexString
返回长度为1的字符串,表示字节值为0–15。3.
BigInteger.toByteArray
忽略前导零字节;例如,
new biginger(“00001234”,16).toByteArray()
将返回两个字节,而不是四个。哇。这要简单得多。标记为已解决。而且,你也不知道为什么会这样,对吧?现在我有了一个简单得多的方法,这其实并不重要,但我仍然很好奇。@SampathEaty要么你的十六进制编码器关闭了,要么你的十六进制解码器关闭了。但是你并不真的需要任何一个,所以我不会再花更多的时间在上面了。@SampathEaty可能是以下几点的组合:1
password.getBytes()
依赖于系统的默认字符集,这在所有操作系统中都不相同。2.
Integer.toHexString
返回长度为1的字符串,表示字节值为0–15。3.
BigInteger.toByteArray
忽略前导零字节;例如,
new biginger(“00001234”,16).toByteArray()
将返回两个字节,而不是四个字节。