暗号
特定の処理を行うデータを渡すURLの作り方
Webアプリケーションを作っているとデータの完全性と機密性を保ちつつ「特定の処理を行うデータを渡すURL」を作りたくなる場合があります。 例えば、特定のURLをクリックすると特定ユーザーの連絡先にユーザーを登録する、などです。 (さらに…)
PHP用のCookieセッションセーブハンドラー
JWTが凄い使われ方をしているようなので、可能な限りマシなCookieベースのセッションセーブハンドラーを書きました。メリットは サーバー側のリソース(DBやファイルなど)を使わないので簡単にスケールする ことにあります。 しかし、Cookieの保存は大きく分けて3つの問題があります。 ネットワークが不安定だとデータが失われる場合がある(ネットワーク接続の問…
PHPのserialize()/unserialize()を安全に利用する方法
serialize()でシリアライズしたデータを外部に送信/保存1し、それをunserialize()すると危険です。 アンシリアライズは複雑なメモリ操作が必要で、PHPに限らず、何度もメモリ破壊攻撃の脆弱性が見つかっています。このため、外部入力データのアンシリアライズは行うべきではありません。現在のPHPプロジェクトでは、RubyやPythonと同じく、ア…
PHPでCSRF対策を自動的に行う方法
PHPでWebページにCSRF対策を追加するのは簡単です。全てのページにCSRF対策を追加する場合、ファイルを1つインクルードする以外、ほとんど何も行う必要がありません。 (さらに…)
暗号学的ハッシュを安全に使うには?
2017年2月にGoogleがSHA1ハッシュの衝突に成功した、とアナウンスしました。1 暗号学的に安全なハッシュ関数な場合、SHA2-256を使っていると思います。SHA3が利用可能になのでSHA3を利用している場合も多いと思います。SHA2もSHA3も暗号学的ハッシュ関数です。ざっくりとこれらのハッシュ関数を安全に使う方法を紹介します。 (さらに&hel…
HKDF, HMACなどのハッシュ関数を使う場合に知っておくべきFS/PFS
PHPにHKDF関数、hash_hkdf()が追加されましたが、そのシグニチャは褒められるモノではありません。 https://blog.ohgaki.net/php-hash_hkdf-insane-function-signature hash_hkdf()が脆弱なAPI仕様になってしまった主な原因は、開発者がハッシュ関数を利用して鍵を導出する場合に知っ…
出鱈目なシグニチャのhash_hkdf関数を安全に使う方法
ユーザーが間違った使い方をしないよう、PHP 7.1に追加されたhash_hkdf関数のシグニチャが出鱈目である件について書いておきます。使い方を間違えると脆弱な実装になるので注意してください。 (さらに…)
HMACハッシュの使い方のまとめ
最近、HMACハッシュ(hash_hmac)の使い方を書いてきたのでまとめです。 (さらに…)
文字列(ハッシュ)の安全な比較方法 – hash_equals
映画などでPINコードを一桁づつ解析してドアを開錠する、といったシーンがあると思います。こんなのは”映画の世界だけ”と思っている方も多いと思います。しかし、タイミング攻撃を利用すると”実際にこれと全く同じ方法”で鍵となる情報を解析できます。 タイミング攻撃とはサイドチャネル攻撃の一種で、鍵情報を比較的簡単に解析する方法です。PHP 5.6からはタイミング攻撃…
HMACを利用した安全なAPIキーの送受信
Webアプリケーションの機能をサービスとして提供する場合、ランダムな値の秘密のAPIキーを鍵とすることが多いです。 // 何らかのAPIを呼び出す http://example.com/api/v2/get_something?api_key=qwertyuiop シンプルな方法で使いやすいですが、鍵となるAPIキーをそのまま使っているので鍵が漏洩する可能性…
hash_hmac()の使い方
HMACの応用的な使い方をここ数本のブログで書いてきましたが、HMACの基本的な使い方を紹介していませんでした。リクエストパラメーターを安全に検証/バリデーションする方法を例に紹介します。unserialize()を安全に利用する利用例にもなります。 参考: https://blog.ohgaki.net/summary-how-to-use-hash_hm…
ハッシュ(HMAC)を使って弱い鍵を強い鍵に変える方法
既存の鍵から別の鍵を導出する方式としてはHKDF(RFC 5869)があります。AES用に弱い鍵から強い鍵を作るにはHKDFでなくてもHMACで十分です。実際、HKDFはHMACを組み合わせて鍵を導出しているだけなので、ここで紹介するHMACのみの鍵導出と同等です。 ※ PHP 7.2からHKDFを実装したhash_hkdf()を使えます。hash_hkdf…
ハッシュ(HMAC)を使ってパスワード付きURL/URIを作る方法
より高度なCSRF対策 – URL/URI個別にバリデーションする方法でハッシュ(HMAC)を使えばデータベースを使わずに有効期限付きのURLを作れる、と紹介しました。今回はパスワード付きURL(URI)の作り方を紹介します。 (さらに…)
ハッシュ(HMAC)を使って有効期限付きURL/URIを作る方法
より高度なCSRF対策 – URL/URI個別にバリデーションする方法でハッシュ(HMAC)を使えばデータベースを使わずに有効期限付きのURLを作れる、と紹介しました。今回は有効期限付きURL(URI)の作り方を紹介します。 (さらに…)