БлогNot. Генерируем безопасный пароль на PHP

Генерируем безопасный пароль на PHP

Многие ресурсы требуют от пользователя иметь "безопасный пароль", включающий в себя как латинские буквы в разных регистрах, так и цифры, да ещё и специальные символы. А программисту иногда требуется автоматизировать задачу генерации такого пароля. Ниже приводится очевидная функция для решения подобной задачи, при необходимости её легко модифицировать под свои нужды, пользуясь комментариями в исходнике.

Метод возвращает строку с паролем нужного вида, а его параметрами являются:

  • $l - длина пароля в символах, по умолчанию 8;
  • $c - количество больших букв в пароле, по умолчанию 0;
  • $n - количество цифр в пароле, по умолчанию 0;
  • $s - количество специальных символов в пароле, по умолчанию 0.

Количество маленьких букв, оставшихся в строке пароля, вычисляется как $l-($c+$n+$s). Вот полный листинг скрипта с функцией и её тестовым вызовом, пользовательская обработка ошибок в значениях параметров сделана удобным методом trigger_error.

<?php
function generatePassword ($l = 8, $c = 0, $n = 0, $s = 0) {
 define ('MIN_PASSWORD_LENGTH','6');
 define ('MAX_PASSWORD_LENGTH','21'); //максимальная и минимальная длины пароля
 //Пароль из $l символов, включая $c больших букв, $n цифр и $s спецсимволов
 //Количество маленьких букв будет равно $l-($c+$n+$s)
 $cnt = $c + $n + $s;
 if (!is_int($l) || !is_int($c) || !is_int($n) || !is_int($s)) {
  trigger_error ('Метод generatePassword: аргументы не являются натруальными числами', E_USER_WARNING);
  return false;
 }
 elseif ($l < MIN_PASSWORD_LENGTH || $l > MAX_PASSWORD_LENGTH || $c < 0 || $n < 0 || $s < 0) {
  trigger_error ('Метод generatePassword: недопустимые значения аргументов', E_USER_WARNING);
  return false;
 }
 elseif ($c > $l || $n > $l || $s > $l) {
  trigger_error
   ('Метод generatePassword: требуемое количество символов $c, $n или $s больше длины пароля', E_USER_WARNING);
  return false;
 }
 elseif ($cnt > $l) {
  trigger_error
   ('Метод generatePassword: требуемое общее количество символов $c+$n+$s больше длины пароля', E_USER_WARNING);
  return false;
 }
 $chars = "abcdefghijklmnopqrstuvwxyz"; //разрешённые маленькие буквы
 $caps = strtoupper($chars); //делаем строку больших букв
 $nums = "0123456789"; //разрешённые цифры
 $syms = "~!@#$%^&*-+?.,"; //разрешённые спец.символы
 $password = '';
 for ($i = 0; $i < $l; $i++) $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
 if ($cnt) {
  $base_chars = str_split ($password); //базовый пароль из символов пишем в массив
  $added_chars = array();
  for ($i = 0; $i < $c; $i++) array_push ($added_chars, substr($caps, mt_rand(0, strlen($caps) - 1), 1));
  for($i = 0; $i < $n; $i++) array_push ($added_chars, substr($nums, mt_rand(0, strlen($nums) - 1), 1));
  for($i = 0; $i < $s; $i++) array_push ($added_chars, substr($syms, mt_rand(0, strlen($syms) - 1), 1));
  $base_chars = array_slice ($base_chars, 0, $l - $cnt); //убираем лишние буквы
  $base_chars = array_merge ($base_chars, $added_chars); //добавляем вместо них другие символы
  shuffle ($base_chars); //перемешиваем массив
  $password = implode('', $base_chars); //превращаем обратно в строку
 }
 return $password;
}

echo generatePassword (12,1,2,1); //12 символов, из них 1 большая буква, 2 цифры и 1 спец.символ
?>

09.03.2017, 15:53 [3915 просмотров]


теги: random php алгоритм безопасность

К этой статье пока нет комментариев, Ваш будет первым