はじめに
習うより慣れろ派のCCENTぎりぎり芸人です。
今回はハッシュ化についてです。本記事はコマンドライン上の具体例、特徴の解説、実用例解説という流れでまとめました。
元来、ハッシュはHDDのある程度大きなサイズのファイルを検索したり破損していないかを手っ取り早くチェックするために考案されました。
インターネットの発達に伴い、パスワードの秘匿化やダウンロードファイルのサムチェックに使われるようになった歴史があります。
コマンドライン上の具体例
実際に’test’や’tesu’などの文字列をハッシュ化してみました。ご自身のPCでも試してみてください。同じ値が出力されるはずです。
1 2 3 4 5 6 7 8 9 10 11 12 |
#sha256sum Usage $ echo -n '(文字列)' | sha256sum #具体例 $ echo -n 'test' | sha256sum 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 - $ echo -n 'tesu' | sha256sum 77967e7c195165fa187b69a0d4dff8e9aafef9c1dde74c6090042adcad24c65c - $ echo -n 'tost' | sha256sum 62f76318fa881863de3dfbc33373b2ded2a87e0621a82a410ebb40ed4072e51f - |
Linuxには標準でmd5やSHA256sum等、ハッシュ化コマンドがあります。痒い所に手が届く感が好きです。便利です。
特徴の解説
1.固定長である
どんなサイズのデータを入力しても、出力されるハッシュ値の文字数は変わりません。これにより元データの大まかなサイズさえもわからなくなります。
本当に’a’という一文字でもシェイクスピア全話でも同じ長さにします。
他方、この固定長がために後述のハッシュ値の衝突が起きてしまいます。
SHA1sumは160ビットのハッシュ値、SHA256sumは256ビットのハッシュ値を出力します。
2.復元不可能
数学では一方向性関数と言います。出力された値から、元のデータはわかりません。これを実現するためには剰余式を使った数式を設計します。
3.ハッシュ値の衝突の可能性がある
まったく異なるデータをハッシュ化した時に、そのハッシュ値がかぶる(衝突)ことがあります。
「鳩ノ巣の原理」というもので簡単に説明できます。鳩が5匹、巣が4つで鳩は全匹がどこかの巣に収まっている場合、どこかの巣に必ず2匹以上いることになりますよね。
ただし、具体例で示したように一文字ずれただけでもハッシュ値は大幅に値が変わるように設計されています。しかし何らかのデータのハッシュ値と、かぶるハッシュ値を持つデータがこの世に存在しうることは確かです。
実用例
実際に使用する場面を説明します。
・SNSなどのIDパスワード認証
運営側は、会員登録の段階でパスワードをハッシュ化してDBに保存します。ログインがあった場合は入力された文字列をハッシュ化して比較します。正しい入力であれば同じハッシュ値なはずですし、誤っていれば異なるハッシュ値です。
パスフレーズをハッシュ化して保存することで、万一漏洩した場合でも内容を知ることはできません。
パスワードは自由な文字数で設定しますが、ハッシュ値は固定長なのでログイン処理の簡単化・高速化が期待できます。
めちゃくちゃわかりやすい解説ですね!