如果解码,两个不同的BASE 64编码字符串可以产生相同的字符串吗?

nit*_*eek 5 java encryption base64 md5

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

然后将该最终编码的字符串用于服务器端的比较.

我能够成功地为许多测试用例做到这一点但是对于下面的测试用例失败了.

MD5的字符串

  2679:07071960:09348448:3:08912206:3:EXPRESS:1:EU4NW31E7INEC1X
Run Code Online (Sandbox Code Playgroud)

我的MD5哈希字符串:

  291423A531148527A9524EA0924CDF68
Run Code Online (Sandbox Code Playgroud)

我的Base64编码字符串:

  KRQjpTEUhSepUk6gkkzfaA==
Run Code Online (Sandbox Code Playgroud)

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

  MjkxNDIzQTUzMTE0ODUyN0E5NTI0RUEwOTI0Q0RGNjg=
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试解码我​​的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;

   } 
Run Code Online (Sandbox Code Playgroud)

请注意,建议出现问题以及如何确保在客户端和服务器端使用相同的摘要.

nos*_*nos 6

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

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


ped*_*ofb 6

接受的答案可以解决问题,但不回答问题。

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

您可以在http://kjur.github.io/jsjws/tool_b64udec.html或使用以下命令进行检查

echo <<BASE64>> | base64 -d | xxd
Run Code Online (Sandbox Code Playgroud)

综上所述

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