0から分かるハッキングと防御 〜『' OR '1'='1』がパスワードを無効化する仕組み〜

2026-11-03 / シリーズ「0から分かる」 第3回

1. 3行でわかる結論と全体図

🔑 入力欄(パスワード) 👤 普通の人:『12345』を入力 🕵️ ハッカー:『' OR '1'='1』を入力 プログラムの命令文 パスワードが『12345』なら開けろ 書き換えられた命令文 『空っぽ』または『1=1』なら開けろ! ❌ 不一致なのでブロック 💥 パスワードなしで突破!

⚠️ はじめに(ホワイトハット・ルール) この講義は、システムを守る側(ホワイトハット)の視点を身につけるためのものです。実験はすべて、Google Colabの中に作った「あなた専用の実験用ミニ金庫」に対して行います。他人のWebサイトで試すことは法律で固く禁じられています。


2. なぜ生まれるのか?(昔の不便とプログラムの弱点)

第2回のAIの講義で、**「AIは『人間の命令』と『外から読み込んだメモ』を1つの文章に合体させて読むため、メモの中に命令を書かれると騙される」**という話をしました。 実は、インターネット上の銀行やショッピングサイトの裏側にある「データベース(顧客名簿の保管庫)」でも、まったく同じことが起きています。

たとえば、あなたがログイン画面でパスワードに secret と入力したとします。 裏側のプログラムは、名簿係(データベース)に向かって、次のような英語の命令文(SQL:エスキューエル)を組み立てて手紙を送ります。

ここでプログラムは、文字の始まりと終わりを表すために '(シングルクォーテーション=カギカッコ) を使っています。 では、もし悪い人が、パスワードの入力欄に ' OR '1'='1 という「カギカッコを含んだ文字」を入れたらどうなるでしょうか?

合体した命令文は、こう変わってしまいます。

算数において「1=1」は、いつどんな時でも絶対に正しい(True)です。 その結果、名簿係のコンピュータは「よし、条件クリアだ!」と勘違いし、パスワードを1文字も知らないハッカーに対して、金庫の扉を全開にしてしまうのです。

開かれた巨大な銀行の金庫扉(1967年、イタリア)
1967年、イタリアの銀行の金庫扉。現実の金庫はこれほど分厚い鋼鉄の扉で守られているのに、プログラムの世界では『' OR '1'='1』という短い入力ひとつで扉が開いてしまう。写真:Aldo Moisio(パブリックドメイン/Wikimedia Commons)

3. 仕組みの種明かし(3つの重要ルール)

攻撃と防御の仕組みを理解するための、3つのキーワードです。

専門用語小学生でもわかる例え実際にやっていること
SQLインジェクション命令文のすり替えトリック入力欄に ' などの区切り記号を混ぜて、単なる「名前やパスワードのデータ」を「コンピュータへの命令文」に化けさせる攻撃です。
プレースホルダ (Placeholder)透明なカプセル(防護ケース)入力された文字をそのまま命令文につなげるのではなく、「ここはデータ専用の箱(?)ですよ」とカプセルに閉じ込めてから渡す、最強の防御方法です。
ハッシュ化 (Hashing)元に戻せないミキサー万が一、名簿データが丸ごと盗まれてもパスワードがバレないように、パスワードを「リンゴ→ジュース」のようにグチャグチャの暗号に変換して保存する仕組みです。
🕵️ ハッカー:パスワード欄に『' OR '1'='1』を入力 ❌ 穴のあるプログラム ⭕ 守られたプログラム(カプセル使用) カギカッコが壊れて 「命令文」として実行される! カプセル(?)に閉じ込めるので 「ただの変な文字」として扱われる 💥 ログイン成功(突破) 🛡️ パスワード不一致(完全に防御)

4. 作って暴く!(Google Colab 15分ミニ実験)

実際に自分の手で「穴のある銀行システム」を作り、ハッキングで突破したあと、たった1行の修正で鉄壁の守りを作る実験をしてみましょう。 以下のリンクからGoogle Colabを開き、コードを貼り付けて再生ボタン(▶)を押してください。

👉 Google Colabを開いて実験を始める

実験①:『’ OR ‘1’=‘1』で金庫を突破し、カプセル(?)で防御する

このコードは、Google Colabの一時メモリの中に架空の銀行データを作り、攻撃と防御の違いを比較します。

# === 実験①:SQLインジェクションによる突破と、1行の修正による完全防御 ===
import sqlite3

# 1. 架空の「あおぞら銀行」の名簿データベースを作り、3人のデータを入れる
db = sqlite3.connect(":memory:")
db.execute("CREATE TABLE bank (id TEXT, password TEXT, money INT)")
db.execute("INSERT INTO bank VALUES ('tanaka', 'pass123', 50000)")
db.execute("INSERT INTO bank VALUES ('suzuki', 'love_dog', 120000)")
db.execute("INSERT INTO bank VALUES ('president', 'ultra_secret_999', 99999999)")

