いくつかのチェーンをMD5にエンコードしようとしていますが、次のことに気づきました。
チェーンの場合:「123456çñ」
のようないくつかのウェブ
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でチェーンをエンコードする必要があります。どのハッシュが正しいですか?
前もって感謝します
私が推測する問題は、さまざまなテキストエンコーディングにあります。表示する文字列はANSIエンコーディングで表すことはできません。UTF-16またはUTF-8が必要です。後者のいずれかを選択すると、文字列のバイト表現が異なり、ハッシュが異なります。
MD5は文字ではなくバイトをハッシュすることを忘れないでください。MD5にバイトを供給する前に、これらの文字をバイトとしてエンコードする方法はあなた次第です。他のシステムと相互運用する場合は、それらのシステムと同じエンコーディングを使用する必要があります。
これを理解するために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サイトは計算していません。
私が試してみると:
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でエンコードします。
これらのサイトのいくつかは、ASCII以外の文字を正しく処理していないと思います。標準のmd5ライブラリを使用している場合は、使用する文字エンコードについて合意している限り、問題はありません。
ちなみに、MD5の使用は推奨されていません。これが暗号化の目的である場合は、実際にSHA2に移行する必要があります。