web-dev-qa-db-ja.com

異なる結果のMD5ハッシュ

いくつかのチェーンをMD5にエンコードしようとしていますが、次のことに気づきました。

チェーンの場合:「123456çñ」

のようないくつかのウェブ

http://www.md5.net

www.md5.cz

md5generator.net

戻り値: "66f561bb6b68372213dd9768e55e1002"

そして他の人は:

http://www.adamek.biz/md5-generator.php

7thspace.com/webmaster_tools/online_md5_encoder.html

md5.rednoize.com/

戻り値: "9e6c9a1eeb5e00fbf4a2cd6519e0cfcb"

結果を他のシステムに接続する必要があるため、標準のmd5でチェーンをエンコードする必要があります。どのハッシュが正しいですか?

前もって感謝します

17
Encripterrr

私が推測する問題は、さまざまなテキストエンコーディングにあります。表示する文字列はANSIエンコーディングで表すことはできません。UTF-16またはUTF-8が必要です。後者のいずれかを選択すると、文字列のバイト表現が異なり、ハッシュが異なります。

MD5は文字ではなくバイトをハッシュすることを忘れないでください。MD5にバイトを供給する前に、これらの文字をバイトとしてエンコードする方法はあなた次第です。他のシステムと相互運用する場合は、それらのシステムと同じエンコーディングを使用する必要があります。

21
sharptooth

これを理解するためにPythonを使用しましょう。

>>> '123456çñ'
'123456\xc3\xa7\xc3\xb1'
>>> 'ç'
'\xc3\xa7'
>>> 'ñ'
'\xc3\xb1'

上記の出力では、「ç」と「ñ」のUTF-8エンコーディングが示されています。

>>> md5('123456çñ').digest().encode('hex')
'66f561bb6b68372213dd9768e55e1002'

したがって、UTF-8でエンコードされたデータのMD5ハッシュを計算すると、最初の結果が得られます。

>>> u'ç'
u'\xe7'
>>> u'ñ'
u'\xf1'

ここでは、「ç」と「ñ」のUnicodeコードポイントが表示されます。

>>> md5('123456\xe7\xf1').digest().encode('hex')
'9e6c9a1eeb5e00fbf4a2cd6519e0cfcb'

したがって、文字列内の各文字のUnicodeコードポイントで表されるデータのMD5ハッシュ(おそらくISO-8859-1エンコード)を計算すると、2番目の結果が得られます。

したがって、最初のWebサイトはUTF-8でエンコードされたデータのハッシュを計算していますが、2番目のWebサイトは計算していません。

8
Susam Pal

私が試してみると:

echo "123456çñ<br />";
echo "utf-8 : ".md5("123456çñ")."<br />";
echo "ISO-8859-1 : ".md5(iconv("UTF-8", "ISO-8859-1","123456çñ"))."<br />";

結果が得られます:

123456çñ
utf-8 : 66f561bb6b68372213dd9768e55e1002
ISO-8859-1 : 9e6c9a1eeb5e00fbf4a2cd6519e0cfcb

最初のWebサイトは文字列をISO-8859-1でエンコードし、2番目のWebサイトはUTF-8でエンコードします。

4
Enki

これらのサイトのいくつかは、ASCII以外の文字を正しく処理していないと思います。標準のmd5ライブラリを使用している場合は、使用する文字エンコードについて合意している限り、問題はありません。

ちなみに、MD5の使用は推奨されていません。これが暗号化の目的である場合は、実際にSHA2に移行する必要があります。

3
Cameron Skinner