PHPでランダムなパスワードを生成する


190

私はphpでランダムなパスワードを生成しようとしています。

しかし、すべての 'a'を取得しており、戻り値の型は配列型であり、文字列にしたいと考えています。コードを修正する方法に関するアイデアはありますか?

ありがとう。

function randomPassword() {
    $alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
    for ($i = 0; $i < 8; $i++) {
        $n = rand(0, count($alphabet)-1);
        $pass[$i] = $alphabet[$n];
    }
    return $pass;
}

9
どの回答も、パスワードに必要な安全な乱数ジェネレータを使用していません。
Scott Arciszewski、2015

4
訪問者は、セキュリティ関連の可能性のある情報を適切に更新できるソースから取得する必要があります。新しい回答に結びついている質問ではありません。この重複に対する回答を削除して、訪問者が未解決の質問に対する回答を代わりに読むようにします。(この質問が再度開かれた場合、回答は削除されません。)
Jeremy Banks

6
@JeremyBanks 暗号で安全なパスワードが必要であるという質問はどこにもありません。一部の人々にとって/dev/random、質問は「安全な」パスワードを要求しないので、使用する回答で十分です(元の質問の意味が変わるため、このパスワードを含むように編集しないでください)。私は安全のために全員ですが、このカーペット爆弾は完全に熟考されていなかったと思います。を使用するmysql_*場合と同様に、回答は引き続き有効ですが、安全でないとマークする必要があります。おそらくこれは、SOが追加のソフトウェアとして含める必要があるものです- 安全でないコードを警告する機能?
神保

6
@JeremyBanksこの質問への回答を元に戻していただけませんか?それが重複しているからといって、答えが間違っているという意味ではありません(私が誤って再開することを投票したので、重複していることに同意します)。回答を削除しても意味がありません。代わりに、この質問を削除して、他の質問に回答を移行することを検討してください(以前に確認したことはあります)。
Naftali別名Neal 2015

7
@JeremyBanks何かを再度開かないようにする場合は、ロックします。それ以外の場合は、99%の人がそれを再び開いて、混乱を引き起こします。個人的に私は完全にちょうどそのよう非常に得点の回答を削除に反対するが、これを介して、あなたを戦うことができない
シャドウウィザードはあなたのための耳である

回答:


258

セキュリティ警告rand()暗号的に安全な疑似乱数ジェネレータではありません。PHPで暗号的に安全な疑似ランダム文字列生成するための別の場所を探してください。

これを試してください(文字列は常にであるため、のstrlen代わりに使用してください):countcount1

function randomPassword() {
    $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
    $pass = array(); //remember to declare $pass as an array
    $alphaLength = strlen($alphabet) - 1; //put the length -1 in cache
    for ($i = 0; $i < 8; $i++) {
        $n = rand(0, $alphaLength);
        $pass[] = $alphabet[$n];
    }
    return implode($pass); //turn the array into a string
}

デモ:http : //codepad.org/UL8k4aYK


24
より簡単に使用できるよう$pass .= $alphabet[$n]です。
マシュー

33
randを使用してパスワードを生成することは非常に悪い考えです。これは安全なPRNGではありません。(そして、どちらも良くはありません)mt_rand
CodesInChaos 2013年

19
問題はパスワードの生成についてです。パスワードを生成するコードは、安全な乱数を使用する必要があることは明らかです。
CodesInChaos 2013年

10
これがあるのと同じ理由でない質問は約あるので、重複した質問、この答えは、正しくないパスワードを生成していないランダムな文字列を。この答えは、パスワードを生成するための非常に安全でないアプローチを提供します。以下のopenssl_random_pseudo_bytes()代わりに使用される@ user3260409の回答を使用してくださいrand()
申し訳ありませんが、Im-a-N00b

35
安全でないコードが本番環境で見られたので、ソースで停止したいと思います。あなたはNEEDパスワードの暗号化された安全なランダム性を。
Scott Arciszewski、2015

120

TL; DR:

  • 以下の使用random_int()と指定random_str()
  • がない場合はrandom_int()random_compatを使用します

説明:

