HMACハッシュの使い方のまとめ

(Last Updated On: 2018年8月13日)

最近、HMACハッシュ(hash_hmac)の使い方を書いてきたのでまとめです。

HMACハッシュの使い方

基本的なHMACハッシュの使い方です。HMACを使うと、文字列連結で作るハッシュ値より安全なハッシュ値を取得可能です。文字列連結は使わず、HAMCハッシュを使うべきです。

hash_hmac()の使い方

文字列(ハッシュ)の安全な比較方法

ハッシュ値が鍵となっているケースは多いです。この場合、ハッシュ値の比較はhash_equals関数を使わなければ、タイミング攻撃に脆弱になります。

文字列(ハッシュ)の安全な比較方法 – hash_equals

URL/URI別+有効期限付きのCSRF対策

HMACハッシュを利用すると、全てのURIに同じCSRFトークンを使う必要はありません。URI固有かつ有効期限付きのCSRFトークンをデータベース無しで利用可能です。

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

安全なAPIキーの送受信方法

HMACハッシュを利用すると、APIキーをそのまま使わずにAPIキーのバリデーションが可能です。

HMACを利用した安全なAPIキーの送受信

弱い鍵を強い鍵に変える方法

HMACハッシュを使うと弱い鍵から強い鍵を作ることが可能です。(ユーザー入力のパスワード、AES128用の鍵からAES256の鍵を作る、など)

ハッシュ(HMAC)を使って弱い鍵を強い鍵に変える方法

パスワード付きURL/URIを作る方法

HMACハッシュを使うとパスワード付き(+有効期限付き)のURLを作れます。

ハッシュ(HMAC)を使ってパスワード付きURL/URIを作る方法

有効期限付きURL/URIを作る方法

HMACハッシュを使うと有効期限付きのURLを作れます。Amazon S3のPre Signed URLも同じ仕組みです。

ハッシュ(HMAC)を使って有効期限付きURL/URIを作る方法

serialize()/unserialize()を安全に使う方法

HKDFやHMACを使うとunserialize()も安全に行えます。

PHPのserialize()/unserialize()を安全に利用する方法

関連 – パスワードのハッシュ化

HMACは弱いパスワードから強いパスワードを作れますが、ユーザーが入力したパスワードを保存する場合はHMACではなくhash_password()を使うべきです。

パスワードのハッシュ化

password_hash()の重要な制限

投稿者: yohgaki