Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】sodium_crypto_pwhash_str_verify()関数の使い方

sodium_crypto_pwhash_str_verify関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

sodium_crypto_pwhash_str_verify関数は、ユーザーが入力した生のパスワード文字列が、あらかじめ安全にハッシュ化され保存されているパスワードハッシュ文字列と一致するかどうかを検証する関数です。

Webアプリケーションなどでユーザー認証を実装する際に、セキュリティ上、生のパスワードをデータベースに直接保存することは非常に危険です。そのため、パスワードはsodium_crypto_pwhash_str()のような関数を用いてハッシュ化され、そのハッシュ値のみが保存されます。

このsodium_crypto_pwhash_str_verify関数は、ユーザーがログイン時に入力したパスワードを受け取り、保存されているハッシュ値と比較することで、入力されたパスワードが正しいものかを判断します。具体的には、入力されたパスワードを内部で同じアルゴリズムとパラメータでハッシュ化し、その結果と保存されたハッシュ値を比較します。両者が一致すれば、関数はtrueを返し、認証成功を示します。一致しなければfalseを返し、認証失敗となります。

この機能により、万が一データベースが侵害された場合でも、攻撃者はハッシュ化されたパスワードしか入手できず、元のパスワードを容易に特定できないため、ユーザーのセキュリティが大幅に向上します。パスワードの安全な取り扱いにおいて不可欠な役割を果たす重要な関数です。

構文(syntax)

1sodium_crypto_pwhash_str_verify(string $hash, string $password): bool

引数(parameters)

string $hash, string $password

  • string $hash: 検証対象となる、ソルトとオプション情報を含むハッシュ化されたパスワード文字列
  • string $password: 検証する平文のパスワード文字列

戻り値(return)

bool

指定されたパスワードハッシュ文字列が、指定されたパスワードと一致するかどうかを示す真偽値を返します。一致する場合は true、一致しない場合は false を返します。

サンプルコード

PHP Sodiumでパスワード検証する

1<?php
2
3/**
4 * PHP Sodium拡張を使ったパスワードのハッシュ化と検証のデモンストレーション。
5 *
6 * sodium_crypto_pwhash_str_verify 関数は、事前にハッシュ化されたパスワードと
7 * 入力されたパスワードが一致するかどうかを安全に確認するために使用されます。
8 * この関数は、ウェブアプリケーションにおけるユーザー認証などで非常に重要です。
9 *
10 * @param string $plainPassword 検証する平文パスワード
11 * @return void
12 */
13function demonstratePasswordVerification(string $plainPassword): void
14{
15    echo "元の平文パスワード: " . $plainPassword . "\n\n";
16
17    // 1. パスワードのハッシュ化
18    // sodium_crypto_pwhash_str は、安全なパスワードハッシュを生成する関数です。
19    // PHPのSodium拡張は、高度な暗号化機能を提供し、パスワードの安全な保存に役立ちます。
20    // SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE と SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE は、
21    // ハッシュ計算の強度(時間とメモリ使用量)を指定し、セキュリティとパフォーマンスのバランスを取ります。
22    $hashedPassword = sodium_crypto_pwhash_str(
23        $plainPassword,
24        SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE, // 演算量 (セキュリティ強度)
25        SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE  // メモリ量 (セキュリティ強度)
26    );
27
28    echo "生成されたハッシュ: " . $hashedPassword . "\n\n";
29
30    // 2. 正しいパスワードで検証
31    // sodium_crypto_pwhash_str_verify は、与えられたハッシュと平文パスワードが一致するかを確認します。
32    // 一致すれば true、そうでなければ false を返します。
33    echo "--- 正しいパスワードで検証を試みます ---\n";
34    if (sodium_crypto_pwhash_str_verify($hashedPassword, $plainPassword)) {
35        echo "検証成功: パスワードは一致します。\n";
36    } else {
37        echo "検証失敗: パスワードは一致しません。\n";
38    }
39    echo "--------------------------------------\n\n";
40
41    // 3. 意図的に間違ったパスワードで検証
42    $wrongPassword = 'thisIsAWrongPassword';
43    echo "--- 間違ったパスワード ('{$wrongPassword}') で検証を試みます ---\n";
44    if (sodium_crypto_pwhash_str_verify($hashedPassword, $wrongPassword)) {
45        echo "検証成功 (誤): 間違ったパスワードで一致してしまいました。\n";
46    } else {
47        echo "検証失敗 (正): 間違ったパスワードは一致しませんでした。\n";
48    }
49    echo "--------------------------------------------------------\n";
50}
51
52// デモンストレーションを実行
53// ここでは 'mySecurePassword123!' をユーザーが入力したパスワードと仮定します。
54demonstratePasswordVerification('mySecurePassword123!');

