0

JAVA を使用して MYSQL MD5 ハッシュを作成する方法に関する素晴らしい投稿がありますが、逆に SQL を使用して Java が行うことを生成することは可能ですか?

SQLで:

Select MD5('secret') = 5ebe2294ecd0e0f08eab7690d2a6ee69

Java では、MD5 アルゴリズムは次の結果をもたらします。 94-6634-108-20-48-32-16-114-85118-112-46-90-18105

まず、Java が 10 進表現であることがわかります。したがって、SQL 出力をペアにして DECIMAL に変換すると、次のようになります。 9419034148236208224240142171118144210166238105

同じ部分はフロント2とラスト4だけです。

SQL を使用して Java が生成するものを生成する方法についてアイデアを持っている人はいますか?

4

1 に答える 1

0

私はこれを完全に解決したわけではありませんが、うまくいけば、これらのヒントが役に立ちます:

Java では、md.digest() 呼び出しの直接の結果を取得すると、バイト配列になります。それを文字列表現に変換する代わりに、バイトを整数として出力するだけです。それらが次のとおりであることがわかります。

94 -66 34 -108 -20 -48 -32 -16 -114 -85 118 -112 -46 -90 -18 105

したがって、結果の文字列変換のダッシュは区切り記号ではなく、算術記号です。Java ハッシュは、バイト値を (符号付き) int として単純に連結したものです。

MD5('secret') を選択すると、32 桁の 16 進数の文字列が得られます。Java で各バイトを 16 進表現に変換して連結すると、MySQL が返すのと同じ文字列が得られることを確認しました。

したがって、MySQL で行う必要があるのは、Hex() の結果を (おそらく SUBSTRING() を使用して) 16 進文字ずつ反復処理し、それぞれを 10 進数に変換し、それらを連結することです。

編集 - ほぼ正しく実行しているように見えますが、16 進数の各ペアを int ではなく Byte に変換する必要があるため、たとえば、「0xbe」は 190 ではなく -66 です。

編集 #2 - MySQL でこれを行うのがいかに比較的難しいかに興味をそそられたので、私は固執しました (冗談のつもりでした)。次のストアド関数が機能しているようです。

drop function if exists java_md5;
delimiter |
create function java_md5(secret VARCHAR(255)) 
  RETURNS VARCHAR(255) 
  DETERMINISTIC 
  BEGIN
    DECLARE result varchar(255);
    DECLARE md5String char(255);
    DECLARE pair char(2);
    DECLARE pairInt int;
    DECLARE idx int;
    set md5String = MD5(secret);

    set result = '';
    set idx = 1;
    WHILE(idx < 32) DO
      set pair = substring(md5String, idx, 2);
      set pairInt = ascii(unhex(pair));
      set pairInt = if(pairInt > 127, pairInt - 256, pairInt);
      set result = concat(result, pairInt);
      set idx = idx + 2;
    END WHILE;
    RETURN result; 
  END|
delimiter ;

select java_md5('secret');
于 2012-09-16T18:08:26.467 に答える