パスワードを生成しているので、生成するパスワードが予測不能であることを確認する必要があります。このプロパティが実装に存在することを確認する唯一の方法は、暗号で保護された疑似乱数ジェネレータ(CSPRNG)を使用することです。

CSPRNGの要件は、ランダム文字列の一般的なケースでは緩和できますが、セキュリティが関係している場合は緩和できません。

PHPでのパスワード生成に対する単純で安全な正しい答えは、RandomLibを使用し、ホイールを再発明しないことです。このライブラリは、業界のセキュリティ専門家と私自身によって監査されています。

独自のソリューションの開発を好む開発者のために、PHP 7.0.0はrandom_int()この目的を提供します。まだPHP 5.xを使用している場合は、PHP 7がリリースされる前に新しいAPIを使用できるように、PHP 5のポリフィルを作成しましrandom_int()た。私たちの使用random_int()ポリフィルことで、おそらく独自の実装を書くよりも安全。

安全なランダム整数ジェネレーターを使用すると、安全なランダム文字列の生成はパイよりも簡単です。

<?php
/**
 * Generate a random string, using a cryptographically secure 
 * pseudorandom number generator (random_int)
 * 
 * For PHP 7, random_int is a PHP core function
 * For PHP 5.x, depends on https://github.com/paragonie/random_compat
 * 
 * @param int $length      How many characters do we want?
 * @param string $keyspace A string of all possible characters
 *                         to select from
 * @return string
 */
function random_str(
    $length,
    $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
) {
    $str = '';
    $max = mb_strlen($keyspace, '8bit') - 1;
    if ($max < 1) {
        throw new Exception('$keyspace must be at least two characters long');
    }
    for ($i = 0; $i < $length; ++$i) {
        $str .= $keyspace[random_int(0, $max)];
    }
    return $str;
}

2
RandomLibは、2年以上更新されていません。最近のPHPビルド(私の場合は7.1.25)で使用すると、さまざまなmcrypt_*関数の非推奨警告がスローされます。@ircmaxellを保持できないためにライブラリフォークしたことを、問題のスレッドで確認できますが、フォークはTravisで「ビルド失敗」と表示します。この回答を更新してもよろしいですか(それでもGoogleでかなり高く表示されます)?
Janus Bahsジャケット

1
良いキャッチ!削除する必要があります。
Scott Arciszewski、

113

特定の方法でパスワードを生成しようとしていることはわかっていますが、この方法も確認したい場合があります...

$bytes = openssl_random_pseudo_bytes(2);

$pwd = bin2hex($bytes);

これはphp.netサイトから取得され、openssl_random_pseudo_bytes関数に入力した数値の2倍の長さの文字列を作成します。したがって、上記は4文字の長さのパスワードを作成します。

要するに...

$pwd = bin2hex(openssl_random_pseudo_bytes(4));

8文字の長さのパスワードを作成します。

ただし、パスワードには0〜9の数字と小文字のa〜fしか含まれていないことに注意してください。


13
大文字、小文字、数字のパスワードが必要な場合は、これを試してください:gist.github.com/zyphlar/7217f566fc83a9633959
willbradley

@زياد誰が言う?ジェネレーターが7ビットバイトを使用していた場合、私はあなたに同意しますopenssl_random_pseudo_bytes()が、強力なフルバイナリバイトランダム性ジェネレーターであり、それ以上のシャッフルは必要ありません。また、複数の暗号化方法をスタックするとランダムになると仮定するのは危険であると指摘する機会もあります。場合によっては、ハッシュの衝突が累積するため、実際にはまったく逆になることもあります。
Havenard

56

2行の小さなコード

デモ:http : //codepad.org/5rHMHwnH

function rand_string( $length ) {

    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    return substr(str_shuffle($chars),0,$length);

}

echo rand_string(8);

rand_stringを使用すると、作成する文字の量を定義できます。


21
この方法を使用しても文字が繰り返されることはありませんが、これは望ましくない場合があります。
Hobo

11
この関数は、長いパスワードを生成するのにはひどいものです。まず、$ lengthが$ chars文字列より長い場合、入力した長さの文字列ではなく、chars文字列の長さを受け取ります。また、重複のない各文字が1つだけ保証されます。また、要件であることが多い大文字または数字の使用を保証しません(もちろん、前のエラーにより長さが26を超えている場合を除く)
Programster

