🐧 Linux 総合学習プラットフォーム
セキュリティ/権限強化 ・ 中級

暗号化とハッシュの基礎(gpg・sha256sum)

「ハッシュ」と「暗号化」は似ているようで役割がまったく違います。ハッシュは改ざん検知の指紋、暗号化は鍵がないと読めなくする仕組みです。この記事では、sha256sumによるダウンロード検証、gpgによる共通鍵・公開鍵暗号の考え方、SSH/TLSが守る通信とLUKSが守るディスクの違い、そしてパスワードを平文で置いてはいけない理由を整理します。

「暗号化しておけば安心」という言葉をよく聞くが、実はハッシュと暗号化は目的がまったく異なる技術だ。この違いを理解しないまま使うと、守れているつもりで守れていない状況に陥りやすい。

🔗
たとえハッシュは書類に押す割印、暗号化は書類を入れる金庫だ。割印は「中身が改ざんされていないか」を確かめるための痕跡であり、割印自体を見ても中身は読めない。金庫は逆に、鍵がなければ中身そのものが読めなくなる仕組みだ。

この2つを混同すると、「ハッシュ化したから中身も隠れている」といった誤解や、「暗号化したから改ざんされていないはずだ」といった誤解につながる。まずは役割が別物だと切り分けて覚えておく。

🔖 ハッシュ=改ざん検知の指紋

ハッシュとは、どんなデータでも入力すると決まった長さの文字列(指紋のようなもの)を出力する計算のことだ。同じ入力からは必ず同じハッシュ値が出て、逆にデータが1ビットでも変われば、ハッシュ値はまったく別のものに変わる。

この性質を使って、ファイルが配布元と同じ中身かどうかを検証できる。代表的な計算方式の一つがSHA-256で、これを計算するコマンドがsha256sumだ。

ダウンロードしたファイルのハッシュ値を計算する例。 $ sha256sum ubuntu-24.04.iso a1b2c3d4e5f6...(64桁の16進数) ubuntu-24.04.iso 配布サイトに掲載されている正規のハッシュ値と、この出力を見比べる。
💡
ポイントハッシュ値が一致すれば「ダウンロード中に壊れていない・改ざんされていない」と確認できる。ハッシュは中身を復元するものではなく、あくまで一致するかどうかを確認する指紋だという点を押さえておく。
配布元の公式ハッシュ値手元のファイルをsha256sum見比べる一致 = 無事安心して使える
つまずきハッシュ値が違っていた場合、通信エラーで壊れただけの可能性もあるが、悪意ある改ざんの可能性も否定できない。一致しないファイルはそのまま使わず、再ダウンロードするのが基本の対応になる。

🔐 暗号化=鍵がないと読めない

暗号化は、データを鍵を使って別の見た目に変換し、対応する鍵がなければ元に戻せなくする技術だ。ハッシュと違って「元に戻す(復号する)」ことが前提になっている点が大きな違いになる。

暗号化の考え方には大きく2種類がある。1つは共通鍵暗号で、暗号化するときと復号するときに同じ鍵(パスワードのようなもの)を使う方式だ。もう1つは公開鍵暗号で、暗号化用の鍵(公開鍵)と復号用の鍵(秘密鍵)がペアになっており、片方で暗号化したものはもう片方でしか復号できない。

gpgコマンドは、この両方の暗号化方式を扱える定番ツールだ。GnuPGというソフトウェアの略で、多くのLinuxディストリビューションに標準で入っている。手軽に使えるのが共通鍵方式(対称暗号)で、-cオプションを付けて実行する。

共通鍵暗号でファイルを暗号化する例。 $ gpg -c secret.txt Passphrase をこの場で入力すると、secret.txt.gpg という暗号化されたファイルが作られる。復号にはこのパスフレーズが要る。
💡
ポイントgpg -c は「入力したパスフレーズだけが鍵」というシンプルな方式だ。パスフレーズを忘れると本人でも復号できなくなる点に注意する。
🔗
たとえ共通鍵暗号は南京錠と鍵が1セットになった仕組みだ。鍵を持つ人だけが開けられるが、鍵そのものを安全に相手へ渡す方法を別途考える必要がある。公開鍵暗号は、誰でも荷物を入れられるが開ける鍵は受取人しか持っていない私書箱のようなもので、鍵を事前に共有する手間がない。

gpgでは公開鍵と秘密鍵のペアを作って運用することもできる。送信者は相手の公開鍵で暗号化し、受信者は自分だけが持つ秘密鍵で復号する、という流れになる。ここでは考え方の紹介にとどめる。

復号したいときはgpg -dに暗号化済みファイルを渡す。共通鍵方式ならパスフレーズを、公開鍵方式なら対応する秘密鍵を持っていることが求められる。

🌐 通信の暗号化とディスクの暗号化は別物

「暗号化」とひとくくりにされがちだが、実際には「どこを守るか」で仕組みがまったく異なる。既存トピックで扱ったSSHや、Webでよく使われるTLSは、通信経路上でデータを盗み見・改ざんされないようにする仕組みだ。データが目的地に届いて保存された後は、この暗号化の範囲外になる。

一方、ディスクの暗号化(LinuxではLUKSという仕組みが代表的)は、ストレージそのものを暗号化する。パソコンやサーバーが盗まれた・ディスクを抜き取られた、といった物理的な持ち出しに対して効果を発揮する仕組みで、通信中の盗聴には関与しない。

SSH / TLS通信経路を守るLUKSディスクを守る守る場所が違う。両方あって初めて安心

つまり、通信は暗号化していてもディスクが平文のままなら、機器を持ち去られたときに情報が漏れる。逆にディスクを暗号化していても通信が平文なら、盗聴のリスクは残る。守りたい対象に応じて両方を組み合わせるのが基本になる。

自分のサーバー構成を思い浮かべ、通信経路とディスクのそれぞれに暗号化の手当てがあるかを一度棚卸ししてみると、抜け漏れに気づきやすい。

🚫 パスワードは平文で置かない

ここまでの内容を踏まえると、設定ファイルやスクリプトの中にパスワードをそのまま書く(平文で置く)ことがなぜ危険か見えてくる。ファイルが誰かの目に触れた瞬間、ハッシュ化も暗号化もされていない生の文字列がそのまま読めてしまう。

つまずき実際のパスワード保管では、Linuxのアカウントパスワードのようにハッシュ化して保存する、秘密情報は環境変数や専用のシークレット管理の仕組みに分離する、といった対策を組み合わせる。平文でどこかに書き残す運用は避けたい。
🔗
たとえ平文のパスワードは、玄関の鍵をドアマットの下に置いておくようなものだ。鍵をかけていること自体は正しくても、鍵の隠し場所が誰でも分かる場所では意味を成さない。

ハッシュで確かめ、暗号化で守り、守る場所ごとに手段を使い分ける。この3つの感覚があれば、「暗号化しているから安心」という思考停止から一歩抜け出せる。

この項目に出てくる用語

ハッシュ値はっしゅち
データから計算される、改ざん検知に使う指紋のような固定長の値。
共通鍵・公開鍵きょうつうかぎ・こうかいかぎ
暗号化と復号に使う鍵の2つの方式。同じ鍵を使うか、ペアの鍵を使うか。

関連コマンド

sha256sumgpg

▶ 学習アプリでこの続きを学ぶ・演習する