主なポイント
ハッシュ化とは、パスワードやファイルなどのデータを、復元不可能な固定長のコードに変換する技術です。これにより、万が一ハッシュ値が盗まれたとしても、攻撃者が元のデータを割り出すことは極めて困難になります。
本稿では、ハッシュ化の仕組みから用途、それらを支えるアルゴリズム、そして正しい利用方法までを詳しく解説します。
ハッシュ化とは、単語、ファイル、メッセージ全体など、あらゆるデータを英数字からなる短い固定長の文字列へと変換する手法です。この変換されたデータは「ハッシュ値」と呼ばれます。
ハッシュ値は、いわば「デジタル指紋」です。一人ひとりが異なる指紋を持つように、すべてのデータには固有のハッシュ値がひも付けられます。そのため、元のデータがわずかでも変更されれば、ハッシュ値はまったく異なるものへと変化します。
たとえば、「hello123」という単語を入力したとします。
ハッシュ関数がこの文字列を固有の文字列へと変換し、その結果は「f30aa7a662c728b7407c54ae6bfd27d1」のようになります。

ここで、わずかな変更を加えて、頭文字を大文字にした「Hello123」(大文字の「H」)と入力してみます。すると、新しいハッシュ値は「d0aabe9a362cb2712ee90e04810902f3」となり、先ほどとはまったく異なるものになります。
わずか1文字を変更しただけであるにもかかわらず、ハッシュ値全体が大きく変化しました。これは「アバランチ効果(雪崩効果)」と呼ばれています。
暗号技術におけるハッシュ化の重要なルールをいくつか紹介します。
ハッシュ化と暗号化は多くの人が混同しがちですが、これらはまったく異なる技術です。
たとえば、メッセージの機密性を保ち、第三者への漏洩を防ぎたい場合には「暗号化」を行います。そうすれば、鍵を持っている受信者だけがメッセージを解除して読むことができます。
WhatsAppでおなじみのエンドツーエンド暗号化機能が、まさにこれに当たります。これにより、メッセージを読めるのはあなたと通信相手だけに限定され、WhatsApp社であっても内容を閲覧することはできません。

しかし、特定のファイルが改ざんされていないことを保証したい場合には、「ハッシュ化」を行います。そうすれば、元のデータの内容を知らなくとも、変更が加えられていないかどうかを確認できます。
例として、7-Zipを使用して「ubuntu-24.04.2-desktop-amd64.iso」というファイルのSHA-256ハッシュ値を算出する方法を説明します。
以下がその方法です。
7-Zipがファイルをスキャンし、以下の固有のコードが生成されました。

このハッシュ値は、ファイルにあらかじめ組み込まれているわけではありません。ツールがファイルの内容を読み取ってハッシュ値を自動生成します。
あとは、このハッシュ値をUbuntuの公式サイトに公開されているハッシュ値と比較するだけです。一致すればファイルは安全であり、一致しなければファイルが破損または改ざんされている可能性があります。
実際の現場でハッシュ化がどのように活用されているのか、その代表的な事例を見ていきましょう。
Webサイトでパスワードを作成する際、通常、サイト側はパスワードそのものを保存するのではなく、パスワードをハッシュ化した値を保存します。これにより、次回ログイン時には入力されたパスワードが再度ハッシュ化され、保存されているハッシュ値と照合されます。両者が一致すればログインが許可され、一致しなければアクセスは拒否されます。
たとえば、Metaが運営するFacebookでは、ユーザーの実際のパスワードをそのまま保存してはいません。その代わりに、「scrypt」と呼ばれるツールを用いてパスワードをハッシュ化し、ソルトを付加して保護しています。
これにより、パスワードは復元が極めて困難な文字列に変換され、Facebookの従業員であっても中身を閲覧することはできません。
最大のメリットは、万が一ハッカーが内部システムに侵入してパスワードデータベースを盗み出したとしても、実際のパスワードが知られることはない点です。ハッカーが目にするのは解読が極めて困難なハッシュ化されたコードだけです 。
注:すべてのシステムがハッシュ化を採用しているわけではありません。Googleパスワードマネージャーのように暗号化を用いるシステムもあります。この場合、ユーザー名とパスワードは専用の秘密鍵によって暗号化されます。
ハッシュ化は、ファイルが変更または改ざんされていないかを確認する用途でも広く利用されています。ソフトウェアやシステムファイルをダウンロードする際、Webサイトには元のファイルから生成したハッシュ値である「チェックサム」が提供されていることが一般的です。
チェックサムは、OSイメージのような大容量かつ重要なファイルをダウンロードする際に、IT分野で広く活用されています。これにより、ダウンロードしたファイルが改ざんされておらず、信頼できるものであることを確認できます。
たとえば、公式サイトからUbuntu Desktopをダウンロードしてみましょう。ここでは、ISOファイルに加えてSHA-256のチェックサムも提供されています。
ダウンロード完了後、Windowsのコマンドプロンプトで「certutil」などのツールを使用してチェックサムを生成し、公式の値と比較して整合性を確認できます。
比較した結果、チェックサムが一致したため、ファイルが破損していないことを確認できました。

