0

アプリのランダムパスワード(0-9a-zA-Z のみ)PHPを生成する関数を記述しました。結果として得られるパスワードは、暗号で保護され、可能な限りランダムでなければなりません。つまり、パスワードは重要です。

私がやっている大きなトリックは$possible毎回キャラクターをシャッフルmt_rand()することです。

機能に推奨される変更やセキュリティの問題はありますか? openssl_random_pseudo_bytes()代わりに使用mt_rand()すると、アルゴリズムがより強力で安全になりますか?

    public function generate_random($length = 15) {
        $random = "";
        $possible = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        $possible = str_shuffle($possible);

        $maxlength = strlen($possible);

        if ($length > $maxlength) {
            $length = $maxlength;
        }

        $i = 0;

        while ($i < $length) {
            $random .= substr($possible, mt_rand(0, $maxlength-1), 1);
            $i++;
        }

        return $random;
    }

ありがとう。

4

4 に答える 4

2

本当にランダムなものを生成するには、オペレーティング システムのランダム ソースを使用する必要があります。このソースから読み取った後、バイトを選択したアルファベットにエンコードする必要があります。

簡単な変換は base64 エンコーディングですが、これには「+」および「/」文字が含まれます。アルファベットと数字からのみ文字を取得するには、base62 エンコーディングが必要です。または、それらの文字を他の文字に置き換えるだけでもかまいません。

/**
 * Generates a random string of a given length, using the random source of
 * the operating system. The string contains only characters of this
 * alphabet: +/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
 * @param int $length Number of characters the string should have.
 * @return string A random base64 encoded string.
 */
function generateRandomBase64String($length)
{
  if (!defined('MCRYPT_DEV_URANDOM')) die('The MCRYPT_DEV_URANDOM source is required (PHP 5.3).');

  // Generate random bytes, using the operating system's random source.
  // Since PHP 5.3 this also uses the random source on a Windows server.
  // Unlike /dev/random, the /dev/urandom does not block the server, if
  // there is not enough entropy available.
  $binaryLength = (int)($length * 3 / 4 + 1);
  $randomBinaryString = mcrypt_create_iv($binaryLength, MCRYPT_DEV_URANDOM);
  $randomBase64String = base64_encode($randomBinaryString);
  return substr($randomBase64String, 0, $length);
}

コードはこのクラスgenerateRandomBase62String()の一部です。完全な例については、関数を参照してください。

于 2013-06-20T08:14:18.640 に答える
0

これはあなたの質問への回答ではありませんが、この関数を使用して、(0-9a-z,AZ) のみを含むランダムなパスワードを生成することは可能だと思われます。

$password = base64_encode(openssl_random_pseudo_bytes(20, $strong));
$newstr = preg_replace('/[^a-zA-Z0-9\']/', '', $password);
echo $newstr;
于 2013-06-20T04:45:38.300 に答える