# ハッカーがパスワード欄に入力した「魔法の文字列」
hacker_password = "' OR '1'='1"

print("--- 💥 穴のあるプログラム(文字をそのまま合体させる) ---")
# f"... '{hacker_password}'" のように、文字を直接つなげてしまっているのが原因
bad_sql = f"SELECT * FROM bank WHERE id = 'president' AND password = '{hacker_password}'"
print("実際に作られた命令文:\n ", bad_sql)

leaked_data = db.execute(bad_sql).fetchall()
print("👉 実行結果(盗まれた全データ):\n ", leaked_data)


print("\n--- 🛡️ 守られたプログラム(カプセル『?』を使う) ---")
# 文字を直接つなげず、記号「?(プレースホルダ)」にして後からデータを渡す
good_sql = "SELECT * FROM bank WHERE id = 'president' AND password =?"
print("実際に作られた命令文:\n ", good_sql)

safe_data = db.execute(good_sql, (hacker_password,)).fetchall()
print("👉 実行結果(盗まれたデータ):\n ", safe_data, "← 空っぽ(完全にブロック成功!)")

実験①の種明かし

実験Aでは、社長(president)のパスワード ultra_secret_999 をまったく知らないのに、金庫の中の全データ(3人分のパスワードと預金額)が丸見えになってしまいました。 一方、実験Bでは、プログラムを password =? に変えただけで、ハッカーが入力した ' OR '1'='1 が「命令」ではなく「そういう名前のへんてこなパスワード」として安全に処理され、攻撃が100%無効化されています。


実験②:もし名簿が盗まれても大丈夫!「ハッシュ化ミキサー」の実験

もし実験Aのように名簿が盗まれたとき、パスワードが pass123 のようにそのまま書かれていたら(平文保存)、犯人にすぐ悪用されてしまいます。 そこでプロの現場では、パスワードを**「ハッシュ関数(元に戻せないミキサー)」**にかけて保存します。その威力を実験してみましょう。

# === 実験②:パスワードを「元に戻せない暗号(ハッシュ値)」に変える実験 ===
import hashlib

def make_hash(text):
# 文字をSHA-256(シャー・ニーゴロ)という世界標準のミキサーにかける
return hashlib.sha256(text.encode()).hexdigest()

# 1. 本物のパスワードをミキサーにかけて保存する
real_password = "apple_pie_2026"
saved_hash = make_hash(real_password)

print("元のパスワード:", real_password)
print("名簿に保存する暗号:", saved_hash)
print("(↑この64文字の暗号から、元の『apple_pie_2026』を逆算することはスーパーコンピュータでも不可能です)\n")

# 2. たった1文字(大文字・小文字)変えただけで、暗号はどう変わるか?
wrong_password = "Apple_pie_2026" # 先頭の a を A に変えただけ
wrong_hash = make_hash(wrong_password)

print("1文字変えた暗号:", wrong_hash)
print("👉 結果:たった1文字違うだけで、まったく別の64文字に変わってしまう!")

触って試す:パスワード総当たり時間の計算機

🔑 パスワード総当たり時間の計算機

文字の種類と桁数を選ぶと、すべての組み合わせを1秒に10億回の速さで試す攻撃者にどれくらいかかるかを表示します(盗まれたハッシュをオフラインで総当たりする想定です)。

文字の種類

桁数

5. 現実世界での悪用と限界(次回への伏線)

今回の実験で見たとおり、システムの守りには**「①入り口で命令を書き換えさせない(プレースホルダ)」と「②中身を見られても解読させない(ハッシュ化)」**の2段構えが必要です。

特に、実験②で登場した**「ハッシュ化(SHA-256)」**には、驚くべき2つの性質があります。

  1. 一方通行:元の文字から暗号は0.001秒で作れるが、暗号から元の文字に戻すことは絶対にできない。
  2. 雪崩(なだれ)効果:元のデータが「たった1文字」書き換えられただけで、出来上がる暗号が100%別物に変わってしまう。

この「1文字でもズルをして書き換えたら、暗号がガラッと変わって一瞬でバレる」という性質を見たある天才が、2008年にこう考えました。

「このハッシュ関数を鎖(チェーン)のように繋げば、銀行や政府のような管理者がいなくても、世界中の誰も絶対にハッキング(改ざん)できない『究極の取引帳簿』が作れるのではないか?」

そうして生まれたのが、次回・第4回のテーマである**「仮想通貨(ビットコイン)とブロックチェーン」**なのです。


確認クイズ

📝 確認クイズ(3問)