ハッシュ化は、メッセージやファイルが改ざんされていないことを保証するため、デジタル署名にも活用されています。
メッセージを送信する前に、システムはまずハッシュ関数を用いてメッセージをハッシュ値へと変換します。次に、そのハッシュ値に対して送信者の「秘密鍵」でデジタル署名を施すことで、デジタル署名が生成されます。
たとえば、Mozillaの公式アーカイブからFirefoxをダウンロードする際、インストーラーと同じフォルダー内に以下の2つの追加ファイルが含まれていることがあります。

これらのファイルは、ユーザーがダウンロードデータの完全性を検証するのに役立ちます。万が一、悪意のある第三者がインストーラーに手を加え、マルウェアなどを仕込んだ場合、ハッシュ値は一致しなくなります。さらに、デジタル署名があることで、ハッシュファイルそのものが改ざんされていないことも確認できます。
この一連の検証プロセスにより、ダウンロードしたファイルが安全かつ変更されておらず、ハッカーや偽サイトからではなく、Mozillaから正規に提供されたものであることを確認できます。
ハッシュ化は、ビットコインに代表されるブロックチェーン技術においても重要な役割を担っています。ブロックチェーンの各データブロックは固有のハッシュ値を持つと同時に、その直前のブロックのハッシュ値も含んでいます。この仕組みによって、すべてのブロックが強固に連結されています。
万が一、あるブロックのデータを改ざんしようとするとハッシュ値が変化し、チェーンの連続性が破綻します。この仕組みこそが、ブロックチェーンの強固なセキュリティと高い信頼性を支えているのです。
たとえば、ある攻撃者が過去のビットコイン取引データを書き換え、「10ビットコインではなく1ビットコインを受け取った」と偽ろうとしたとします。しかし、データを変更した瞬間にそのブロックのハッシュ値が大きく変わるため、後続のチェーンとの整合性が失われます。
この不正な改ざんを成立させるには、それ以降に続くすべてのブロックを書き換えなければならず、これには膨大な計算能力が必要となります。
これこそが、ブロックチェーンにおけるデータの不正改ざんが事実上不可能である理由です。わずかな変更であっても、チェーン全体の連続性を破綻させてしまうからです。
ハッシュ化は、常に進化し続ける技術です。そこには複数のアルゴリズムが存在し、それぞれ異なる特性を持っています。では、これらにはどのような種類があり、どう違うのかを見ていきましょう。
MD5は、その優れた処理速度とシンプルさから、かつて絶大な人気を誇ったハッシュアルゴリズムです。128ビットのハッシュ値を生成し、ファイルの整合性チェックや、転送中にデータが変更されていないかの検証に広く用いられていました。
しかし、時代の経過とともに深刻な欠陥が発見され、特に「衝突(コリジョン)」に対する脆弱性が問題視されるようになりました。これは2つの異なるデータから同じハッシュ値が生成されてしまう危険性を意味します。
たとえば、同じMD5ハッシュ値を持つ、以下のような2つのまったく異なるPDFファイルを作成することが可能であるということです。
「universal-pdf-md5-collision」と呼ばれるGitHubプロジェクトでは、読み取り可能な2つのPDFファイルで意図的に衝突(コリジョン)を起こせることが実証されています。これは、MD5がファイルの真正性を検証する用途ではもはや信頼できないということを意味します。
そのため、MD5は現在では旧式の技術と見なされており、主に基本的なチェックサムやレガシーシステムなど、セキュリティ用途以外で使用されています。
SHA-1は、MD5を超える強固なセキュリティを実現するために開発されました。より長い160ビットのハッシュ値を生成し、パスワード認証、ファイルの整合性検証、そしてデジタル署名などの分野で広く採用されていました。
オンラインツールで「hello」という文字列のSHA-1ハッシュ値を作成してみたのが以下のスクリーンショットです。

