ハッシュ生成ツール
任意のテキストの MD5 と SHA ハッシュを生成し、想定のチェックサムと照合できます。
ハッシュ関数が実際に行うこと
暗号学的ハッシュ関数は、任意の大きさの入力を取り、固定長のバイト列 — ダイジェスト、すなわち「ハッシュ」 — を生みます。1 文字を与えても長編小説を与えても、MD5 は常に 16 バイト、SHA-256 は常に 32 バイトを返します。同じ入力は常に同じダイジェストを生み、入力のどこか 1 ビットを変えると出力の約半分のビットが変わります。だからほとんど同じ 2 つのファイルが、まったく無関係なハッシュを持つのです。
決定的な性質は、関数が一方向にしか動かないことです。ファイルのハッシュを計算するのは速いですが、ハッシュからファイルを復元するのは、単に遅いのではなく原理的に不可能です。固定長の出力が、上限のない入力を符号化できないからです。ハッシュは指紋であって暗号化された複製ではありません — 復号すべきものは何もありません。
人が実際にハッシュを使う目的
- ダウンロードの検証: プロジェクトがリリースの SHA-256 を公開し、受け取ったファイルをハッシュして、ダイジェストが一致すればバイトが無事に届いたことになります。
- 変更の検出: バージョン管理・バックアップ・重複排除のシステムは、ファイル全体ではなくハッシュを比べます。32 バイトの比較はギガバイトの比較よりはるかに安いからです。
- サブリソース完全性: Web ページが CDN から読み込むスクリプトの Base64 ハッシュを固定し、一致しなければブラウザがそのファイルの実行を拒みます。
- パスワードの保存 — ただし素のハッシュではなく、目的専用の低速な関数で。下記参照。
これらに共通するものに注目してください: ハッシュはより大きな何かのコンパクトな代役で、その物そのものを送ったり保存したりせずに「これは期待したのと同じものか?」に答えるために使われます。
MD5 と SHA-1 は破られている — それが実務で意味すること
ハッシュ関数は、誰かが衝突を構成できるようになった時点で破られたとみなされます: 同じダイジェストを生む 2 つの異なる入力のことです。MD5 の衝突は 2004 年以来ふつうのハードウェアで計算でき、2017 年には SHAttered 攻撃が同一の SHA-1 ハッシュを持つ 2 つの異なる PDF ファイルを生みました。このツールが両アルゴリズムに印を付けているのはそのためです。
実務上の帰結は「決して使うな」よりは狭いものです。衝突は、両方のファイルを操れる攻撃者が悪意あるものを無害なもののダイジェストに一致させられることを意味するので、MD5 と SHA-1 はもはや、ファイルが敵対者に改ざんされていないことを証明できません。偶発的な破損 — 途中で切れたダウンロード、ディスク上で反転したビット — の検出には今も十分使え、レガシーシステム・ETag ヘッダー・書き直される予定のない古いパッケージマニフェストで出会い続けるでしょう。
経験則: 問いが「これは転送中に壊れたか?」なら MD5 で十分です。問いが「誰かが意図的に置き換えたか?」なら SHA-256 以上を使ってください。
パスワードをこれらでハッシュしてはいけない
MD5・SHA-1、そして SHA-256 でさえ速く動くよう設計されており、速さはパスワードの保存にはまさに間違った性質です。現代の GPU は毎秒何十億もの SHA-256 ハッシュを計算するので、素のハッシュ化パスワードを盗んだデータベースは膨大な規模で攻撃でき — 同じパスワードが常に同じダイジェストを生むため、事前計算した表がさらに安くします。
パスワードの保存には、意図的に低速で、ソルト付きで、メモリを多く使う関数が必要です: Argon2id、scrypt、bcrypt です。パスワードごとに一意なランダムソルトを加えるので、同じパスワードでもダイジェストを共有せず、費用を調整できるので、各推測が攻撃者に実際の時間とメモリを要求します。このツールはチェックサムと指紋のためのもので、パスワードのハッシュ化のためのものではありません。
ダイジェストの読み方と比べ方
同じダイジェストは複数の書き方で表せます。小文字の 16 進数は標準的なコマンドラインツールが表示するもので、たいていそれと照合することになります:
md5sum file.iso # Linux sha256sum file.iso # Linux shasum -a 256 file.iso # macOS Get-FileHash file.iso -Algorithm SHA256 # PowerShell (大文字で表示) certutil -hashfile file.iso SHA256 # Windows (大文字で表示)
16 進数の大小に意味はありません — PowerShell と certutil は大文字を、Unix ツールは小文字を表示し、両者は同じ値です。だからこのツールの照合欄は 16 進数の大小を無視します。Base64 は別の話です: 同じバイト列のより密な符号化で、サブリソース完全性や各種 API が使い、そこでは大小が意味を持つため、正確に比較されます。
最後に身につける価値のある習慣: 2 つの長いダイジェストを目で見て一致を判断してはいけません。人の目は期待するものを見るのがとても得意で、最初と最後の数文字が合っていても何の意味もありません。期待値を貼り付けて、比較を正確に行わせてください。
よくある質問
- 私のテキストはサーバーに送られますか?
- いいえ。すべてのダイジェストはブラウザ内で計算されます — SHA 系は Web Crypto API で、MD5 はお使いのマシン上で動く JavaScript で。入力した内容が端末の外に出ることはありません。
- ハッシュを逆にして元のテキストを取り戻せますか?
- いいえ。ハッシュは固定長の指紋であって暗号化された複製ではなく、元をそこから復元することはできません。「MD5 復号」をうたうサイトは、あらかじめ計算した一般的な入力の表からあなたのハッシュを引いているだけで、短いか予測可能なテキストにしか効きません。
- ここで MD5 と SHA-1 に警告が付くのはなぜですか?
- 両者とも衝突が現実的だからです: 同じダイジェストを共有する 2 つの異なる入力を構成できます。そのためファイルが意図的に改ざんされていないことの証明には向きませんが、偶発的な破損を捕らえるのには今も十分です。
- どのアルゴリズムを使うべきですか?
- SHA-256 が妥当な既定で、今日ほとんどのプロジェクトが公開しているものです。SHA-512 はこの用途では意味のあるほど安全ではありませんが、64 ビットハードウェアでは高速です。MD5 や SHA-1 は、自分の制御できない何かが既にそれを要求するときにだけ使ってください。
- これでパスワードをハッシュできますか?
- できますが、その結果を保存すべきではありません。パスワードの保存には Argon2id・scrypt・bcrypt のような低速でソルト付きの関数が必要です — これらのような高速ハッシュこそ、盗まれたパスワードデータベースを破りやすくするものです。
- スペースや改行を足すとハッシュが変わるのはなぜですか?
- 空白も入力の一部だからです。末尾の改行は、ハッシュが期待どおりに一致しない最もよくある理由の一つです — 端末やエディターからコピーしたテキストは、目に見えない改行を抱えていることがよくあります。
- ヘブライ語・アラビア語・絵文字を正しく扱えますか?
- はい。テキストはハッシュ化の前に UTF-8 バイトとして符号化されます。これは他のすべてのツールが使う標準なので、ここで「שלום」や絵文字をハッシュすると、同じ文字を含む UTF-8 ファイルに対する md5sum や sha256sum と同じダイジェストが得られます。
- テキストはハッシュできるのにファイルはできないのはなぜですか?
- Web Crypto にはストリーミングのダイジェスト API がないため、ファイルはハッシュ化の前に全体をメモリに読み込む必要があり、手書きの MD5 は大きなファイルでは目に見えて遅くなります。テキストのハッシュ化は、ページを止めるファイルハッシュ化を提供するより、よくある場合を正直にカバーします。