0から分かるハッキングと防御 〜『' OR '1'='1』がパスワードを無効化する仕組み〜
1. 3行でわかる結論と全体図
- ハッキングとは、黒い画面に謎の暗号を打ち込む魔法ではなく、プログラムを作った人の**「まさか入力欄にこんな記号は入れないだろう」という思い込み(隙間)を突くパズル**です。
- 最大の弱点は、コンピュータが**「人間が書いた命令(ルール)」と「外から入力された文字(データ)」の境界線を見失ってしまうこと**にあります。
- 攻撃の仕組み(どう突破されるか)を1度でも自分の手で体験すれば、**「たった1行プログラムを変えるだけで100%防御できる」**という事実がはっきりと分かります。
⚠️ はじめに(ホワイトハット・ルール) この講義は、システムを守る側(ホワイトハット)の視点を身につけるためのものです。実験はすべて、Google Colabの中に作った「あなた専用の実験用ミニ金庫」に対して行います。他人のWebサイトで試すことは法律で固く禁じられています。
2. なぜ生まれるのか?(昔の不便とプログラムの弱点)
第2回のAIの講義で、**「AIは『人間の命令』と『外から読み込んだメモ』を1つの文章に合体させて読むため、メモの中に命令を書かれると騙される」**という話をしました。 実は、インターネット上の銀行やショッピングサイトの裏側にある「データベース(顧客名簿の保管庫)」でも、まったく同じことが起きています。
たとえば、あなたがログイン画面でパスワードに secret と入力したとします。
裏側のプログラムは、名簿係(データベース)に向かって、次のような英語の命令文(SQL:エスキューエル)を組み立てて手紙を送ります。
SELECT * FROM 名簿 WHERE パスワード = 'secret'- (意味:名簿の中から、パスワードが
'secret'と一致する人のデータを出しなさい)
ここでプログラムは、文字の始まりと終わりを表すために '(シングルクォーテーション=カギカッコ) を使っています。
では、もし悪い人が、パスワードの入力欄に ' OR '1'='1 という「カギカッコを含んだ文字」を入れたらどうなるでしょうか?
合体した命令文は、こう変わってしまいます。
SELECT * FROM 名簿 WHERE パスワード = '' OR '1'='1'- (意味:パスワードが空っぽの人、または「1=1」が正しいなら、名簿のデータを出しなさい)
算数において「1=1」は、いつどんな時でも絶対に正しい(True)です。 その結果、名簿係のコンピュータは「よし、条件クリアだ!」と勘違いし、パスワードを1文字も知らないハッカーに対して、金庫の扉を全開にしてしまうのです。
3. 仕組みの種明かし(3つの重要ルール)
攻撃と防御の仕組みを理解するための、3つのキーワードです。
| 専門用語 | 小学生でもわかる例え | 実際にやっていること |
|---|---|---|
| SQLインジェクション | 命令文のすり替えトリック | 入力欄に ' などの区切り記号を混ぜて、単なる「名前やパスワードのデータ」を「コンピュータへの命令文」に化けさせる攻撃です。 |
| プレースホルダ (Placeholder) | 透明なカプセル(防護ケース) | 入力された文字をそのまま命令文につなげるのではなく、「ここはデータ専用の箱(?)ですよ」とカプセルに閉じ込めてから渡す、最強の防御方法です。 |
| ハッシュ化 (Hashing) | 元に戻せないミキサー | 万が一、名簿データが丸ごと盗まれてもパスワードがバレないように、パスワードを「リンゴ→ジュース」のようにグチャグチャの暗号に変換して保存する仕組みです。 |
4. 作って暴く!(Google Colab 15分ミニ実験)
実際に自分の手で「穴のある銀行システム」を作り、ハッキングで突破したあと、たった1行の修正で鉄壁の守りを作る実験をしてみましょう。 以下のリンクから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つの性質があります。
- 一方通行:元の文字から暗号は0.001秒で作れるが、暗号から元の文字に戻すことは絶対にできない。
- 雪崩(なだれ)効果:元のデータが「たった1文字」書き換えられただけで、出来上がる暗号が100%別物に変わってしまう。
この「1文字でもズルをして書き換えたら、暗号がガラッと変わって一瞬でバレる」という性質を見たある天才が、2008年にこう考えました。
「このハッシュ関数を鎖(チェーン)のように繋げば、銀行や政府のような管理者がいなくても、世界中の誰も絶対にハッキング(改ざん)できない『究極の取引帳簿』が作れるのではないか?」
そうして生まれたのが、次回・第4回のテーマである**「仮想通貨(ビットコイン)とブロックチェーン」**なのです。