PHPのSodium拡張は、高度な暗号化機能を提供するライブラリであり、ウェブアプリケーションにおけるパスワードの安全な取り扱いなどに利用されます。sodium_crypto_pwhash_str_verify関数は、このSodium拡張に含まれる関数の一つで、事前にハッシュ化されたパスワードと、ユーザーが入力した平文のパスワードが一致するかどうかを安全に検証するために使用されます。

最初の引数$hashには、データベースなどに保存されているハッシュ値(sodium_crypto_pwhash_str関数などで生成されたもの)を指定します。二番目の引数$passwordには、ユーザーが認証時に入力した平文のパスワードを指定します。戻り値はbool型で、ハッシュと平文パスワードが一致すればtrueを、一致しなければfalseを返します。

サンプルコードでは、まずmySecurePassword123!という平文パスワードをsodium_crypto_pwhash_str関数を用いてハッシュ化しています。これは、パスワードをそのまま保存せず、安全に比較できるようにするためのセキュリティ対策です。次に、生成されたハッシュ値と元の平文パスワードをsodium_crypto_pwhash_str_verify関数に渡し、パスワードが一致することを確認します。さらに、意図的に間違ったパスワードで検証を試み、その場合は不一致(false)となることを示しており、この関数がセキュリティ上正しく機能していることを確認できます。

この関数は、事前にハッシュ化されたパスワードとユーザーが入力したパスワードが一致するかを安全に検証するために使用します。利用にはPHPのSodium拡張がサーバーにインストールされ、有効になっている必要があります。

パスワードは決して平文で保存せず、必ずsodium_crypto_pwhash_strなどの安全な関数でハッシュ化してください。このハッシュ化関数は、ソルトを自動生成し、セキュリティ強度を調整するパラメータを含みます。サンプルコードのSODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE等は、セキュリティとパフォーマンスの適切なバランスを設定するためのものですので、本番環境ではシステムの要件に合わせて調整を検討してください。検証結果は真偽値で返されるため、その結果に基づいて正確に処理を分岐させてください。

PHP Sodiumでパスワード検証する

