Перейти к содержанию
CMSTOOLS.org - форум поддержки и развития CMS

Генерация случайного пароля с помощью PHP


timbios

Рекомендуемые сообщения

В этом уроке вы узнаете, как генерировать случайные пароли с помощью удобной функции PHP.

Всегда лучше использовать случайно сгенерированный пароль, а не ваше имя, день рождения, город и т. Д. В настоящее время большинство регистрационных форм требуют, чтобы вы вводили безопасный пароль и показывали предупреждающее сообщение, если пароль слишком простой. Если вы создаете систему регистрации для своего PHP-проекта, будет полезно предложить пароль людям, которые регистрируются. Используя PHP, довольно просто сгенерировать случайный пароль.

Используя функцию ниже, вы можете указать, какие символы должны содержать ваши пароли, какая длина пароля и сколько паролей вы хотите сгенерировать. Результатом будет массив с сгенерированными паролями.

<?php
 
function randomPassword($length,$count, $characters) {
 
// $length - длина сгенерированного пароля
// $count - количество генерируемых паролей
// $characters - типы символов, которые будут использоваться в пароле
 
// определяем переменные, используемые в функции
    $symbols = array();
    $passwords = array();
    $used_symbols = '';
    $pass = '';
 
// массив разных типов символов
    $symbols["lower_case"] = 'abcdefghijklmnopqrstuvwxyz';
    $symbols["upper_case"] = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $symbols["numbers"] = '1234567890';
    $symbols["special_symbols"] = '!?~@#-_+<>[]{}';
 
    $characters = split(",",$characters); // получитаем типы символов, которые будут использоваться для пароля
    foreach ($characters as $key=>$value) {
        $used_symbols .= $symbols[$value]; // строим строку со всеми символами
    }
    $symbols_length = strlen($used_symbols) - 1; //strlen начинается с 0, поэтому для получения количества символов вычитываем 1
     
    for ($p = 0; $p < $count; $p++) {
        $pass = '';
        for ($i = 0; $i < $length; $i++) {
            $n = rand(0, $symbols_length); // получить случайный символ из строки со всеми символами
            $pass .= $used_symbols[$n]; // добавляем символ в строку пароля
        }
        $passwords[] = $pass;
    }
     
    return $passwords; // возвращаем сгенерированный пароль
}
 
$my_passwords = randomPassword(10,1,"lower_case,upper_case,numbers,special_symbols");
 
print_r($my_passwords);
 
?>

Вот несколько примеров, как генерировать разные случайные пароли с помощью PHP

// создать один пароль, используя 5 символов верхнего и нижнего регистра
randomPassword(5,1,"lower_case,upper_case");
 
// создать три пароля, используя 10 строчных букв и цифр
randomPassword(10,3,"lower_case,numbers");
 
// создать пять паролей, используя 12 символов нижнего и верхнего регистра, цифры и специальные символы
randomPassword(12,5,"lower_case,upper_case,numbers,special_symbols");

Надеюсь, этот урок был полезен для вас! Удачи в ваших проектах!

  • Upvote 2
Ссылка на комментарий

Вот короче функция:

/**
 * Генератор паролей
 *
 * @param int $length - длина сгенерированного пароля
 * @param string $chars - символы, которые будут использоваться в пароле
 * @return string
 */
function generatePassword(int $length = 8, string $chars = '') {
    if (empty($chars))
        $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $count = mb_strlen($chars);

    $result = '';
    for ($i = 0; $i < $length; $i++) {
        $index = rand(0, $count - 1);
        $result .= mb_substr($chars, $index, 1);
    }

    return $result;
}

Захешировать пароль:

$hash = password_hash('123456', PASSWORD_DEFAULT);
echo $hash; // $2y$10$hqpo2yrbT.82aQkqFiRkie1Y09lhkijK5DtnoBQHDxEBWo/junDR6

Если хотите сгенерировать строку для имени файла или URL-адреса:

$permitted_chars = '0123456789abcdefghijklmnopqrstuvwxyz';
echo substr(str_shuffle($permitted_chars), 0, 10);// Output: 54esmdr0qf

 

Изменено пользователем Семен
  • Upvote 2
Ссылка на комментарий
  • 2 месяца спустя...
  • 2 года спустя...
В 15.08.2023 в 02:03, 6hr3d3r сказал:

А где проверка пароля? Проверка Хеша из БД.

 

Сравни строку со строкой как вариант.

А так используй например 

password_verify ( string $password , string $hash ) : bool

 

Ссылка на комментарий

Я попробовал по своему оптимизировать этот код:

В коде сделал хеширование паролей и проверку введенного пароля:

<?php

function generateRandomPassword($length, $characters) {
    $symbols = array(
        "lower_case" => 'abcdefghijklmnopqrstuvwxyz',
        "upper_case" => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        "numbers" => '1234567890',
        "special_symbols" => '!?~@#-_+<>[]{}'
    );

    $used_symbols = '';
    foreach (explode(",", $characters) as $value) {
        $used_symbols .= $symbols[$value];
    }

    $symbols_length = strlen($used_symbols) - 1;
    $password = '';

    for ($i = 0; $i < $length; $i++) {
        $n = rand(0, $symbols_length);
        $password .= $used_symbols[$n];
    }

    return $password;
}

