ホームページ  >  記事  >  バックエンド開発  >  PHPでランダムなパスワードを生成する5つの方法

PHPでランダムなパスワードを生成する5つの方法

墨辰丷
墨辰丷オリジナル
2018-06-07 14:07:235526ブラウズ

この記事では主に PHP でランダムなパスワードを生成する 5 つの方法を紹介します。興味のある方はぜひ参考にしてください。

PHP を使用してアプリケーション (特に Web サイト プログラム) を開発すると、多くの場合、ランダムなパスワードを生成する必要があります。たとえば、ユーザーがランダムなパスワードを生成するように登録する場合、パスワードをリセットするためにランダムなパスワードも生成する必要があります。ランダムなパスワードは固定長の文字列です。ここでは、参考のためにランダムな文字列を生成するいくつかの方法を集めました。

方法 1:

1. 33 ~ 126 のランダムな整数 (35、

など) を生成します。 2. 35 を対応する ASCII に変換します。 35 などのコード文字は

# に対応します。 3. 上記の手順 1 と 2 を n 回繰り返して、n 桁のパスワードに接続します。

このアルゴリズムでは、主に 2 つの関数 mt_rand ( int $ min, int $max) 関数はランダムな整数を生成するために使用されます。$min – $max は ASCII コードの範囲で、ここでは 33 ~ 126 です。範囲は必要に応じて調整できます (たとえば、97 ~ 122 ビット)。 ASCII コード表では、a ~ z の英字に対応しています。詳細については、ASCII コード表を参照してください。chr (int $ascii) 関数は、対応する整数 $ascii を対応する文字に変換するために使用されます。

function create_password($pw_length = 8)
{
 $randpwd = '';
 for ($i = 0; $i < $pw_length; $i++) 
 {
  $randpwd .= chr(mt_rand(33, 126));
 }
 return $randpwd;
}

// この関数を呼び出し、長さパラメータを渡します $pw_length = 6

echo create_password(6);

メソッド 2:

1 a – z、A – Z、0 – 9、およびいくつかの特殊文字を含む文字列 $chars をプリセットします。

2. $chars 文字列内の文字をランダムに選択します

3. 繰り返します。 2 番目のステップを n 回実行して、長さ n

function generate_password( $length = 8 ) {
 // 密码字符集,可任意添加你需要的字符
 $chars = &#39;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|&#39;;

 $password = &#39;&#39;;
 for ( $i = 0; $i < $length; $i++ ) 
 {
  // 这里提供两种字符获取方式
  // 第一种是使用 substr 截取$chars中的任意一位字符;
  // 第二种是取字符数组 $chars 的任意元素
  // $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
  $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];
 }

 return $password;
}

のパスワードを取得します。方法 3:

1. a – z、A – を含む文字配列 $chars をプリセットします。 Z、0 – 9、およびいくつかの特殊文字

2. array_rand() を介して配列 $chars から $length 要素

をランダムに選択します。 3. キー名の配列 $keys を取得します。 、配列 $chars から文字を取得し、文字列を連結します。この方法の欠点は、同じ文字が繰り返し取得されないことです。

