ハッシュは戻せません
暗号化は鍵があれば元の文に戻ります。ハッシュにはその鍵がありません。どれだけ長い入力でも決まった長さの値ひとつに潰す一方通行なので、結果から元を計算する方法はありません。
だからハッシュは「同じかどうか」を確かめるために使います。ダウンロードしたファイルが配布元の公開値と一致するか、保存済みのパスワードといま入力された値が一致するか、という具合です。隠したうえで後から取り出す必要がある値なら、ハッシュではなく暗号化を使ってください。
どのアルゴリズムを選ぶか
- MD5 — 1991年の設計です。同じハッシュになる異なる入力を作るのに、ノートパソコンで数秒しかかかりません。それでも配布元がまだMD5のチェックサムを載せるため、照合用としては残っています。
- SHA-1 — 2017年に実際に衝突する2つのPDFが公開されました。新規に選ぶ理由はありません。
- SHA-256 — 現在の既定です。証明書、署名、ブロックチェーンがここにあります。
- SHA-384・SHA-512 — 64ビット演算を使うため、64ビット機ではSHA-256より速いこともあります。より長い値がほしいときに選びます。
完全性の確認が目的ならSHA-256で十分です。配布元がMD5しか公開していないならその値で照合しつつ、ファイルの入手先が信頼できるかは別に判断してください。
パスワードにはこれだけでは足りません
パスワードをSHA-256で保存するのは平文よりましですが、それでも危険です。ハッシュ関数は速く計算できるように作られているので、攻撃者は毎秒何十億回も試せます。よくあるパスワードはすでに表になっています。
パスワードには bcrypt、scrypt、Argon2 のように、わざと遅くした関数を使ってください。計算コストを調整でき、利用者ごとに異なるソルトを自動で付けます。自作せず、使っている言語の標準的なライブラリに任せます。
同じファイルなのに値が違うとき
このツールは入力をUTF-8のバイト列にしてハッシュします。コマンドライン ツールと値が食い違う場合、原因はたいてい画面に見えない差です。
- 改行コード — Windowsの
\r\nとUnixの\nは別のバイトです。 - 末尾の改行 —
echoは既定で改行を付けます。echo -nかprintfを試してください。 - BOM — 一部のエディタはファイルの先頭に3バイトを付けます。