この@Programsterと@Hoboはどうですか?substr(str_shuffle(str_repeat($chars,$length)),0,$length);
シャルル・エドゥアール・コステ

@ Charles-EdouardCosteは問題なく動作するようです(特に、いくつかの特殊文字を投入した場合)。それでも、各文字タイプの少なくとも1つを保証するわけではありません。気になるのは、希望するパスワードの長さで文字セット全体を繰り返すことだけですが、これにより、生成されたパスワードの文字が一意である必要がなく、1回の使用でパフォーマンスに大きな影響を与えることがなくなります。
Programster

私は同意します。その行数でアルゴリズムを選択しない方が良いでしょう。ちなみに、主な目的がWebサイトで新しいユーザーを作成するときに一時的なパスワードを生成することだけであれば、これはニーズを満たすと思います。
シャルル・エドゥアール・コステ

40

PHP7を使用している場合は、次のrandom_int()関数を使用できます。

function generate_password($length = 20){
  $chars =  'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.
            '0123456789`-=~!@#$%^&*()_+,./<>?;:[]{}\|';

  $str = '';
  $max = strlen($chars) - 1;

  for ($i=0; $i < $length; $i++)
    $str .= $chars[random_int(0, $max)];

  return $str;
}

以下の古い答え:

function generate_password($length = 20){
  $chars =  'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.
            '0123456789`-=~!@#$%^&*()_+,./<>?;:[]{}\|';

  $str = '';
  $max = strlen($chars) - 1;

  for ($i=0; $i < $length; $i++)
    $str .= $chars[mt_rand(0, $max)];

  return $str;
}

12
mt_randパスワードの生成には使用しないでください。
CodesInChaos 2013年

2
@CodesInChaos上の例で使用しているrand()よりも優れています。PHPマニュアルによると、openssl_random_pseudo_bytes()が推奨されます。
willbradley、2014

4
@willbradleyシードの品質はと同じくらい悪いmt_randので、セキュリティ用途にはまだ適していません。
CodesInChaos 2015年

2
これが私を困らせるものです+ ChaosInCodes。あなたは質問を見ていません。あなたは、いくつかの一般的な発言を不十分な信念の負荷を繰り返したところです。簡単に言えば、まったく異なる質問に対する正しいアドバイスです。ランダムなパスワードで結構です。それらはおそらく「x」のみの使用です。正直に言うと、時間制限のロックアウトとDOS検出なしでシステムを設計していて、「xはその後->ロックされます」とすると、それは間違っています。このような対策を講じた状態でmt_randパスワードを推測することは不可能です。逆にmt_randを使用しても、パスワードをブルートフォースにするのは簡単ではありません。それはしません。
Heelis氏16

1
私は\を使用しません$chars
CONvid19

36

1行で:

substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789') , 0 , 10 )

11
これにより、同じ文字が再利用されるのを防ぐことができます。
nickdnk

8
言うまでもなく、行数に基づいてパスワード生成機能を最適化する必要はありません。これが使用したRNGが安全であったとしても(そうではありません)、10文字のパスワードを生成するときに文字の繰り返しを避けると、エントロピーの〜52ビットから〜50ビットのエントロピー(解読まで約4倍高速)になります。これを20文字に拡張した場合、繰り返しを行わないと、最大103ビットから最大94ビットに低下します(クラックの速度は最大512倍)。
Jeremy Banks

1
この方法は、エニグマコード Lolの欠陥を思い出します
悪意のある2015

4
substr(str_shuffle(str_repeat($chars,$length)),0,$length); エントロピーが復元
シャルル・エドゥアール・コステ

27

あなたの最善の策は、ircmaxellによるRandomLibライブラリです

使用例:

$factory = new RandomLib\Factory;
$generator = $factory->getGenerator(new SecurityLib\Strength(SecurityLib\Strength::MEDIUM));

$passwordLength = 8; // Or more
$randomPassword = $generator->generateString($passwordLength);

