読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

ハッシュ関数

セキュリティ
ネットでたまに見るMD5とかのお話 ハッシュ関数とは暗号化のようなものです。その特徴として ①逆変換されないこと ②変換が一意であること があります。 ②を説明すると、文字列なりファイルなりをハッシュ化した際、元のファイルが同一なら、変換後のハッシュ値も必ず同じものが生成される、ということです。 ハッシュ関数が使われる場面 ・パスワードの管理(オーナー側がユーザのパスワードを悪用しないため) ・ファイルの真偽を確かめる などがあります。特に後者は一般ユーザにも馴染み深いものです。よく「ファイルが動かない、解凍できない」などと言うときに、まずファイルその物が同じファイルか、壊れていないか、などをチェックするのに使用します。ちゃんと「ファイルが動く、解凍できる」ユーザのハッシュ値と一致するかどうかを見て、ファイルの問題か、ユーザ側の問題かに切り分けられます。 ハッシュ関数の種類 流れを言うと MD4→MD5→SHA-0→SHA-1→SHA-2 となります。右に行くほど強固です。 一番普及しているのはMD5ですが、MD5脆弱性が発見されたため、政府などの機密性が重要な機関ではもう廃止されています。現在はMD5に代わりSHA(Secure Hash Algorithm)が採用されています。初期にSHA-0ができ、SHA-1、SHA-2と後継が出ていますが、SHA-0もSHA-1も既に脆弱性が見つかっています。なのでSHA-2が最も強固となります。 SHA-2は出力やデザインの違いでSHA-224、SHA-256、SHA-384、SHA-512などがありますが、まとめてSHA2とされています。 MD5ハッシュ値を算出する(ターミナル) ①文字列「hoge」をハッシュ値に変換 $ echo -n "hoge" | md5sum ea703e7aa1efda0064eaa507d9e8ab7e 前述の「逆変換ができない」というのはハッシュ値「ea703e7aa1efda0064eaa507d9e8ab7e」から「hoge」を算出できない、という意味です。ただMD5の場合すでに多くの辞書ファイルがあり、単純な文字列であればそれに照らし合わせることで逆変換が可能となっています。 逆変換サイト…MD5変換(MD5),MD5逆変換(MD5Reverse) $ md5sum [Enter] hoge [Ctrl + Dを二回] ↓ hogeea703e7aa1efda0064eaa507d9e8ab7e 後入力の場合、Ctrl + Dで「入力完了」とみなされます。改行後であれば一度で済みますが、改行なしだと2回Ctrl + Dが必要です。また、改行が入らないため「hoge」の後ろに直接生成されます。 ネット上の解説で見ると「改行してから~」とあるサイトもありますが、その場合改行記号を含んでいるので、文字列単体とは異なる結果が返ってきます。「echo -n」は改行を含まない、の意味になります。 ②ファイルのチェックサムの確認 ネットで確認される方のものです。 $ md5sum hoge.zip c0ebc13e3820a74a6459c35f0e8e54f6 同一ファイルでない限り、異なるハッシュ値が算出されます。中身を書き換えて実行すると、確かに別の値が出ました。 補足ですが、md5sumの代わりにopenssl md5でも同じ結果となります。 ◆SHA2ハッシュ値を算出する(ターミナル) 同じです。コマンドが違うだけ。 ①文字列「hoge」をハッシュ値に変換 $ echo -n "hoge" | sha256sum ecb666d778725ec97307044d642bf4d160aabb76f56c0069c71ea25b1e926825 $ sha256sum [Enter] hoge [Ctrl + Dを二回] ↓ hogeecb666d778725ec97307044d642bf4d160aabb76f56c0069c71ea25b1e926825 ②ファイルのチェックサムの確認 $ sha256sum hoge.zip 59e1f71cdfb7dd150e3df32a56b95c2e39c4660067237651255752b954586c13 PHPで算出MD5 <?php $str = "hoge"; $hash = md5($str); echo $hash ?> ページを開くと先ほどターミナルで算出された「ea703e7aa1efda0064eaa507d9e8ab7e」が表示されます。 ②SHA2 mhashというモジュールが有効になっている必要があります。 <?php phpinfo(); ?> で確認してください。多分aptでPHPをインストールしていればデフォルトで有効になっていると思います。 使い方は <?php $str = "hoge"; $hash = mhash(MHASH_SHA256, $str); echo bin2hex($hash); ?> 同じくページを開くと「ecb666d778725ec97307044d642bf4d160aabb76f56c0069c71ea25b1e926825」が表示されます。 以上です。 ソース: MD5 checksumとhashを算出する方法 ハッシュ関数で暗号化