Toolyard

ハッシュとは? MD5、SHA-1、SHA-256をわかりやすく

データの指紋

ハッシュ関数は、どんな入力(1語、1つの文書、4 GBの動画)でも、決まった長さの短い文字列に変えます。これをハッシュ、ダイジェスト、チェックサムと呼びます。同じ入力からはいつも同じハッシュができ、ほんの少しでも変えるとまったく違うハッシュになります。

入力SHA-256ハッシュ
hello2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
Hello185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
hello!ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b

大文字1つや感嘆符1つで、結果の文字がすべて変わります。ハッシュ生成で試してみてください。

よいハッシュ関数の条件

  • 決定的: 同じ入力なら、どのコンピューターでも同じハッシュになります。
  • 一方向: ハッシュから入力に戻ることはできません。
  • 衝突しにくい: 同じハッシュになる2つの異なる入力を見つけることが、事実上不可能であるべきです。
  • 計算が速い: チェックサムには便利ですが、それが速いハッシュをパスワードに使ってはいけない理由でもあります(後述)。

ハッシュは暗号化ではない

暗号化は双方向で、鍵があれば元に戻せます。ハッシュには鍵がなく、元に戻せません。わかるのは一致するかどうかだけです。Base64はさらに別物で、誰でもデコードできる単なるエンコードです。

よく使われるアルゴリズム

アルゴリズム長さ状況
MD5128ビット(16進数32文字)2004年から破られている。偶然の破損の確認にだけ
SHA-1160ビット(16進数40文字)破られている。2017年に最初の実際の衝突が公開
SHA-256256ビット(16進数64文字)安全。現在の標準
SHA-512512ビット(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をブラウザの中で一度に計算し、公開されているチェックサムと照合できます。

このガイドで使うツール

その他のガイド

WindowsでHEICファイルを開く方法PDFのファイルサイズを小さくする方法写真から位置情報を削除する方法動画から音声を取り出す方法Wi-FiのQRコードを作る方法PDFに署名する方法ファイルのチェックサムを確認する方法(SHA-256)PNG・JPG・WebP: どの画像形式を使うべき?PDFファイルを結合する方法画像から文字をコピーする方法JPGをPDFに変換する方法PDFをJPGに変換する方法PDFを分割する・ページを抜き出す方法PDFを回転して保存する方法PDFにページ番号を入れる方法PDFに透かしを入れる方法MacでHEICをJPGに変換する方法WebPをJPGに変換する方法画像のファイルサイズを小さくする方法動画をGIFに変換する方法WAVをMP3に変換する方法強いパスワードを作る方法摂氏を華氏に変換する方法GBとGiB: ドライブの容量が少なく表示される理由パーセントの計算方法2つの日付の間の日数を計算する方法Unixタイムスタンプとは?2つのテキストファイルを比較する方法文書の文字数・単語数を数える方法スクリーンショットや画像のQRコードを読み取る方法写真を20 KB(または好きなサイズ)に圧縮する方法写真の背景を削除する方法マイクをテストする方法画面のドット抜けを確認する方法画面を録画する方法iPhoneの着信音を作る方法送るために動画を圧縮する方法PDFのパスワードを解除する方法PDFにパスワードをかける方法PDFのフォームに記入する方法PDFをWordに変換する方法写真の顔にぼかしを入れる方法BMIの計算方法住宅ローンの返済額の計算方法タイムゾーンをまたいだ会議の日時の決め方cron式とは?DNA配列の逆相補鎖を求める方法DNAをタンパク質に翻訳する方法GenBankをFASTAに変換する方法DNA配列の制限酵素部位を探す方法2本のDNA配列やタンパク質配列をアラインメントする方法PCRプライマーの設計とチェックの方法モル質量の求め方化学反応式の係数の合わせ方決まったモル濃度の溶液の作り方希釈の計算方法(C1V1 = C2V2)pHの求め方A260からDNA濃度を求める方法ライゲーションに加えるインサート量の求め方RPMをg(RCF)に換算する方法血球計算盤で細胞を数える方法パネットの方形の使い方50/30/20ルールで家計の予算を立てる方法借金返済のスノーボール法とアバランチ法老後資金はいくら必要か年収を時給に換算する方法利益率とマークアップの違い消費税・VAT・売上税の計算方法請求書の作り方いくらの家なら買えるか抵抗のカラーコードの読み方LEDに付ける抵抗の選び方ケーブルの電圧降下の計算方法コンクリートはどれくらい必要か塗料はどれくらい必要かサブネットの計算方法有効数字のルール