shuffle()and rand()(通常、パスワード、ソルト、キーなどの機密情報に必要なもの)のような通常のランダム性関数よりも強いランダムな文字列を生成します。


4
これが正解です。rand()またはを使用しないでくださいmt_rand()
Scott Arciszewski、2015

1
最も安全な答えかもしれませんが(との比較はわかりrandom_bytesません)、rand答えが間違っているわけではありません。
セルブルス2015


8
@Cerbrus:確かに、この回答はrand()間違った回答をするものではありません。それらはすべて自分で間違っています!
デデュプリケータ2015

14

定数ではstrlen($alphabet)なくcountが必要ですalphabet(と同等'alphabet')。

ただし、randはこの目的に適したランダム関数ではありません。現在の時刻が暗黙的にシードされるため、その出力は簡単に予測できます。さらに、rand暗号的に安全ではありません。したがって、出力から内部状態を判別するのは比較的簡単です。

代わりに、/dev/urandom暗号的にランダムなデータを取得するために読み取ります。


14

既存の回答のいくつかは近いですが、次のいずれかがあるため、回答を投稿します。

  • 総当たり攻撃が容易になるか、同じエントロピーに対してパスワードを長くする必要があるため、希望よりも小さい文字スペース
  • RNG暗号学的に安全とみなされていません
  • いくつかのサードパーティライブラリの要件であり、自分で実行するために何が必要かを示すのは興味深いかもしれないと思いました

count/strlen生成されたパスワードのセキュリティ、少なくともIMHOは、あなたがそこに到達する方法を超えているため、この回答は問題を回避します。また、PHPを5.3.0以上と想定します。

問題を構成要素に分解してみましょう。

  1. 安全な乱数発生源を使用してランダムデータを取得する
  2. そのデータを使用して、印刷可能な文字列として表現する

最初の部分では、PHP> 5.3.0が関数を提供しますopenssl_random_pseudo_bytes。ほとんどのシステムは暗号的に強力なアルゴリズムを使用していますが、ラッパーを使用するために確認する必要があることに注意してください。

/**
 * @param int $length
 */
function strong_random_bytes($length)
{
    $strong = false; // Flag for whether a strong algorithm was used
    $bytes = openssl_random_pseudo_bytes($length, $strong);

    if ( ! $strong)
    {
        // System did not use a cryptographically strong algorithm 
        throw new Exception('Strong algorithm not available for PRNG.');
    }        

    return $bytes;
}

2番目の部分base64_encodeでは、バイト文字列を受け取り、元の質問で指定されたものに非常に近いアルファベットを持つ一連の文字を生成するため、これを使用します。私たちが持っ気にしなかった場合+/および=文字が、最終的な文字列で表示され、我々は、少なくとも結果たい$n長い文字を、我々は単に使用できます。

base64_encode(strong_random_bytes(intval(ceil($n * 3 / 4))));

この3/4要因は、base64エンコーディングの結果、バイト文字列より少なくとも3分の1長い文字列が生成されるためです。$nそれ以外の場合は、結果は4の倍数で最大3文字長くなります。余分な文字は主にパディング文字=であるため、何らかの理由でパスワードが正確な長さであるという制約があった場合は、必要な長さに切り詰めることができます。これは特に、特定のについて$n、すべてのパスワードが同じ数で終わるため、結果のパスワードにアクセスできる攻撃者は、推測する文字が最大2文字少なくなるためです。


追加のクレジットとして、OPの質問のように正確な仕様を満たしたい場合は、もう少し作業を行う必要があります。ここでは、基本的な変換アプローチを省略し、すばやく簡単な方法を使用します。62エントリの長いアルファベットのため、どちらも結果で使用されるよりも多くのランダム性を生成する必要があります。

結果の余分な文字については、結果の文字列からそれらを単に破棄できます。バイト文字列が8バイトで始まる場合、base64文字の最大約25%がこれらの「望ましくない」文字になるため、これらの文字を単に破棄すると、OPが必要とするよりも短い文字列になります。次に、単純に切り捨てて、正確な長さにします。

