Java 如果解码,两个不同的BASE 64编码字符串是否可以生成相同的字符串?

Java 如果解码,两个不同的BASE 64编码字符串是否可以生成相同的字符串?,java,encryption,base64,md5,Java,Encryption,Base64,Md5,在客户端,我对一个字符串进行MD5加密,然后对生成的哈希进行base64编码 最后的编码字符串用于服务器端的比较 我能够在许多测试用例中成功地完成这项工作,但在下面的一个测试用例中失败了 MD5的字符串 2679:07071960:09348448:3:08912206:3:EXPRESS:1:EU4NW31E7INEC1X 我的MD5哈希字符串: 291423A531148527A9524EA0924CDF68 我的Base64编码字符串: KRQjpTEUhSepUk6gkk

在客户端,我对一个字符串进行MD5加密,然后对生成的哈希进行base64编码

最后的编码字符串用于服务器端的比较

我能够在许多测试用例中成功地完成这项工作,但在下面的一个测试用例中失败了

MD5的字符串

  2679:07071960:09348448:3:08912206:3:EXPRESS:1:EU4NW31E7INEC1X
我的MD5哈希字符串:

  291423A531148527A9524EA0924CDF68
我的Base64编码字符串:

  KRQjpTEUhSepUk6gkkzfaA==
  public static String getHashCode(String text) 
 { 
    MessageDigest md;
    byte[] md5hash = new byte[32];
    try{
    md = MessageDigest.getInstance("MD5");

    md.update(text.getBytes("iso-8859-1"), 0, text.length());
    md5hash = md.digest();
    }
    catch(Exception e)
    {
        return "-1";
        }
    String encoded = Base64.encode(md5hash);
    String retValue = new String(encoded);


    return retValue;

   } 
当我尝试将用于BASE64编码的MD5哈希字符串放在上面时,它会生成以下字符串:

  MjkxNDIzQTUzMTE0ODUyN0E5NTI0RUEwOTI0Q0RGNjg=
但是,当我尝试解码我的Base64字符串时,即“KRQjpTEUhSepUk6gkkzfaA==”,这里我得到了我的哈希代码(打开了在hex编辑器中生成的.bin文件)

那么,一个字符串可能有多个Base64编码值吗

我使用以下代码生成编码字符串:

  KRQjpTEUhSepUk6gkkzfaA==
  public static String getHashCode(String text) 
 { 
    MessageDigest md;
    byte[] md5hash = new byte[32];
    try{
    md = MessageDigest.getInstance("MD5");

    md.update(text.getBytes("iso-8859-1"), 0, text.length());
    md5hash = md.digest();
    }
    catch(Exception e)
    {
        return "-1";
        }
    String encoded = Base64.encode(md5hash);
    String retValue = new String(encoded);


    return retValue;

   } 

请建议出了什么问题,以及如何确保我们在客户端和服务器端使用相同的摘要。

您有MD5哈希291423A531148527A9524EA0924CDF68,它生成Base64编码字符串MjkxNDIzQTUzMTE0ODUyN0E5NTI0RUEwOTI0Q0RGNjg=,这很好。您已将MD5哈希转换为ascii十六进制表示,并对其进行base64编码


然而,您自己的getHashCode()的工作方式不同,它创建了哈希代码二进制表示形式的base64编码,您还没有将哈希转换为ascii十六进制表示形式,这就是为什么您会看到不同的base64编码字符串。

接受的答案解决了问题,但没有回答问题

例如,这些base64值
qznwq==
qznwr==
编码相同的二进制值(十六进制)
433356c2

您可以在或使用命令进行检查

echo <<BASE64>> | base64 -d | xxd
echo | base64-d | xxd
总之

  • 两个不同的基64编码相同的值-->true
  • 两个不同的值生成相同的base64值-->false(请参阅)

理论上,可以有两个字符串提供相同的MD5,但Base64是一种对称无丢失编码。但是Base64也有一些变体(请参阅)。较短的是原始字节,而较长的是文本。我认为不可能将两个不同的Base64(忽略转义)解码为同一个字符串。