データの指紋
ハッシュ関数は、どんな入力(1語、1つの文書、4 GBの動画)でも、決まった長さの短い文字列に変えます。これをハッシュ、ダイジェスト、チェックサムと呼びます。同じ入力からはいつも同じハッシュができ、ほんの少しでも変えるとまったく違うハッシュになります。
| 入力 | SHA-256ハッシュ |
hello | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 |
Hello | 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969 |
hello! | ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b |
大文字1つや感嘆符1つで、結果の文字がすべて変わります。ハッシュ生成で試してみてください。
よいハッシュ関数の条件
- 決定的: 同じ入力なら、どのコンピューターでも同じハッシュになります。
- 一方向: ハッシュから入力に戻ることはできません。
- 衝突しにくい: 同じハッシュになる2つの異なる入力を見つけることが、事実上不可能であるべきです。
- 計算が速い: チェックサムには便利ですが、それが速いハッシュをパスワードに使ってはいけない理由でもあります(後述)。
ハッシュは暗号化ではない
暗号化は双方向で、鍵があれば元に戻せます。ハッシュには鍵がなく、元に戻せません。わかるのは一致するかどうかだけです。Base64はさらに別物で、誰でもデコードできる単なるエンコードです。
よく使われるアルゴリズム
| アルゴリズム | 長さ | 状況 |
| MD5 | 128ビット(16進数32文字) | 2004年から破られている。偶然の破損の確認にだけ |
| SHA-1 | 160ビット(16進数40文字) | 破られている。2017年に最初の実際の衝突が公開 |
| SHA-256 | 256ビット(16進数64文字) | 安全。現在の標準 |
| SHA-512 | 512ビット(16進数128文字) | 安全。64ビットのコンピューターではSHA-256より速いことが多い |
それぞれでhelloをハッシュにすると:
- MD5:
5d41402abc4b2a76b9719d911017c592 - SHA-1:
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d - SHA-256:
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
MD5とSHA-1が「破られている」とは
MD5とSHA-1では、研究者が同じハッシュになる2つの異なるファイルを意図的に作れます。攻撃者は無害なファイルを、チェックサムが一致する有害なファイルにすり替えたり、署名された文書を偽造したりできるわけです。どちらも元に戻すことはできず、偶然の破損ならハッシュは変わるので、MD5のチェックサムでもダウンロードの失敗は見つけられます。ただ、誰もファイルを改ざんしていないことの証明にはなりません。
SHA-256とSHA-512は2001年に公開されたSHA-2ファミリーの一員で、実用的な攻撃は知られていません。2015年に標準化されたSHA-3は別の設計で、予備として用意されています。
ハッシュの使い道
- ダウンロードの確認: 開発元がファイルのSHA-256を公開し、手元のものと一致すれば同一のファイルです。チェックサムを確認する方法をご覧ください。
- 電子署名とHTTPSの証明書: 文書や証明書のハッシュを取り、そのハッシュに署名します。
- Git: コミットやファイルはハッシュで識別されます。Gitは長くSHA-1を使ってきましたが、今はSHA-256にも対応しています。
- ビットコインなどのブロックチェーン: ブロックはSHA-256でつながっています。
- 重複ファイルの発見: SHA-256が同じ2つのファイルは同じファイルです。
ハッシュとパスワード
サイトはパスワードそのものではなく、そのハッシュだけを保存すべきです。ログイン時には入力されたものをハッシュにして比べます。ただしSHA-256はこの用途には向きません。速すぎて、漏えいしたデータベースを持つ攻撃者が毎秒何十億回も推測できてしまうからです。パスワードには、bcrypt、scrypt、Argon2のような、そのために作られたソルト付きの遅いハッシュが必要です。ソルトとは、ハッシュにする前に各パスワードに加えるランダムな値で、同じパスワードの2人でもハッシュが違うものになります。
試してみる
ハッシュ生成なら、テキストやファイルのMD5、SHA-1、SHA-256、SHA-384、SHA-512をブラウザの中で一度に計算し、公開されているチェックサムと照合できます。