Gitでもまた、コミットの識別やコードリポジトリの変更追跡にSHA-1を採用していました。しかし現在では、より安全なアルゴリズム(SHA-256)へとアップデートされています。
MD5と同様に、SHA-1も時代の経過とともに、最終的には脆弱性があることが判明しました。
GoogleとアムステルダムのCWI研究所は、SHA-1に対する衝突攻撃「SHAttered」を公開実証しました。2つの異なるPDFファイルから全く同じSHA-1ハッシュが生成されたことで、このアルゴリズムがもはや衝突耐性を備えていないことが実証されています。
そのため、現在では旧式の技術と見なされており、機密性や安全性が求められるデータには使用が推奨されていません。
かつてはMicrosoftでさえも、ソフトウェアアップデートやWindowsのファイル署名にSHA-1を採用していましたが、セキュリティ上の懸念から2021年に公式サポートを終了しています。
SHA-2は複数のハッシュアルゴリズム群で構成されており、中でもSHA-256とSHA-512が最も一般的です。これらのアルゴリズムはさらなる強化が図られており、デジタル署名や暗号通貨の分野で広く採用されています。
たとえば、ビットコインは、プルーフオブワーク(PoW)のアルゴリズムにSHA-256を採用しており、これによってブロックチェーン上の取引の完全性と安全性が維持されています。
MD5よりも処理速度は劣るものの、攻撃に対して極めて高い耐性を備えており、ほぼすべてのサイバーセキュリティ要件において信頼できる選択肢とされています。
実際、SHA-512はさらに長いハッシュを生成するため、より多くのシステムリソースを必要とするものの、極めて高い安全性が求められる環境では特に効果的です。
SHA-3は、SHAファミリーにおける最新のアルゴリズムです。将来的に、SHA-2に脆弱性が発見された場合に備えた代替手段として開発されました。
内部構造もSHA-2とは異なります。
SHA-3はSHA-2と同等に高い安全性を備えていますが、SHA-2が現在も十分に機能しているため、まだ広く普及しているわけではありません。それでもなお、将来のシステム設計や、追加の防護層としての選択肢として、SHA-3は極めて優れています。
ハッシュ関数(ハッシュアルゴリズムとも呼ばれます)を選ぶ際は、「速度」と「セキュリティ」のどちらがより必要かを検討してください。
ファイルの改ざん検知など、迅速な確認が目的であれば「速度」を最優先すべきです。しかし、MD5やSHA-1のような従来のハッシュ関数は、高速であるものの、異なるデータから同じハッシュ値が生成されるリスクがあるため、もはや安全とはみなされません。
2024年には、カリフォルニア州立大学サンディエゴ校、CWIアムステルダム、BastionZeroの共同開発チームがBlast‑RADIUS (CVE‑2024‑3596)を公表しました。この研究では、ネットワーク経路上にいるハッカーが、MD5の高速なトリックを悪用することで、パスワードを知らなくてもシステムに侵入できることが実証されました。
ハッカーによる突破のリスクがある以上、これらの古いアルゴリズムは使用を避けるのが賢明です。
パスワードの保護や重要情報のセキュリティ確保など、データの安全を守るためには、SHA-256やSHA-3のような、より強固なハッシュ関数を選択すべきです。これらはデータを確実に保護するために複雑な計算を行うため、実行に多少の時間を要します。
たとえば、MD5が1段階の処理でハッシュを生成するとすれば、SHA-256では3〜4段階の処理が必要になる場合があります。つまり、数ミリ秒ほど余分に時間がかかることになります。
そして、高い安全性と高速な処理を同時に実現したいのであれば、SHA-512やBLAKE2が最適です。これらは処理速度を犠牲にすることなく、強固な保護を提供します。
ハッシュ化の安全性を最大限に高めるためのベストプラクティスをご紹介します。
ハッシュ化はデータの安全性を高めますが、不適切な運用をすれば重大な問題を引き起こす可能性があります。ここでは、陥りがちな一般的な間違いと、それを回避する方法をご紹介します。
元データとそのハッシュ値を同じ場所に保存すると、セキュリティの効果は半減します。その場所に攻撃者が侵入した場合、ハッシュ値と、本来保護されるべき元データの両方を奪われるため、データの検証や改ざんが容易になってしまいます。
このリスクを回避するには、ハッシュ値を元データとは別に保存してください。それぞれ異なるストレージシステムを使用し、アクセス制御を適用した上で、各データへのアクセス権限を厳格に制限することが重要です。
これにより、防御層をさらに強化でき、攻撃の難易度を大幅に引き上げることができます。
セキュリティを取り巻く環境は絶えず変化しており、今日「強固」とされる手法が、明日には「脆弱」になることもあります。旧式となった手法をそのまま使い続けていれば、データは危険にさらされかねません。
だからこそ、常に最新情報を把握しておくことが重要です。セキュリティに関する最新ニュースにアンテナを張り、必要に応じてハッシュアルゴリズムをアップデートしていきましょう。
ユーザーパスワードを保存したり、ファイルを配布したりする際は、そのセキュリティ確保を最優先に考えてください。SHA-256やBLAKE2のような安全なハッシュ関数へと今すぐ切り替え、必要に応じてソルトも実装しましょう。
ハッシュ化とは、任意の入力データを「ハッシュ値」と呼ばれる固定長の文字列に変換するプロセスのことです。このハッシュ値から元のデータを復元することは極めて困難です。
ハッシュ化はデータの完全性を検証するための「不可逆な処理」であるのに対し、暗号化は鍵を使って元に戻せる「可逆的な処理」であり、データの機密性を保つために使用されます。
主なハッシュアルゴリズムにはSHA-256、SHA-3、BLAKE2、MD5、SHA-1などがあります。ただし、MD5とSHA-1は現在、ほとんどの用途において脆弱とみなされています。
ハッシュ化は、実際のパスワードではなく「ハッシュ値」のみを保存することでパスワードを保護します。万が一ハッシュ値が盗まれたとしても、元のパスワードを復元することは極めて困難です。
SHA-256やSHA-3のような最新のアルゴリズムを使用し、パスワードは必ずソルトを付加してからハッシュ化しましょう。MD5やSHA-1のような旧式の方式は避けるべきです。
このブログはこちらの英語ブログの翻訳です。
この記事について誤りがある場合やご提案がございましたら、splunkblogs@cisco.comまでメールでお知らせください。
この記事は必ずしもSplunkの姿勢、戦略、見解を代弁するものではなく、いただいたご連絡に必ず返信をさせていただくものではございません。