在PHP中生成随机密码


190

我正在尝试在php中生成一个随机密码。

但是我得到所有的'a's,返回类型是数组类型,我希望它是一个字符串。有关如何更正代码的任何想法?

谢谢。

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

4
访客应该从可以适当更新的来源获取与安全相关的信息,而不是与新答案无关的问题。我正在删除此重复项的答案,以便访问者改为阅读未解决问题的答案。(如果这个问题再次被提出,答案将不会被删除。)
Jeremy Banks

6
@JeremyBanks问题在任何地方都没有要求密码安全的密码。对于某些人来说,使用的答案/dev/random就足够了,因为该问题不需要输入“ 安全 ”密码(并且不应对其进行编辑以包含该密码,因为这会改变原始问题的含义)。尽管我全都出于安全考虑,但我认为这种地毯式炸弹并未得到充分考虑。与一样mysql_*,答案仍然有效,但应将其标记为不安全。也许这是SO需要作为额外软件包含的东西- 警告不安全代码的能力?
Jimbo

6
@JeremyBanks能否请您恢复该问题的答案?仅仅因为它是重复的,并不意味着答案是错误的(我不小心投票决定要重新打开,我同意它是重复的)。删除答案没有任何意义,可以考虑删除该问题并将答案迁移到另一个问题(我之前已经看过)。
Naftali又名Neal,

7
@JeremyBanks如果您不想重新打开某些东西,请将其锁定。否则,有99%的人会重新打开它并造成混乱。我个人完全不同意这样删除高分答案,但不能为此与您抗争
Shadow Wizard is Ear For You

Answers:


258

安全警告rand()不是加密安全的伪随机数生成器。寻找其他地方以在PHP中生成加密安全的伪随机字符串

尝试以下操作(使用strlen代替count,因为count在字符串上始终是1):

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

10
出于同样的原因,因为它不是重复的问题,所以该答案是错误的,因为该问题与生成密码有关,不是随机字符串有关。此答案提供了一种非常不安全的密码生成方法。请在下面使用@ user3260409的答案,openssl_random_pseudo_bytes()而不是在哪里使用rand()
Sorry-Im-a-

35
我已经在生产中看到了您的不安全代码并希望从源头上停止它。您需要密码安全的密码随机性。
Scott Arciszewski

121

TL; DR:

  • 使用方法random_int()random_str()下面给出的。
  • 如果没有random_int(),请使用random_compat

说明:

由于正在生成密码,因此需要确保生成的密码不可预测,并且确保实现中存在此属性的唯一方法是使用加密安全的伪随机数生成器(CSPRNG)。

对于随机字符串的一般情况,可以放宽对CSPRNG的要求,但在涉及安全性时则不能。

在PHP中生成密码的简单,安全且正确的答案是使用RandomLib,而不是费力地。该库已经过行业安全专家和我的审核。

对于喜欢发明自己的解决方案的开发人员,PHP 7.0.0将random_int()为此目的提供。如果您仍在使用PHP 5.x,我们将为其random_int()编写PHP 5 polyfill,以便您可以在发布PHP 7之前使用新的API。使用我们的random_int()polyfill 可能比编写自己的实现更安全。

有了安全的随机整数生成器,生成安全的随机字符串要比pie容易:

<?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尚未更新超过两年。在最近的PHP构建中使用它(在我的例子中为7.1.25)会抛出各种mcrypt_*功能的弃用警告。我可以在一个问题线程上看到由于无法获取@ircmaxell而使您分叉了库,但是您的叉子在Travis上说“构建失败”。您是否愿意更新此答案(在Google上仍然显示很高的答案)?
贾努斯·巴斯

1
接得好!需要将其删除。
Scott Arciszewski

113

我知道您正在尝试以特定的方式生成密码,但是您可能也想看看这种方法...

$bytes = openssl_random_pseudo_bytes(2);

$pwd = bin2hex($bytes);

它取自php.net网站,它创建的字符串长度是您在openssl_random_pseudo_bytes函数中输入的数字长度的两倍。因此,以上将创建一个4个字符长的密码。

简而言之...

$pwd = bin2hex(openssl_random_pseudo_bytes(4));

将创建一个8个字符长的密码。

但是请注意,密码仅包含数字0-9和小写字母af!


13
如果您想要使用大写,小写和数字密码,请尝试以下操作:gist.github.com/zyphlar/7217f566fc83a9633959
willbradley 2014年

@زياد说谁?如果生成器使用的是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 2012年

11
此功能对于生成长密码非常糟糕。首先,如果$ length大于$ chars字符串,那么将不会收到与输入长度相同的字符串,而是chars字符串的长度。同样,保证每个字符只有1个,没有重复。它也不保证使用大写字母或数字(这是经常需要的)(当然,如果由于先前的错误而导致您的长度超过26)(当然除外)
Programster

