32文字の文字列(MD5ハッシュ)があり、Base64を使用してエンコードした場合、エンコードされた文字列の最大長はどれくらいですか?
3 に答える
MD5値は、Base64表記では常に22(有用)文字の長さです。多くのBase64アルゴリズムでは、MD5ハッシュをエンコードするときに2文字のパディングも追加され、合計で24文字になります。パディングは有用な情報を追加しないため、破棄できます。最初の22文字だけが重要です。
理由は次のとおりです。
MD5ハッシュは128ビット値です。Base64文字列のすべての文字には6ビットの情報が含まれます。これは、文字に64の可能な値があり、64に到達するには2の6乗が必要だからです。すべての文字に6ビットの情報がある場合、21文字には126ビットの情報があります。 22文字には132ビットの情報が含まれています。128ビットは21文字以内には収まりませんが、22文字以内には収まるため(少し余裕があります)、Base64では128ビット値は常に22文字として表されます。
パディングに関する注意:
前述のように、多くのBase64エンコードアルゴリズムでは、MD5値をエンコードするときに2文字のパディングが追加されます。これは、Base64が3バイトの情報を4文字で表すためです。MD5には16バイトの情報があるため、多くのBase64エンコーディングアルゴリズムは「==」を追加して、16バイトの入力が次の3の倍数(18バイト)より2バイト短いことを示します。これらの2つの等号は、文字列に情報をまったく追加せず、保存時に破棄できます。
http://en.wikipedia.org/wiki/Base64による
"nバイトの入力が与えられると、出力は(n + 2-((n + 2)%3))/ 3 * 4バイトの長さになり、大きいnの場合はn*4/3または1.33333nに収束することに注意してください。 。」
したがって、((32 + 2-(32 + 2)%3))/ 3 * 4 = 34-(34%3)/ 3 * 4 =(34-1)/ 3 * 4=33/3になります* 4=44文字。
いつでも生のバイナリ形式(128ビット)で抽出し、base 64に直接エンコードできます。つまり、base64でエンコードすると24バイトになる32ではなく16バイトに変換されます。
MD5 128ビットは、Base64では22文字として表されます。この場合、2つのパディング文字'='もあります。
どのように?
$ md5sum ./README.md
c6b5f48774aa0a87a82a276ff86be507 ./README.md
$ md5sum ./README.md | base64
YzZiNWY0ODc3NGFhMGE4N2E4MmEyNzZmZjg2YmU1MDcgIC4vUkVBRE1FLm1kCg==
この場合、Base64でエンコードされた文字列はMD5ハッシュ長より短くありません
エンコードされるのはMD5ハッシュのストレージ形式だからです。MD5ハッシュ値自体ではありません。
MD5ハッシュの1桁を格納するために使用されるビット数に注意する必要があります。
正しい方法:
ハッシュ値を変換して、16進数を2進数に変換します。
2バイナリをbase64でコード化されたstingに変換します
$ cat ./README.md | openssl dgst -md5
c6b5f48774aa0a87a82a276ff86be507
$ cat ./README.md | openssl dgst -md5 -binary | openssl enc -base64
xrX0h3SqCoeoKidv+GvlBw==
また
$ md5sum ./LICENSE
e3fc50a88d0a364313df4b21ef20c29e ./LICENSE
$ cat ./LICENSE | openssl dgst -md5 -binary | openssl enc -base64
4/xQqI0KNkMT30sh7yDCng==
$ (echo 0:; echo e3fc50a88d0a364313df4b21ef20c29e) | xxd -rp -l 16|base64
4/xQqI0KNkMT30sh7yDCng==