function make_password( $length = 8 )
{
 // 密码字符集,可任意添加你需要的字符
 $chars = array(&#39;a&#39;, &#39;b&#39;, &#39;c&#39;, &#39;d&#39;, &#39;e&#39;, &#39;f&#39;, &#39;g&#39;, &#39;h&#39;, 
 &#39;i&#39;, &#39;j&#39;, &#39;k&#39;, &#39;l&#39;,&#39;m&#39;, &#39;n&#39;, &#39;o&#39;, &#39;p&#39;, &#39;q&#39;, &#39;r&#39;, &#39;s&#39;, 
 &#39;t&#39;, &#39;u&#39;, &#39;v&#39;, &#39;w&#39;, &#39;x&#39;, &#39;y&#39;,&#39;z&#39;, &#39;A&#39;, &#39;B&#39;, &#39;C&#39;, &#39;D&#39;, 
 &#39;E&#39;, &#39;F&#39;, &#39;G&#39;, &#39;H&#39;, &#39;I&#39;, &#39;J&#39;, &#39;K&#39;, &#39;L&#39;,&#39;M&#39;, &#39;N&#39;, &#39;O&#39;, 
 &#39;P&#39;, &#39;Q&#39;, &#39;R&#39;, &#39;S&#39;, &#39;T&#39;, &#39;U&#39;, &#39;V&#39;, &#39;W&#39;, &#39;X&#39;, &#39;Y&#39;,&#39;Z&#39;, 
 &#39;0&#39;, &#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;, &#39;5&#39;, &#39;6&#39;, &#39;7&#39;, &#39;8&#39;, &#39;9&#39;, &#39;!&#39;, 
 &#39;@&#39;,&#39;#&#39;, &#39;$&#39;, &#39;%&#39;, &#39;^&#39;, &#39;&&#39;, &#39;*&#39;, &#39;(&#39;, &#39;)&#39;, &#39;-&#39;, &#39;_&#39;, 
 &#39;[&#39;, &#39;]&#39;, &#39;{&#39;, &#39;}&#39;, &#39;<&#39;, &#39;>&#39;, &#39;~&#39;, &#39;`&#39;, &#39;+&#39;, &#39;=&#39;, &#39;,&#39;, 
 &#39;.&#39;, &#39;;&#39;, &#39;:&#39;, &#39;/&#39;, &#39;?&#39;, &#39;|&#39;);
 // 在 $chars 中随机取 $length 个数组元素键名
 $keys = array_rand($chars, $length); 
 $password = &#39;&#39;;
 for($i = 0; $i < $length; $i++)
 {
  // 将 $length 个数组元素连接成字符串
  $password .= $chars[$keys[$i]];
 }
 return $password;
}

方法 4:

この方法は、この記事が Blue Ideal によって転載された後にネットユーザーによって提供された新しい方法です。アルゴリズムは単純で、コードは短いです。 md5() 関数の戻り値のため、生成されるパスワードには文字と数字のみが含まれますが、それでも良い方法であるためです。アルゴリズムのアイデア:

1. time() は現在の Unix タイムスタンプを取得します。

2. 最初のステップで取得したタイムスタンプを md5()

で暗号化します。 3. 結果暗号化の 2 番目のステップで、必要なパスワードを取得するために n ビットが傍受されます

function get_password( $length = 8 ) 
{
 $str = substr(md5(time()), 0, 6);
 return $str;
}

時間効率の比較

次の PHP コードを使用して、上記の 4 つのランダムを計算します。 6桁のパスワードを生成するパスワード生成機能の実行時間と、その時間効率を簡易比較しました。

<?php
function getmicrotime()
{
 list($usec, $sec) = explode(" ",microtime());
 return ((float)$usec + (float)$sec);
}
// 记录开始时间
$time_start = getmicrotime();
// 这里放要执行的PHP代码,如:
// echo create_password(6);
// 记录结束时间
$time_end = getmicrotime();
$time = $time_end - $time_start;
 // 输出运行总时间 
echo "执行时间 $time seconds";
?>

方法 5:

function rand_string($len = 16, $keyword = &#39;&#39;) {
 if (strlen($keyword) > $len) {//关键字不能比总长度长
  return false;
 }
 $str = &#39;&#39;;
 $chars = &#39;abcdefghijkmnpqrstuvwxyz23456789ABCDEFGHIJKMNPQRSTUVWXYZ&#39;; //去掉1跟字母l防混淆   
 if ($len > strlen($chars)) {//位数过长重复字符串一定次数
  $chars = str_repeat($chars, ceil($len / strlen($chars)));
 }
 $chars = str_shuffle($chars); //打乱字符串
 $str = substr($chars, 0, $len);
 if (!empty($keyword)) {
  $start = $len - strlen($keyword);
  $str = substr_replace($str, $keyword, mt_rand(0, $start), strlen($keyword)); //从随机位置插入关键字
 }
 return $str;
}

echo rand_string(16,"ab"); //output example:V8bNY6SmkeywordB
?>

最終結果は次のとおりです:

方法 1: 9.8943710327148E-5 秒

方法 2: 9.6797943115234E-5 秒

方法 3: 0.00017499923706055 秒

方法 4: 3.4093856811523E-5 秒

方法 1 の実行を確認できます。方法 2 の実行時間はほぼ同じですが、方法 4 の実行時間は最も短く、方法 3 の実行時間はわずかに長くなります。

要約: 以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。

関連する推奨事項:

PHP コールバック関数と匿名関数の詳細な解釈

PHP での memcache の使用法データベース

PHP データベース Redis の使用法と分析

以上がPHPでランダムなパスワードを生成する5つの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。