Generating a random password in php Generating a random password in php php php

Generating a random password in php


Security warning: rand() is not a cryptographically secure pseudorandom number generator. Look elsewhere for generating a cryptographically secure pseudorandom string in PHP.

Try this (use strlen instead of count, because count on a string is always 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}

Demo


TL;DR:

  • Use random_int() and the given random_str() below.
  • If you don't have random_int(), use random_compat.

Explanation:

Since you are generating a password, you need to ensure that the password you generate is unpredictable, and the only way to ensure this property is present in your implementation is to use a cryptographically secure pseudorandom number generator (CSPRNG).

The requirement for a CSPRNG can be relaxed for the general case of random strings, but not when security is involved.

The simple, secure, and correct answer to password generation in PHP is to use RandomLib and don't reinvent the wheel. This library has been audited by industry security experts, as well as myself.

For developers who prefer inventing your own solution, PHP 7.0.0 will provide random_int() for this purpose. If you're still on PHP 5.x, we wrote a PHP 5 polyfill for random_int() so you can use the new API before PHP 7 is released. Using our random_int() polyfill is probably safer than writing your own implementation.

With a secure random integer generator on hand, generating a secure random string is easier than 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;}


I know you are trying to generate your password in a specific way, but you might want to look at this method as well...

$bytes = openssl_random_pseudo_bytes(2);$pwd = bin2hex($bytes);

It's taken from the php.net site and it creates a string which is twice the length of the number you put in the openssl_random_pseudo_bytes function. So the above would create a password 4 characters long.

In short...

$pwd = bin2hex(openssl_random_pseudo_bytes(4));

Would create a password 8 characters long.

Note however that the password only contains numbers 0-9 and small cap letters a-f!