概要
「ハッシュ化」よく耳にされると思います
私もいろいろエンジニアとして学習してきた中で、何度も目にしてざっくりと理解してきました
ふと、「どういうハッシュ化形式があるのか」や「ハッシュ化を実際にやってみるにはどうすれば良いのか」と思ったのでまとめてみることにしました
本題
ハッシュ化とは
ハッシュ化とは特定の計算手法に基づいて、元のデータを不規則な文字列に置換する処理を指す。代表的な使用方法としては、パスワードをハッシュ化して保存・管理することが挙げられる。第三者が不正にパスワードへアクセスしたとしても、ランダムな文字列に変換されていることで、悪用されるのを防げるためだ。
参考文献: https://eset-info.canon-its.jp/malware_info/special/detail/211013.html
具体的な例を挙げると「password」という文字列をそのままDBなどに保存するのではなく、ハッシュ化を通して不規則な文字列に変換(asdfghjklのような適当なもの)することで変換後の文字列が漏れたとしても元の文字列が直接推測できないというものになります
ハッシュ化形式についてみていく
ここから気になったハッシュ化形式についてコマンドで実演を交えながら調べた内容をまとめていきたいと思います
(実行環境はMacBook Air (M1, 2020)です)
md5
1991年に公開された、入力値に関わらず32文字の16進数(128ビット)のハッシュ値を生成する関数
ファイルの同一性確認などで広く利用されていましたが、現在ではセキュリティ用途での利用は推奨されていません
理由としては異なる二つの入力データから、まったく同じハッシュ値が生成されるという事象が発見されたことによります
(ハッシュ値から元の文字列を割り出すことは事実上不可能と言われておりますが、近年のPCの性能向上などから古い形式のハッシュ化は割と簡単に元の文字列を割り出すことができるそうです)
コマンドではmd5sumというものでハッシュ値が生成できます
# 単純な文字列をハッシュ化する使い方
echo -n "password" | md5sum
# ファイル内容をハッシュ化する使い方
md5sum <対象ファイル>
sha1
sha = Secure Hash Algorithmという略だそうです
1995年に公開された、入力値に関わらず40文字の16進数(160ビット)のハッシュ値を生成する関数
こちらもmd5と同じ理由(異なる値から生成したハッシュ値が一致してしまう)で、現在の利用は非推奨となっています
コマンドではsha1sumというものでハッシュ値が生成できます
# 単純な文字列をハッシュ化する使い方
echo -n "password" | sha1sum
# ファイル内容をハッシュ化する使い方
sha1sum <対象ファイル>
sha256
sha系のいわゆるsha2の一族らしいです
「SHA-224」「SHA-256」「SHA-384」「SHA-512」「SHA-512/224」「SHA-512/256」がsha2族らしいです
基本的にはsha256とsha512を覚えておくと良いそうです(他の形式はこの2つのビット数を切り落としているようです)
入力値に関わらず64文字の16進数(256ビット)のハッシュ値を生成する関数
sha1の時よりもハッシュ値が長いことなどが影響して、より安全性が高いものとなっているようです
コマンドではsha256sumというものでハッシュ値が生成できます
# 単純な文字列をハッシュ化する使い方
echo -n "password" | sha256sum
# ファイル内容をハッシュ化する使い方
sha256sum <対象ファイル>
sha512
sha256系と同じ系統のsha2族の一員です
こちらは入力値に関わらず128文字の16進数(512ビット)のハッシュ値を生成する関数となっています
sha256よりもハッシュ値が長くなっているので安全性が高くなっていることと、さらに計算もケースによってはsha256よりも速くなることがあるそうです
コマンドではsha512sumというものでハッシュ値が生成できます
# 単純な文字列をハッシュ化する使い方
echo -n "password" | sha512sum
# ファイル内容をハッシュ化する使い方
sha512sum <対象ファイル>
sha3
これまで記載してきたmd5やsha1、sha2とは異なるアルゴリズムで作られたハッシュ関数になります
もともとはKeccakというハッシュ関数だったそうです
ハッシュ値はsha2系と同じように複数の長さのパターンがあるそうです
(SHA3-256やSHA3-512などがあります)
また、これまでハッシュ値の長さは決まったものでしたが、ここにきて可変長のハッシュ値が出力できるようにもなっているそうです(SHAKE128やSHAKE256と呼ばれています)
コマンドについてはこれまでと少し異なりopensslを使用します
# sha3-256のパターン
echo "password" | openssl dgst -sha3-256
# sha3-512のパターン
echo "password" | openssl dgst -sha3-512
おわりに
ということでハッシュ化についていろいろ調べてみたことと、実際にハッシュ化する方法についてまとめてみた記事になります
何かの役に立てば幸いです
(アルゴリズムなどがWikipediaに載っていましたが、読んでもあまりわからない領域すぎてまだまだ勉強不足を感じました)