$dirty_pass = base64_encode(strong_random_bytes(8)));
$pass = substr(str_replace(['/', '+', '='], ['', '', ''], $dirty_pass, 0, 8);

より長いパスワードを生成する場合=、PRNGに使用されるエントロピープールの排出が懸念される場合は、パディング文字が中間結果に占める割合がますます小さくなるため、より無駄のないアプローチを実装できます。


1
この追加をありがとう。既存の回答のいずれも、openssl_random_pseudo_bytes弱い結果をもたらす可能性があると指摘していません。それが事実だとは知りませんでした。
Jeremy Banks

12

base_convert(uniqid('pass', true), 10, 36);

例えば。 e0m6ngefmj4

編集

コメントで述べたように、長さはブルートフォース攻撃がタイミング攻撃よりも効果的であることを意味するため、「ランダムジェネレーターの安全性」を心配することはあまり関係ありません。特にこの使用例のセキュリティは、ユーザビリティを補完する必要があるため、上記のソリューションは実際に必要な問題に十分対応できます。

ただし、トークンを生成するなど、安全なランダム文字列ジェネレータを検索しているときに偶然見つけた場合(一部の人々は応答に基づいていると思います)は、そのようなコードのジェネレータは次のようになります。

function base64urlEncode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function secureId($length = 32) {

    if (function_exists('openssl_random_pseudo_bytes')) {
        $bytes = openssl_random_pseudo_bytes($length);
        return rtrim(strtr(base64_encode($bytes), '+/', '0a'), '=');
    }
    else { // fallback to system bytes

        error_log("Missing support for openssl_random_pseudo_bytes");

        $pr_bits = '';

        $fp = @fopen('/dev/urandom', 'rb');
        if ($fp !== false) {
            $pr_bits .= @fread($fp, $length);
            @fclose($fp);
        }

        if (strlen($pr_bits) < $length) {
            error_log('unable to read /dev/urandom');
            throw new \Exception('unable to read /dev/urandom');
        }

        return base64urlEncode($pr_bits);
    }
}

1
PS-これはPHPです。\を使用してグローバル名前空間を示します。
ボブ・グレゴール

ただし、uniqidは暗号的に安全ではありません。代わりにrand()を使用してください:base_convert(rand(78364164096、2821109907455)、10、36);
Benubird 2014

7
PHPマニュアルによると、@ Benubird rand()も暗号的に安全ではありません。マニュアルでは代わりにopenssl_random_pseudo_bytes()を推奨しています。
willbradley、2014

ほとんどのユースケース、特に攻撃者が正確な時刻にアクセスできない場合、これは完全に問題なく、人間にやさしい「一時的な」パスワードを生成します。これを極端にすると、ここでの長さは、乱数を生成するために使用された関数よりもはるかに厄介です。
srcspider 2015

興味のある方のために、完全に安全な文字列を生成する例を追加しました。ただし、ユーザーの一時パスワードを生成するときにこれを使用することはお勧めしません。安全なバージョンを使用しても、長さの問題は依然として当てはまります。
srcspider 2015

9

別のもの(Linuxのみ)

function randompassword()
{
    $fp = fopen ("/dev/urandom", 'r');
    if (!$fp) { die ("Can't access /dev/urandom to get random data. Aborting."); }
    $random = fread ($fp, 1024); # 1024 bytes should be enough
    fclose ($fp);
    return trim (base64_encode ( md5 ($random, true)), "=");
}

1
エントロピーの128ビット暗号化ハッシュに圧縮するために1024バイトを読み取るのは少し無駄です。また、fread()バッファはデフォルトで8192バイトにバッファリングされるため/dev/urandom、指定されたコードで常にその多くを読み取ることになります。これはWindowsでも機能しません。ただし、CSPRNGを使用することに対する称賛。
Scott Arciszewski、2015


7

この単純なコードを使用して、中程度の強力なパスワード12の長さを生成します

$password_string = '!@#$%*&abcdefghijklmnpqrstuwxyzABCDEFGHJKLMNPQRSTUWXYZ23456789';
$password = substr(str_shuffle($password_string), 0, 12);

これは実際に(非常に?)間違っています。実際には、アルファベットのすべての文字を1回だけ使用するため、可能なすべての値のスペースが大幅に縮小されます(クラッキングに関連)。
Radoslav Bodo

6

大文字、小文字、数字、特殊文字でこれを試してください

function generatePassword($_len) {

    $_alphaSmall = 'abcdefghijklmnopqrstuvwxyz';            // small letters
    $_alphaCaps  = strtoupper($_alphaSmall);                // CAPITAL LETTERS
    $_numerics   = '1234567890';                            // numerics
    $_specialChars = '`~!@#$%^&*()-_=+]}[{;:,<.>/?\'"\|';   // Special Characters

    $_container = $_alphaSmall.$_alphaCaps.$_numerics.$_specialChars;   // Contains all characters
    $password = '';         // will contain the desired pass

    for($i = 0; $i < $_len; $i++) {                                 // Loop till the length mentioned
        $_rand = rand(0, strlen($_container) - 1);                  // Get Randomized Length
        $password .= substr($_container, $_rand, 1);                // returns part of the string [ high tensile strength ;) ] 
    }

    return $password;       // Returns the generated Pass
}

10桁のパスが必要だとしましょう

echo generatePassword(10);  

出力例:

、IZCQ_IV \ 7

@wlqsfhT(d

1!8 + 1 \ 4 @ uD


このrand機能は実際には暗号で保護されていないため、この機能を使用してパスワードを生成するのはかなりリスクがある可能性があります
jeteon '17

3

クイックワン。シンプルでクリーンで一貫したフォーマットが必要な場合

$pw = chr(mt_rand(97,122)).mt_rand(0,9).chr(mt_rand(97,122)).mt_rand(10,99).chr(mt_rand(97,122)).mt_rand(100,999);

3

これはこのページの別の回答に基づいています https://stackoverflow.com/a/21498316/525649ます

この回答では、16進文字のみが生成され0-9,a-fます。16進数のように見えないものについては、これを試してください:

str_shuffle(
  rtrim(
    base64_encode(bin2hex(openssl_random_pseudo_bytes(5))),
    '='
  ). 
  strtoupper(bin2hex(openssl_random_pseudo_bytes(7))).
  bin2hex(openssl_random_pseudo_bytes(13))
)
  • base64_encode より広い範囲の英数字を返します
  • rtrim=最後に時々削除します

例:

  • 32eFVfGDg891Be5e7293e54z1D23110M3ZU3FMjb30Z9a740Ej0jz4
  • b280R72b48eOm77a25YCj093DE5d9549Gc73Jg8TdD9Z0Nj4b98760
  • 051b33654C0Eg201cfW0e6NA4b9614ze8D2FN49E12Y0zY557aUCb8
  • y67Q86ffd83G0z00M0Z152f7O2ADcY313gD7a774fc5FF069zdb5b7

これは、ユーザー用のインターフェースを作成するためにはあまり設定できませんが、いくつかの目的では問題ありません。特殊文字が不足していることを考慮して、文字数を増やしてください。


3
  1. このコードを含むファイルを作成します。
  2. コメントのようにそれを呼び出します。

    <?php 
    
    /**
    * @usage  :
    *       include_once($path . '/Password.php');
    *       $Password = new Password;
    *       $pwd = $Password->createPassword(10);
    *       return $pwd;
    * 
    */
    
    class Password {
    
        public function createPassword($length = 15) {
            $response = [];
            $response['pwd'] = $this->generate($length);
            $response['hashPwd'] = $this->hashPwd( $response['pwd'] );
            return $response;
        }
    
        private function generate($length = 15) {
            $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*(){}/?,><";
            return substr(str_shuffle($chars),0,$length);
        }
    
        private function hashPwd($pwd) {
            return hash('sha256', $pwd);
        }
    
    }
    
    ?>

2

より包括的で安全なパスワードスクリプトを作成しました。これにより、2つの大文字、2つの小文字、2つの数字、および2つの特殊文字の組み合わせが作成されます。合計8文字。

$char = [range('A','Z'),range('a','z'),range(0,9),['*','%','$','#','@','!','+','?','.']];
$pw = '';
for($a = 0; $a < count($char); $a++)
{
    $randomkeys = array_rand($char[$a], 2);
    $pw .= $char[$a][$randomkeys[0]].$char[$a][$randomkeys[1]];
}
$userPassword = str_shuffle($pw);

1
//define a function. It is only 3 lines!   
function generateRandomPassword($length = 5){
    $chars = "0123456789bcdfghjkmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ";
    return substr(str_shuffle($chars),0,$length);
}

//usage
echo generateRandomPassword(5); //random password legth: 5
echo generateRandomPassword(6); //random password legth: 6
echo generateRandomPassword(7); //random password legth: 7

これは実際に(非常に?)間違っています。実際には、アルファベットのすべての文字を1回だけ使用するため、可能なすべての値のスペースが大幅に縮小されます(クラッキングに関連)。
Radoslav Bodo

0

少なくとも1つの小文字、1つの大文字、1つの数字、および1つの特殊文字を含む長さ8の強力なパスワードを生成します。コードの長さも変更できます。

function checkForCharacterCondition($string) {
    return (bool) preg_match('/(?=.*([A-Z]))(?=.*([a-z]))(?=.*([0-9]))(?=.*([~`\!@#\$%\^&\*\(\)_\{\}\[\]]))/', $string);
}

$j = 1;

function generate_pass() {
    global $j;
    $allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ~`!@#$%^&*()_{}[]';
    $pass = '';
    $length = 8;
    $max = mb_strlen($allowedCharacters, '8bit') - 1;
    for ($i = 0; $i < $length; ++$i) {
        $pass .= $allowedCharacters[random_int(0, $max)];
    }

    if (checkForCharacterCondition($pass)){
        return '<br><strong>Selected password: </strong>'.$pass;
    }else{
        echo 'Iteration '.$j.':  <strong>'.$pass.'</strong>  Rejected<br>';
        $j++;
        return generate_pass();
    }

}

echo generate_pass();

0

この関数は、パラメーターのルールに基づいてパスワードを生成します

function random_password( $length = 8, $characters = true, $numbers = true, $case_sensitive = true, $hash = true ) {

    $password = '';

    if($characters)
    {
        $charLength = $length;
        if($numbers) $charLength-=2;
        if($case_sensitive) $charLength-=2;
        if($hash) $charLength-=2;
        $chars = "abcdefghijklmnopqrstuvwxyz";
        $password.= substr( str_shuffle( $chars ), 0, $charLength );
    }

    if($numbers)
    {
        $numbersLength = $length;
        if($characters) $numbersLength-=2;
        if($case_sensitive) $numbersLength-=2;
        if($hash) $numbersLength-=2;
        $chars = "0123456789";
        $password.= substr( str_shuffle( $chars ), 0, $numbersLength );
    }

    if($case_sensitive)
    {
        $UpperCaseLength = $length;
        if($characters) $UpperCaseLength-=2;
        if($numbers) $UpperCaseLength-=2;
        if($hash) $UpperCaseLength-=2;
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        $password.= substr( str_shuffle( $chars ), 0, $UpperCaseLength );
    }

    if($hash)
    {
        $hashLength = $length;
        if($characters) $hashLength-=2;
        if($numbers) $hashLength-=2;
        if($case_sensitive) $hashLength-=2;
        $chars = "!@#$%^&*()_-=+;:,.?";
        $password.= substr( str_shuffle( $chars ), 0, $hashLength );
    }

    $password = str_shuffle( $password );
    return $password;
}

0

これがランダムなプレーンパスワード生成ヘルパーです。

パスワードに数字、大文字と小文字、および3つ以上の特殊文字が含まれていることを確認します。

パスワードの長さは11から30の間です。

function plainPassword(): string
{
    $numbers = array_rand(range(0, 9), rand(3, 9));
    $uppercase = array_rand(array_flip(range('A', 'Z')), rand(2, 8));
    $lowercase = array_rand(array_flip(range('a', 'z')), rand(3, 8));
    $special = array_rand(array_flip(['@', '#', '$', '!', '%', '*', '?', '&']), rand(3, 5));

    $password = array_merge(
        $numbers,
        $uppercase,
        $lowercase,
        $special
    );

    shuffle($password);

    return implode($password);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.