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() を使った安全な実装を採用しましょう。
-
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
-
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番目の列から出力を