那@Programster和@Hobo呢?substr(str_shuffle(str_repeat($chars,$length)),0,$length);
查尔斯-爱德华·考斯特

@ Charles-EdouardCoste似乎可以正常工作(特别是如果您放入一些特殊字符)。尽管仍然不能保证每种字符类型中至少有一种。唯一令我困扰的是,重复整个字符集所需的密码长度,但是这可以确保生成的密码中的字符不必是唯一的,并且一次使用不会对性能产生明显的影响。
Programster

我同意。最好不要在行数上选择一种算法。顺便说一句,我想,如果主要目标只是在网站上创建新用户时生成一个临时密码,这将满足需求。
查尔斯-爱德华·考斯特

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

2
您会看到这++ ChaosInCodes惹恼了我。您还没有看过这个问题,只是做了一些通用的陈述,这些陈述重复了人们持之以恒的信念。简而言之:针对完全不同的问题提供正确的建议。随机密码也可以。它们可能仅是“ x”使用。老实说,如果您在设计系统时没有定时锁定和DOS检测并且“先尝试x次->锁定”,那么您做错了。采用这样的措施,不可能猜测mt_rand密码。相反,使用mt_rand不会使暴力破解密码更加容易。只是不会。
Heelis先生

1
我不会使用\ in$chars
CONvid19'9

36

一行:

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

11
这样可以防止重复使用相同的字母,因为它们只是随机播放,而不会出现多次。
nickdnk

8
不用说,没有人应该基于行数优化其密码生成功能。即使使用的RNG是安全的(不是),在生成10个字符的密码时避免重复字符也会使您从〜52位的熵降到〜50位的熵(破解速度提高了约4倍)。如果将其扩展为20个字符,则非重复操作会将您从〜103位降低到〜94位(破解速度提高了512倍)。
杰里米·班克斯

1
这种方法让我想起了
Enol

4
substr(str_shuffle(str_repeat($chars,$length)),0,$length); 熵恢复
查尔斯-爱德华·考斯特

27

最好的选择是ircmaxellRandomLib库

用法示例:

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

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

它产生的字符串比诸如shuffle()和的正常随机性函数具有更强的随机性rand()(这是您通常希望获得的敏感信息,如密码,盐和密钥)。


4
这是正确的答案。不要使用rand()mt_rand()
Scott Arciszewski

1
这可能是最安全的答案(不确定如何与进行比较random_bytes),但这不会使rand答案不正确。
Cerbrus 2015年


8
@Cerbrus:确保此答案不会使用rand()不正确的答案。他们自己是不正确的!
Deduplicator 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;
}

对于第二部分,我们将使用base64_encode它,因为它需要一个字节字符串,并将产生一系列字符,这些字符的字母非常接近原始问题中指定的字母。如果我们不介意使用+/并且=字符出现在最后的字符串中,并且我们希望结果至少包含$n字符,那么我们可以简单地使用:

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

3/4因素是由于这样的事实:base64编码在具有长度比字节串的至少三分之一大的字符串结果。结果将精确为$n4的倍数,否则最多3个字符。由于多余的字符主要是填充字符=,如果由于某种原因我们限制了密码的长度,则可以将其截短为所需的长度。尤其是因为对于给定的$n密码,所有密码都将以相同的密码结尾,这样,有权使用结果密码的攻击者最多可以少猜两个字符。


为了获得额外的荣誉,如果我们想满足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会产生较弱的结果。我没有意识到那是事实。
杰里米·班克斯

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-仅使用\表示全局名称空间。
Bob Gregor

唯一的区别在于密码安全。使用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
读取1024字节以压缩为熵的128位加密哈希是有点浪费的。另外,fread()默认情况下缓冲区最大为8192字节,因此您总是要/dev/urandom使用给定的代码读取其中的很多字节。这在Windows上也不起作用。不过,使用CSPRNG的荣誉。
Scott Arciszewski

9

更聪明一点:

function strand($length){
  if($length > 0)
    return chr(rand(33, 126)) . strand($length - 1);
}

在这里检查。


7

使用此简单代码生成中等强度密码12长度

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

这实际上是(非常吗?)错误。实际上,它只使用字母表中的每个字符一次,因此严重缩小了所有可能值的空间(与破解有关)。
拉多斯拉夫·博多

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


3

这是基于此页面上的另一个答案的, https://stackoverflow.com/a/21498316/525649

该答案仅生成十六进制字符0-9,a-f。对于看起来不像十六进制的内容,请尝试以下操作:

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

我创建了一个更全面和安全的密码脚本。这将创建两个大写字母,两个小写字母,两个数字和两个特殊字符的组合。总共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

这实际上是(非常吗?)错误。实际上,它只使用字母表中的每个字符一次,因此严重缩小了所有可能值的空间(与破解有关)。
拉多斯拉夫·博多

0

生成长度为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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.