【PHP8.x】sodium_crypto_pwhash関数の使い方

作成日: 更新日:

sodium_crypto_pwhash関数は、ユーザーのパスワードを安全にハッシュ化するために使用される関数です。パスワードをデータベースなどにそのまま保存することは、セキュリティ上の大きなリスクを伴います。この関数は、元のパスワードから復元できないハッシュ値を生成することで、万が一データベースが漏洩した場合でも、実際のパスワードが容易に推測・解析されることを防ぎます。

この関数は、現代のセキュリティ基準に合致した強力な鍵導出関数であるArgon2idアルゴリズムを利用しており、時間をかけて試行錯誤するブルートフォース攻撃や、一般的な単語リストを用いる辞書攻撃といったパスワード解析攻撃に対して、高い防御性能を発揮します。ハッシュ化を行う際には、元のパスワードの他に、パスワードごとに異なる「ソルト」と呼ばれる予測不可能なランダムな値と、計算の複雑さやメモリの使用量を調整する「操作制限値(opslimit)」および「メモリ制限値(memlimit)」を指定します。これにより、攻撃者が効率的にハッシュを計算することを困難にし、セキュリティ強度を高めます。

引数には、ハッシュ化したいパスワード、一意なソルト、計算量とメモリ使用量の制約、そして使用するハッシュアルゴリズム(通常はSODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13)を渡します。ソルトは必ず安全な方法で毎回異なる値を生成し、パスワードごとに異なるハッシュが生成されるようにすることが極めて重要です。opslimitmemlimitは、システムの性能とセキュリティのバランスを考慮して適切な値を設定する必要がありますが、PHPのSodium拡張には推奨される定数も用意されています。この関数は、生成されたパスワードのバイナリハッシュを返します。このバイナリハッシュは、そのままではデータベースへの保存に適さない場合があるため、保存する際には適切な形式に変換する必要があります。

基本的な使い方

構文(syntax)

1<?php
2$password = 'your_secret_password';
3$salt = random_bytes(SODIUM_CRYPTO_PWHASH_SALTBYTES); // SODIUM_CRYPTO_PWHASH_SALTBYTES (16バイト)
4$out_len = 32; // 生成するキーのバイト長 (例: 32バイト)
5$opslimit = SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE; // 処理速度の制限 (対話的な用途向け)
6$memlimit = SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE; // メモリ使用量の制限 (対話的な用途向け)
7$alg = SODIUM_CRYPTO_PWHASH_ALG_DEFAULT; // 使用するハッシュアルゴリズム (デフォルトはArgon2id)
8
9$derived_key = sodium_crypto_pwhash(
10    $out_len,
11    $password,
12    $salt,
13    $opslimit,
14    $memlimit,
15    $alg
16);

引数(parameters)

int $length, string $password, string $salt, int $opslimit, int $memlimit, int $algo = SODIUM_CRYPTO_PWHASH_ALG_DEFAULT

  • int $length: 生成するハッシュのバイト長を指定します。
  • string $password: ハッシュ化するパスワードを指定します。
  • string $salt: パスワードハッシュ化に使用するソルトを指定します。
  • int $opslimit: 処理の実行回数制限を指定します。
  • int $memlimit: 使用するメモリの制限をバイト単位で指定します。
  • int $algo = SODIUM_CRYPTO_PWHASH_ALG_DEFAULT: 使用するアルゴリズムを指定します。デフォルトは SODIUM_CRYPTO_PWHASH_ALG_DEFAULT です。

戻り値(return)

string

指定されたパスワードハッシュアルゴリズムを用いて、パスワードを安全なハッシュ値に変換した文字列を返します。

【PHP8.x】sodium_crypto_pwhash関数の使い方 | いっしー@Webエンジニア