最近、HMACハッシュ(hash_hmac)の使い方を書いてきたのでまとめです。
HMACハッシュの使い方
基本的なHMACハッシュの使い方です。HMACを使うと、文字列連結で作るハッシュ値より安全なハッシュ値を取得可能です。文字列連結は使わず、HAMCハッシュを使うべきです。
文字列(ハッシュ)の安全な比較方法
ハッシュ値が鍵となっているケースは多いです。この場合、ハッシュ値の比較はhash_equals関数を使わなければ、タイミング攻撃に脆弱になります。
URL/URI別+有効期限付きのCSRF対策
HMACハッシュを利用すると、全てのURIに同じCSRFトークンを使う必要はありません。URI固有かつ有効期限付きのCSRFトークンをデータベース無しで利用可能です。
安全なAPIキーの送受信方法
HMACハッシュを利用すると、APIキーをそのまま使わずにAPIキーのバリデーションが可能です。
弱い鍵を強い鍵に変える方法
HMACハッシュを使うと弱い鍵から強い鍵を作ることが可能です。(ユーザー入力のパスワード、AES128用の鍵からAES256の鍵を作る、など)
パスワード付きURL/URIを作る方法
HMACハッシュを使うとパスワード付き(+有効期限付き)のURLを作れます。
有効期限付きURL/URIを作る方法
HMACハッシュを使うと有効期限付きのURLを作れます。Amazon S3のPre Signed URLも同じ仕組みです。
serialize()/unserialize()を安全に使う方法
HKDFやHMACを使うとunserialize()も安全に行えます。
関連 – パスワードのハッシュ化
HMACは弱いパスワードから強いパスワードを作れますが、ユーザーが入力したパスワードを保存する場合はHMACではなくhash_password()を使うべきです。