【问题标题】:Can two different BASE 64 encoded strings result into same string if decoded?如果解码,两个不同的 BASE 64 编码字符串可以生成相同的字符串吗?
【发布时间】:2012-11-07 03:02:22
【问题描述】:

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

这个最终的编码字符串然后用于服务器端的比较。

我能够在许多测试用例中成功执行此操作,但在以下测试用例中失败了。

MD5 字符串

  2679:07071960:09348448:3:08912206:3:EXPRESS:1:EU4NW31E7INEC1X

我的 MD5 哈希字符串:

  291423A531148527A9524EA0924CDF68

我的 Base64 编码字符串:

  KRQjpTEUhSepUk6gkkzfaA==

当我尝试将用于 BASE64 编码的 MD5 哈希字符串放在 http://www.opinionatedgeek.com/dotnet/tools/base64encode/ 上时,它会生成以下字符串:

  MjkxNDIzQTUzMTE0ODUyN0E5NTI0RUEwOTI0Q0RGNjg=

但是,当我尝试解码我​​的 Base64 字符串时,即“KRQjpTEUhSepUk6gkkzfaA==”,这里是http://www.opinionatedgeek.com/dotnet/tools/Base64Decode/Default.aspx,我正在获取我的哈希码(在十六进制编辑器中打开正在生成的 .bin 文件)。

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

我正在使用下面的代码来生成编码字符串:

  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,但 Base64 是一种对称的无损编码。但也有 Base64 的变体(参见wikipedia)。
  • 较短的是原始字节,较长的是文本。我认为不可能将 2 个不同的 Base64(忽略转义)解码为同一个字符串。

标签: java encryption base64 md5


【解决方案1】:

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

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

您可以在http://kjur.github.io/jsjws/tool_b64udec.html或使用命令查看它

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

总结

  • 两个不同的 base 64 编码相同的值 --> true
  • 两个不同的值生成相同的 base64 值 --> false(见this

【讨论】:

    【解决方案2】:

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

    但是您自己的 getHashCode() 工作方式不同,它会创建哈希码的 二进制 表示的 base64 编码,您尚未将哈希转换为 ascii 十六进制表示,这就是您看到的原因不同的 base64 编码字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      • 2018-05-27
      相关资源
      最近更新 更多