PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPで数値のワンタイムパスワード(OTP)を生成するプログラムの書き方

Webアプリケーションにおいて、ワンタイムパスワード(OTP)は二段階認証や本人確認などで広く利用されています。この記事では、PHPを使って指定した桁数の数値のみで構成されたワンタイムパスワードを生成する方法を解説します。

基本的な実装例

以下のコードは、関数を定義して任意の桁数の数値OTPを生成するシンプルな例です。

<?php
function generate_otp($n) {
    // 使用する数字(0〜9)
    $gen = "1357902468";
    $res = "";
    // 指定された桁数分だけランダムに1文字ずつ抽出する
    for ($i = 1; $i <= $n; $i++) {
        $res .= substr($gen, (rand() % (strlen($gen))), 1);
    }
    return $res;
}
$num = 8;
print_r("生成されたワンタイムパスワード:");
print_r(generate_otp($num));
?>

出力結果

生成されたワンタイムパスワード:52471609

※乱数を使用しているため、実行するたびに異なる値が出力されます。

コードの仕組み

処理の流れは以下のとおりです。

1. 関数の定義: generate_otp 関数は引数として桁数 $n を受け取ります。この値が生成するパスワードの文字数になります。

2. 数字プールの用意: 変数 $gen には「0」から「9」までの数字が格納されており、ここからランダムに1文字ずつ取り出します。

3. ランダム抽出の繰り返し: forループで指定桁数分だけ反復処理を行い、rand() 関数と substr() 関数を組み合わせて数字プールからランダムに1文字を取得し、結果文字列 $res に連結していきます。

4. パスワードの表示: 桁数を指定して関数を呼び出すことで、数値のみのパスワードが生成され、コンソールに出力されます。

セキュリティを高める改良版

実際の認証用途では、予測可能性の低い乱数生成器を使うことが推奨されます。rand() の代わりに、暗号学的に安全な random_int() 関数を使用すると、より堅牢なOTPを生成できます。

<?php
function generate_secure_otp($length) {
    $otp = "";
    for ($i = 0; $i < $length; $i++) {
        $otp .= random_int(0, 9);
    }
    return $otp;
}

echo "セキュアなOTP:" . generate_secure_otp(6);
?>

random_int() はPHP 7以降で使用可能な関数で、CSPRNG(暗号学的に安全な乱数生成器)を利用するため、認証システムなどのセキュリティが重要な場面に適しています。

まとめ

PHPで数値のワンタイムパスワードを生成する基本は、「数字のプールから指定桁数分だけランダムに1文字ずつ取り出して連結する」というシンプルなロジックです。動作確認や学習目的なら rand() ベースの実装でも十分ですが、本番環境での認証用途には random_int() を使った安全な実装を採用しましょう。

  1. C言語で電気料金を計算するプログラムの作成方法

    この記事では、ユーザーが消費した電力量(単位数)をもとに電気料金を自動計算するC言語プログラムを紹介します。採用されているのは段階料金制で、消費電力量が増えるほど1単位あたりの単価も引き上げられる仕組みです。段階別の料金計算ロジック使用量が50未満の場合最低使用量帯では、基本料金25円に加えて、1単位あたり3.50円で計算します。if (units < 50){ amt = units * 3.50; unitcharg = 25; }使用量が50〜100の場合最初の50単位分は130円として固定し、超過分には1単位あたり4.25円を適用します。基本料金は35円です。el

  2. C言語で数値パターンを出力するプログラムの作り方

    プログラムの概要 このプログラムは、ユーザーから行数を入力してもらい、それに応じた数値パターンを画面に出力するものです。 例として、入力が「5行」の場合、次のようなパターンが出力されます。 1 6 2 10 7 3 13 11 8 4 15 14 12 9 5 一見複雑に見えるこのパターンにも、きちんとした規則性があります。各行の先頭の数値は「1、6、10、13、15」と増加幅が5→4→3→2と1ずつ減っていき、行の中でも右に進むほど差が大きくなる仕組みです。 アルゴリズム ・各行の末尾側から順にパターンを出力する ・まず各行の最後の列を確定させる ・2行目以降は後ろから2番目の列から出力を