X

暗号

特定の処理を行うデータを渡す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)の作り方を紹介します。 (さらに…)

より高度なCSRF対策 – URL/URI個別にバリデーションする方法

ハッシュ関数は色々な場面で利用できます。このエントリではハッシュ関数の使い方、特にリクエストにサインする方法として、データベースを使わずURI個別のCSRFトークンを生成しバリデーションする方法を紹介します。 (さらに…)