Appearance
署名検証 ― 外したら何が起きるか
この章のキーワード
| 用語 | 意味 | なぜ重要か |
|---|---|---|
| HMAC | Hash-based Message Authentication Code | メッセージが改竄されていないことを確認する仕組み |
| SHA-256 | 256ビットのハッシュ関数 | 入力から固定長の「指紋」を生成する |
| Channel Secret | LINE Bot ごとに発行される秘密鍵 | この鍵を知っている者だけが正しい署名を作れる |
| タイミング攻撃 | 処理時間の差を測定して秘密を推測する攻撃 | 比較方法が == だと情報が漏れる |
Phase 1: 観察
Chapter 0.2 で見た WebhookController は、リクエストの署名を検証していました。
php
// WebhookController.php(署名検証部分の概要)
// Label: trade-off
// 1. リクエストボディと Channel Secret から HMAC-SHA256 を計算
$hash = hash_hmac('sha256', $request->getContent(), $bot->channel_secret, true);
$hash_encoded = base64_encode($hash);
// 2. LINE が送ってきた署名と照合
// (※ この比較方法には改善余地があります)一方、PartnerApiSignatureService の署名検証はこうなっていました。
php
// PartnerApiSignatureService.php
// Label: exemplar
return hash_equals($expectedSignature, $signature);同じ「署名を検証する」でも、比較方法 が違います。
Phase 2: 判断
AI禁止ゾーン
2つの問いに答えてください。
- 署名検証を完全に外したら、何が起きますか? 具体的なシナリオを挙げてください。
- 署名の比較に
==を使うのとhash_equals()を使うの では、何が違いますか?
AIに聞く前に、自分の頭で考えてみましょう。
テキストを入力すると有効になります