function hashPassword($password) {
    return password_hash($password, PASSWORD_DEFAULT);
}

function verifyPassword($password, $hashedPassword) {
    return password_verify($password, $hashedPassword);
}

Примеры использования:

$newPassword = generateRandomPassword(10, "lower_case,upper_case,numbers,special_symbols");
$hashedPassword = hashPassword($newPassword);

$userInput = "пароль_пользователя";
$isPasswordValid = verifyPassword($userInput, $hashedPassword);

if ($isPasswordValid) {
    echo "Пароль правильный!";
} else {
    echo "Пароль неправильный.";
}

 

Изменено пользователем 6hr3d3r
Ссылка на комментарий
В 18.08.2023 в 17:50, 6hr3d3r сказал:

Я попробовал по своему оптимизировать этот код:

В коде сделал хеширование паролей и проверку введенного пароля:

<?php

function generateRandomPassword($length, $characters) {
    $symbols = array(
        "lower_case" => 'abcdefghijklmnopqrstuvwxyz',
        "upper_case" => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        "numbers" => '1234567890',
        "special_symbols" => '!?~@#-_+<>[]{}'
    );

    $used_symbols = '';
    foreach (explode(",", $characters) as $value) {
        $used_symbols .= $symbols[$value];
    }

    $symbols_length = strlen($used_symbols) - 1;
    $password = '';

    for ($i = 0; $i < $length; $i++) {
        $n = rand(0, $symbols_length);
        $password .= $used_symbols[$n];
    }

    return $password;
}

function hashPassword($password) {
    return password_hash($password, PASSWORD_DEFAULT);
}

function verifyPassword($password, $hashedPassword) {
    return password_verify($password, $hashedPassword);
}

Примеры использования:

$newPassword = generateRandomPassword(10, "lower_case,upper_case,numbers,special_symbols");
$hashedPassword = hashPassword($newPassword);

$userInput = "пароль_пользователя";
$isPasswordValid = verifyPassword($userInput, $hashedPassword);

if ($isPasswordValid) {
    echo "Пароль правильный!";
} else {
    echo "Пароль неправильный.";
}

 

Слишком много бесполезного кода.

Эту функцию можно сделать 2 строками когда.

1 Это создание Hash пароля.

2 Это валидация.  

Ссылка на комментарий
В 19.08.2023 в 21:13, KirKMS сказал:

Эту функцию можно сделать 2 строками когда.

1 Это создание Hash пароля.

2 Это валидация.  

Вот так? :
 

function createPasswordHash($password) {
    return password_hash($password, PASSWORD_DEFAULT);
}

function validatePassword($password, $hash) {
    return password_verify($password, $hash);
}

// Пример использования
$plainPassword = "mySecurePassword";
$hashedPassword = createPasswordHash($plainPassword);

if (validatePassword($plainPassword, $hashedPassword)) {
    echo "Пароль верен!";
} else {
    echo "Неправильный пароль.";
}


 

Изменено пользователем 6hr3d3r
Ссылка на комментарий
5 часов назад, 6hr3d3r сказал:

Вот так? :
 

function createPasswordHash($password) {
    return password_hash($password, PASSWORD_DEFAULT);
}

function validatePassword($password, $hash) {
    return password_verify($password, $hash);
}

// Пример использования
$plainPassword = "mySecurePassword";
$hashedPassword = createPasswordHash($plainPassword);

if (validatePassword($plainPassword, $hashedPassword)) {
    echo "Пароль верен!";
} else {
    echo "Неправильный пароль.";
}


 

 Сложу код в 1 или 2 строки за 100р.

Ссылка на комментарий
// Функция гениратор пароля
  function generatePassword($length = 6){
    
	$chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ23456789';
    
	$numChars = strlen($chars);
    
	$string = '';
    
	for ($i = 0; $i < $length; $i++) {
    
	$string .= substr($chars, rand(1, $numChars) - 1, 1);
  
  }
  
  return $string;

}

 

Изменено пользователем kphp
Ссылка на комментарий
В 26.08.2023 в 22:29, 6hr3d3r сказал:

Вот так? :
 

function createPasswordHash($password) {
    return password_hash($password, PASSWORD_DEFAULT);
}

function validatePassword($password, $hash) {
    return password_verify($password, $hash);
}

// Пример использования
$plainPassword = "mySecurePassword";
$hashedPassword = createPasswordHash($plainPassword);

if (validatePassword($plainPassword, $hashedPassword)) {
    echo "Пароль верен!";
} else {
    echo "Неправильный пароль.";
}


 

Какой смысл писать отдельную функцию для генерации пароля и его проверки? 

Ссылка на комментарий
19 часов назад, Семен сказал:

Еще короче:

$bytes = openssl_random_pseudo_bytes(4);
$pass = bin2hex($bytes);
echo $pass;

Результат примерно такой:

jenZq3lY

Сократи в 1 строку:

$pass = bin2hex(openssl_random_pseudo_bytes(4));
echo $pass;

Формат вывода:
 

4a8f1e2b

 

Ссылка на комментарий
×
×
  • Создать...