1<?php
2
3/**
4 * このスクリプトは、PHPのSodium拡張機能を用いてパスワードのハッシュ化と検証を行う例を示します。
5 * Sodiumは、現代的な暗号技術を提供するライブラリであり、セキュリティが重要なアプリケーションでパスワード管理に利用されます。
6 *
7 * この例では、特に以下の関数を使用します。
8 * - sodium_crypto_pwhash_str(): パスワードを強力なアルゴリズムでハッシュ化します。
9 * - sodium_crypto_pwhash_str_verify(): ハッシュ化されたパスワードとプレーンテキストのパスワードが一致するか検証します。
10 *
11 * 動作にはPHPのsodium拡張が有効になっている必要があります。
12 * php.iniで 'extension=sodium.so' を有効にするか、Sodiumをインストールしてください。
13 */
14
15function demonstratePasswordHashingAndVerification(): void
16{
17    // PHPのsodium拡張が有効になっているか確認します。
18    // 無効な場合、このスクリプトは動作しません。
19    if (!extension_loaded('sodium')) {
20        echo "エラー: PHPのsodium拡張がロードされていません。\n";
21        echo "php.iniで 'extension=sodium.so' を有効にするか、Sodiumをインストールしてください。\n";
22        return;
23    }
24
25    $password = 'MySecretPassword123!'; // ハッシュ化する元のパスワード
26    $incorrectPassword = 'WrongPassword456'; // 意図的に間違ったパスワード
27
28    echo "--- パスワードのハッシュ化と検証のデモンストレーション ---\n\n";
29
30    // 1. パスワードのハッシュ化
31    // sodium_crypto_pwhash_str() を使用して、安全にパスワードをハッシュ化します。
32    // 第2引数と第3引数は、ハッシュ化の処理コストとメモリ使用量を指定する定数です。
33    // これらはセキュリティとパフォーマンスのバランスを取るために重要です。
34    echo "元のパスワード: '{$password}'\n";
35    $hashedPassword = sodium_crypto_pwhash_str(
36        $password,
37        SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE, // 処理コストの目安(中程度)
38        SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE  // メモリ使用量の目安(中程度)
39    );
40
41    echo "ハッシュ化されたパスワード: '{$hashedPassword}'\n\n";
42
43    // 2. 正しいパスワードでの検証
44    // sodium_crypto_pwhash_str_verify() を使用して、ハッシュと元のパスワードが一致するか検証します。
45    // 第1引数にはハッシュ化されたパスワード、第2引数には検証したいプレーンテキストのパスワードを渡します。
46    echo "正しいパスワード ('{$password}') で検証中...\n";
47    if (sodium_crypto_pwhash_str_verify($hashedPassword, $password)) {
48        echo "検証成功: パスワードが一致しました。\n";
49    } else {
50        // このメッセージは、正しいパスワードで検証しているため通常表示されるべきではありません。
51        echo "検証失敗: パスワードが一致しませんでした。\n";
52    }
53    echo "\n";
54
55    // 3. 間違ったパスワードでの検証
56    // 意図的に間違ったパスワードで検証し、失敗するケースを確認します。
57    echo "間違ったパスワード ('{$incorrectPassword}') で検証中...\n";
58    if (sodium_crypto_pwhash_str_verify($hashedPassword, $incorrectPassword)) {
59        // このメッセージは、間違ったパスワードで検証しているため通常表示されるべきではありません。
60        echo "検証成功: パスワードが一致しました。\n";
61    } else {
62        echo "検証失敗: パスワードが一致しませんでした。\n";
63    }
64    echo "\n";
65}
66
67// 上記で定義した関数を実行します。
68demonstratePasswordHashingAndVerification();
69
70?>

sodium_crypto_pwhash_str_verify関数は、PHP 8のSodium拡張機能によって提供される、パスワードの検証を行うためのセキュリティ関数です。この関数は、事前にsodium_crypto_pwhash_strなどで生成されたハッシュ化されたパスワードと、ユーザーから入力されたプレーンテキストのパスワードが一致するかどうかを安全に確認する目的で使用されます。本関数を利用するには、PHP環境でsodium.so拡張機能が有効になっている必要があります。

引数として、第一引数$hashにはデータベースなどに保存されているハッシュ化されたパスワード文字列を、第二引数$passwordには検証したいプレーンテキストのパスワード文字列を指定します。戻り値はブール値(bool)で、提供されたパスワードがハッシュと一致すればtrueを、一致しなければfalseを返します。

サンプルコードでは、まず元のパスワードを安全にハッシュ化し、その後、このハッシュ値を用いて検証プロセスを実行しています。正しいパスワードで検証した場合はtrueが返されて「検証成功」と表示され、意図的に間違ったパスワードで検証を試みた場合はfalseが返されて「検証失敗」と表示される挙動を確認できます。これにより、システムのログイン認証などで、ユーザーが入力したパスワードの正当性をセキュアに判断することが可能になります。

本サンプルコードを利用する際は、まずPHPのsodium拡張機能が有効になっているか必ず確認してください。sodium_crypto_pwhash_str_verify関数は、sodium_crypto_pwhash_str関数で事前にハッシュ化されたパスワードと、入力されたパスワードが一致するかを検証するために使用します。ハッシュ化時に指定するSODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATESODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATEといった定数は、パスワードセキュリティの強度と処理性能を決定する非常に重要な要素です。これらの定数は安易に変更せず、セキュリティ要件とサーバー環境に合わせて適切な値を慎重に選択してください。実際のシステムでは、元のパスワードは保存せず、ハッシュ化されたパスワードのみを安全に管理することが、情報セキュリティの基本となります。

関連コンテンツ

関連IT用語

関連プログラミング言語