6

クライアント側では、文字列の 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 を開きました)ファイルは 16 進エディタで生成されます)。

では、1 つの文字列に 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;

   } 

何が問題なのか、クライアント側とサーバー側の両方で同じダイジェストを使用するようにする方法を教えてください。

4

2 に答える 2

13

受け入れられた回答は問題を解決しますが、質問には回答しません。

たとえば、これらの base64 値は、同じバイナリ値 (16 進数)QzNWwq==をエンコードします。QzNWwr==433356c2

http://kjur.github.io/jsjws/tool_b64udec.htmlまたはコマンドを使用して確認できます

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

要約すれば

  • 2 つの異なる Base 64 エンコードが同じ値 --> true
  • 2 つの異なる値が同じ base64 値を生成します --> false (これを参照)
于 2016-07-21T19:44:24.107 に答える