ハッシュとは何か、何ではないか
ハッシュ関数は、一語の文字列から数GBのファイルまで、どんな長さの入力でも固定長の値(ハッシュ値、ダイジェスト)に変換します。 暗号学的ハッシュ関数には三つの性質が求められます。同じ入力なら常に同じ出力になること、出力から入力を逆算するのが現実的に不可能なこと(原像計算困難性)、 同じ出力になる異なる二つの入力を見つけるのが現実的に不可能なこと(衝突困難性)です。入力が一文字変わっただけで出力が大きく変わる性質は 「雪崩効果」と呼ばれます。このツールでSHA-256を計算すると、helloとHelloは256ビットのうち約125ビットが異なり、 良い関数に期待される「半分前後」に近い値になります(実際に計算した値です)。
ハッシュは暗号化ではありません。暗号化は鍵があれば元に戻せますが、ハッシュには元に戻す道そのものがありません。 「ハッシュを復号する」という言い方は正確ではなく、そう称するサイトは、よくある文字列をあらかじめ計算した巨大な表から値を探しているだけです。
アルゴリズムの選び方と安全性
出力長はビット数で表され、16進で書くと桁数はビット÷4になります(下の表はこの式で計算)。同じテキストを入力して、桁数がこの通りに違うことを確認できます。
| アルゴリズム | 出力ビット | 16進の桁数 | 発表年 | このツール | 状態 |
|---|---|---|---|---|---|
| MD5 | 128 | 32 | 1992 | 非対応 | 実用的な衝突攻撃が存在。セキュリティ用途には不可(単なるチェックサムなら可) |
| SHA-1 | 160 | 40 | 1995 | 対応 | 2017年に実際の衝突(SHAttered)が公開。セキュリティ用途には不可 |
| SHA-256 | 256 | 64 | 2001 | 対応 | 広く使われる標準。実用的な攻撃は知られていない |
| SHA-384 | 384 | 96 | 2001 | 対応 | SHA-512の短縮型。実用的な攻撃は知られていない |
| SHA-512 | 512 | 128 | 2001 | 対応 | 64ビットCPUではSHA-256より速いことが多い。実用的な攻撃は知られていない |
MD5とSHA-1: チェックサムには使えるが、安全性の用途には不可
MD5は2004年に衝突の作り方が発表されて以降、攻撃が改良され、いまでは一般的なパソコンで短時間のうちに同じMD5を持つ異なるファイルを作れます。 2012年には、この弱点がマルウェア「Flame」で証明書の偽造に使われたと報告されています。SHA-1も2017年にGoogleとCWIの研究者が 実際の衝突(SHAttered)を公開し、米NISTはSHA-1を段階的に廃止して2030年までにSHA-2・SHA-3へ移行する方針を示しています。 電子署名、証明書、配布ソフトウェアの改ざん防止のように、攻撃者が介在しうる用途には使ってはいけません。一方、 転送中の破損の確認、キャッシュキー、重複ファイルの検出のような攻撃者がいない用途では今も広く使われています。 バージョン管理のGitはオブジェクト名にSHA-1を使っていますが、署名用途ではなく、既知の衝突攻撃への対策も入っており、SHA-256への移行も進行中です。 新しく設計するなら、どちらも選ばないでください。
SHA-2ファミリー
SHA-256、SHA-384、SHA-512はSHA-2ファミリーで、米国NSAが設計し、2001年にNISTが標準化しました。証明書、コード署名、パッケージ管理、ブロックチェーンなど 幅広く使われ、実用的な衝突攻撃は知られていません。SHA-384はSHA-512の初期値を変えて出力を切り詰めたものです。 たいていの用途ではSHA-256で足り、64ビット環境での速度や安全余裕を重視するならSHA-512を選びます。2015年に標準化されたSHA-3は内部構造がまったく異なる後継ですが、 このページが使うWeb Crypto APIはSHA-3もMD5も提供していないため、このツールでは扱えません。
鍵つきの認証にはHMAC
秘密鍵を持つ相手が作ったメッセージだと確かめたいときに、鍵とメッセージをつなげてハッシュするだけの方法を使ってはいけません。 SHA-1、SHA-256、SHA-512はこの構成だと「長さ拡張攻撃」を受ける設計で、鍵を知らなくても、メッセージに追加データを付けたもののハッシュを計算できてしまいます。 この用途にはHMACを使ってください。このツールは鍵なしの通常のハッシュのみを計算します。
パスワード保存に通常のハッシュを使ってはいけない
「パスワードはハッシュで保存する」は半分だけ正しい助言です。平文で保存するよりは良いものの、SHA-256のような汎用ハッシュ単体はパスワード保存に不向きで、 このツールでその仕組みを作ってはいけません。理由は三つあります。
- 速すぎる。汎用ハッシュは速さを重視して設計されています。グラフィックスカード1枚で毎秒数十億回計算でき、流出したデータベースに対して、よくあるパスワードを総当たりする攻撃があっという間に終わります。
- 同じパスワードは同じハッシュになる。ユーザーごとに異なるランダムな「ソルト」がないと、事前計算した表で一括して破られ、同じハッシュのユーザーは同じパスワードだと分かってしまいます。
- 人が決めるパスワードは候補が少ない。ハッシュが安全でも、
password1のようなありふれた文字列は辞書攻撃ですぐ見つかります。
正しい方法は、パスワード用にわざと遅く、コストを調整できるように作られたArgon2id、scrypt、bcrypt、PBKDF2を使うことです。これらはソルトを内蔵または要求します。 どの関数をどのパラメータで使うかは、OWASPのPassword Storage Cheat Sheetなどの最新の推奨を確認してください。自分用の強いパスワードが欲しいだけなら、ハッシュではなく生成ツールを使いましょう。
実用的な使い方
ダウンロードしたファイルが改ざんされていないか確認する
配布元がファイルとあわせてSHA-256の値を公開している場合は、自分でファイルのハッシュを計算して文字列を比べます。このツールが扱うのはテキストのみでファイルは読み込めません。 ファイルにはOSの標準コマンドを使います。Windowsならcertutil -hashfile ファイル名 SHA256、macOSや多くのLinuxではshasum -a 256 ファイル名(Linuxならsha256sum ファイル名)です。チェックサムがダウンロードしたのと同じページに載っていた場合、 ファイルを書き換えた攻撃者が値も書き換えている可能性があるため、公式サイトのHTTPSや署名つきのリリースノートなど別経路で確認するのが安全です。
変更や重複の検出
大きなデータを丸ごと比べる代わりに短いハッシュ同士を比べれば速く済みます。設定ファイルが変わったかの確認、重複コンテンツの検出、キャッシュキーの生成に使われ、 こうした用途ならSHA-256で十分です。
検算した例と、よくある落とし穴
例1。テキストabcのSHA-1はa9993e364706816aba3e25717850c26c9cd0d89d、SHA-256はba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015adです。各アルゴリズムの標準的なテストベクトルと一致するので、abcはどのハッシュツールが正しく動いているかの確認に使えます。
例2。helloのSHA-256は2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824ですが、Helloにすると185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969になります。helloの後ろに改行を一つ足すと、先頭は5891b5b5に変わります。
例3。The quick brown fox jumps over the lazy dogのSHA-256はd7a8fbb3で始まり、末尾にピリオドを付けるとef537f25で始まります。
- 見えない文字。末尾の空白や改行、WindowsのCRLFとUnixのLFの違いだけでハッシュは変わります。他のツールと値が合わないときは最初に疑ってください。
- 文字コード。このツールはテキストをUTF-8のバイト列にして計算します。日本語を含む場合、Shift_JISなど別の文字コードで計算した値とは一致しません。
- テキストとファイルの違い。エディタで保存したテキストファイルにはBOMや末尾の改行が付くことがあり、見た目が同じでも貼り付けたテキストのハッシュとは異なる場合があります。
- 桁数の取り違え。16進で40桁ならSHA-1、64桁ならSHA-256、96桁ならSHA-384、128桁ならSHA-512です。桁数でおおよそ判別できます。
- 大文字・小文字。16進数の英字は大文字小文字を区別しません。比較するときは同じ表記にそろえてください。
このツールの限界
対応するのはテキストのみで、ファイルの読み込み、MD5、SHA-3、HMAC、ソルトつきハッシュ、bcryptやArgon2のようなパスワード用ハッシュには対応していません。 計算はWeb Crypto APIを使ってブラウザ内で行われ、入力した内容はサーバーに送信されません。それでも、本物のパスワードや秘密情報を、管理していないWebページに貼り付ける習慣は避けましょう。
よくある質問
ハッシュ値から元のテキストを復元できますか?
数学的に逆算する方法はありません。ただし短い文字列やありふれた文字列は、候補を計算して照合する方法(辞書攻撃、ルックアップ表)で見つかることがあり、ハッシュにしたことが秘密の保護を保証するわけではありません。
空白や改行も結果に影響しますか?
はい。ハッシュはバイト単位で計算されるため、空白一つ、改行コードの違い、大文字小文字の違いでもまったく別の値になります。他のツールと値が合わないときは、まず改行と文字コードを確認してください。
MD5やSHA-1はもう使ってはいけませんか?
署名、証明書、パスワード保存、改ざん防止といったセキュリティ用途には使わないでください。転送エラーの確認や重複ファイルの検出のような非セキュリティ用途では今も一般的です。新規に設計するならSHA-256以上を基本にします。
パスワードをSHA-256でハッシュして保存すれば安全ですか?
いいえ。SHA-256は非常に速く、データベースが流出した場合に総当たり攻撃を受けやすく、ソルトの扱いも自分で実装する必要があります。Argon2id、bcrypt、scrypt、PBKDF2を、信頼できるライブラリ経由で使ってください。
異なる入力が同じハッシュ値になることはありますか?
入力は無限で出力は有限なので、原理的には存在します。問題は、そうした組を現実的に見つけられるかどうかです。MD5とSHA-1については見つけられることが示されていますが、SHA-2ファミリーについては方法が知られていません。
関連ツール
- パスワード生成機: 推測されにくいパスワードを作るとき
- パスワード強度チェッカー: 推測されやすさを確認するとき
- Base64エンコーダー/デコーダー: ハッシュと違って元に戻せるエンコード
- UUID生成機: 一意の識別子を作るとき