この度、セキュリティポリシーの高い
パスワードの自動生成が必要になり、
疑似乱数生成(PR)によりパスワードの生成をしようとしたころ、
安全な乱数でないと駄目です。とNGをもらった。
安全な乱数なんて量子コンピュータでもないと出来ないよ~~
とか、
エントロピーの無駄使いだ!!
とか言っても解決しないので、簡単な方向を模索してみる。
稼働サーバのPHPが5.4なので、当初randメソッドやmt_randメソッドを
SHA256で包括して、SEEDをハッシュ値で生成するから
疑似じゃないでしょ?で行こう思っていたが、
駄目っぽい雰囲気だったので、もう少し調べてみたところ、
PHP5.4でもライブラリを実装するとPHP7からの
CSPRNGである「random_int」メソッドが使えたので、オボエガキ。
ライブラリは、いつものGitHub様から取得
公式からもリンクされるという素晴らしさ!!
https://github.com/paragonie/random_compat
適宜配置
実際のソース
<?php
//ライブラリ読み込み
require_once "./php_lib/random.php";
// 利用可能な文字列の指定
$chars = 'ABCDEFGHIJLKMNOPQRSTUVWXYZ0123456789';
// 変数初期化
$passwd = '';
// ランダムに文字列を生成(12文字)
for ($i = 0; $i < 12; $i++) {
$passwd .= $chars[random_int(0, 35)];//$charsの文字数を修正時は、必ず揃え、35を修正する。
}
//無限ループ注意!! 数字のみ英大文字のみを許容しない
while ( (preg_match('/^[0-9]+$/', $passwd) || preg_match('/^[A-Z]+$/', $passwd)) ){
$passwd = '';//一旦 $passwd をまっさらにする
for ($i = 0; $i < 12; $i++) {
$passwd .= $chars[random_int(0, 35)];//条件充足までループ
}
}
//文字列表示
echo $passwd;
?>
こんな感じ
やっぱり、困ったら一人で頑張らないで、公式サイトのメソッドを見るべきだ
と感じた。
0 件のコメント:
コメントを投稿