Skip to content

署名検証 ― 外したら何が起きるか

📖この章のキーワード
用語意味なぜ重要か
HMACHash-based Message Authentication Codeメッセージが改竄されていないことを確認する仕組み
SHA-256256ビットのハッシュ関数入力から固定長の「指紋」を生成する
Channel SecretLINE 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つの問いに答えてください。

  1. 署名検証を完全に外したら、何が起きますか? 具体的なシナリオを挙げてください。
  2. 署名の比較に == を使うのと hash_equals() を使うの では、何が違いますか?

AIに聞く前に、自分の頭で考えてみましょう。

テキストを入力すると有効になります