12 способов для генерации пароля на PHP

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

Вариант 1.

/**
 * Generate password
 *
 * @param int $length
 * @return string
 */
function generatePassword001(int $length = 8): string
{
  $password = '';
  for ($i = 0; $i < $length; $i++) {
    $password .= chr(rand(32, 126));
  }
  return $password;
}

Вариант 2.

/**
 * Generate password
 *
 * @param int $length
 * @return string
 */
function generatePassword002(int $length = 8): string
{
  $password = '';
  $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  $limit = strlen($characters) - 1;
  for ($i = 0; $i < $length; $i++) {
    $password .= $characters[rand(0, $limit)];
  }
  return $password;
}

Вариант 3.

/**
 * Generate password
 *
 * @param int $length
 * @return string
 */
function generatePassword003(int $length = 8): string
{
  $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  $password = substr(str_shuffle($characters), 0, $length);
  return $password;
}

Вариант 4.

/**
 * Generate password
 *
 * @param int $length
 * @return string
 */
function generatePassword004(int $length = 8): string
{
  $password = openssl_random_pseudo_bytes(ceil($length * 0.67), $crypto_strong);
  $password = str_replace(['=', '/', '+'], '', base64_encode($password));
  $password = substr($password, 0, $length);
  return $password;
}

Вариант 5.

/**
 * Generate password
 *
 * @param int $length
 * @return string
 */
function generatePassword005(int $length = 8): string
{
  try {
    $password = str_replace(['=', '/', '+'], '', base64_encode(random_bytes($length)));
    $password = substr($password, 0, $length);
    return $password;
  } catch (Exception $e) {
    return $e->getMessage();
  }
}

Вариант 6.

/**
 * Generate password
 *
 * @param int $upper
 * @param int $lower
 * @param int $numeric
 * @param int $other
 * @return string
 */
function generatePassword006($upper = 2, $lower = 3, $numeric = 2, $other = 1): string
{
  $password = '';
  $passwordOrder = [];

  for ($i = 0; $i < $upper; $i++) {
    $passwordOrder[] = chr(rand(65, 90));
  }
  for ($i = 0; $i < $lower; $i++) {
    $passwordOrder[] = chr(rand(97, 122));
  }
  for ($i = 0; $i < $numeric; $i++) {
    $passwordOrder[] = chr(rand(48, 57));
  }
  for ($i = 0; $i < $other; $i++) {
    $passwordOrder[] = chr(rand(33, 47));
  }

  shuffle($passwordOrder);

  foreach ($passwordOrder as $char) {
    $password .= $char;
  }
  return $password;
}

Вариант 7.

/**
 * Generate password
 *
 * @param int    $length
 * @param string $availableSets
 * @return string
 */
function generatePassword007(int $length = 8, string $availableSets = 'luds'): string
{
  $symbols = [];
  $password = '';
  $str = '';

  if (strpos($availableSets, 'l') !== false) {
    $symbols[] = 'abcdefghjkmnpqrstuvwxyz';
  }

  if (strpos($availableSets, 'u') !== false) {
    $symbols[] = 'ABCDEFGHJKMNPQRSTUVWXYZ';
  }

  if (strpos($availableSets, 'd') !== false) {
    $symbols[] = '23456789';
  }

  if (strpos($availableSets, 's') !== false) {
    $symbols[] = '!@#$%&*?';
  }

  foreach ($symbols as $symbol) {
    $password .= $symbol[array_rand(str_split($symbol))];
    $str .= $symbol;
  }
  $str = str_split($str);

  for ($i = 0; $i < $length - count($symbols); $i++) {
    $password .= $str[array_rand($str)];
  }

  $password = str_shuffle($password);
  return $password;
}

Вариант 8.

/**
 * Generate password
 *
 * @param int $length
 * @return string
 */
function generatePassword008(int $length = 8): string
{
  $password = '';
  $possible = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  $i = 0;
  $lenPossible = strlen($possible) - 1;

  while ($i < $length) {
    $char = substr($possible, mt_rand(0, $lenPossible), 1);
    if (!strstr($password, $char)) {
      $password .= $char;
      $i++;
    }
  }
  return $password;
}

Вариант 9.

/**
 * Generate password
 *
 * @param int $length
 * @return string
 */
function generatePassword009(int $length = 8): string
{
  $password = substr(str_shuffle(strtolower(sha1(rand() . time() . 'here our salt'))), 0, $length);
  for ($i=0, $c = $length; $i < $c; $i++) {
    $password[$i] = rand(0, 100) > 50? strtoupper($password[$i]):$password[$i];
  }
  return $password;
}

Вариант 10.

/**
 * Generate password
 *
 * @param int $length
 * @return false|string
 * @throws Exception
 */
function generatePassword010(int $length = 8): string
{
  if (function_exists('random_bytes')) {
    try {
      $bytes = random_bytes(ceil($length / 2));
    } catch (Exception $e) {
      return $e->getMessage();
    }
  } elseif (function_exists('openssl_random_pseudo_bytes')) {
    $bytes = openssl_random_pseudo_bytes(ceil($length / 2));
  } else {
    throw new Exception("no cryptographically secure random function available");
  }
  $password = substr(bin2hex($bytes), 0, $length);
  for ($i=0, $c = $length; $i < $c; $i++) {
    $password[$i] = rand(0, 100) > 50? strtoupper($password[$i]):$password[$i];
  }
  return $password;
}

Вариант 11.

/**
 * Generate password
 *
 * @param int $numAlpha
 * @param int $numDigit
 * @param int $numNonAlpha
 * @return string
 */
function generatePassword011($numAlpha = 4, $numDigit = 2, $numNonAlpha = 2): string
{
  $listAlpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  $listDigits = '0123456789';
  $listNonAlpha = ',;:!?.$/*-+&@_+;./*&?$-!,';
  return str_shuffle(
    substr(str_shuffle($listAlpha), 0, $numAlpha) .
    substr(str_shuffle($listDigits), 0, $numDigit) .
    substr(str_shuffle($listNonAlpha), 0, $numNonAlpha)
  );
}
И еще один последний вариант генерации пароля от меня. Данный вариант похож на 7й, но с небольшими изменениями и добавлением еще вариантов с кириллицей.

Вариант 12.

/**
 * Generate password
 * -
 * @param int    $length
 * @param string $availableSets
 * @return string
 */
function generatePassword012(int $length = 8, string $availableSets = 'luds'): string
{
  $symbols = [];
  $password = $str = $oldIdx = '';

  $availableSets = str_split($availableSets);

  if (in_array('l', $availableSets)) { // Letters lower
    $symbols[] = 'abcdefghjkmnpqrstuvwxyz';
  }

  if (in_array('u', $availableSets)) { // Letters upper
    $symbols[] = 'ABCDEFGHJKMNPQRSTUVWXYZ';
  }

  if (in_array('d', $availableSets)) { // Digits
    $symbols[] = '23456789';
  }

  if (in_array('s', $availableSets)) { // Special symbols
    $symbols[] = '!@#$%&*?';
  }

  if (in_array(1, $availableSets)) { // Russian Letters lower
    $symbols[] = 'абвгдеёжзийклмнпрстуфхцчшщыэюяъь';
  }

  if (in_array(2, $availableSets)) { // Russian Letters lower
    $symbols[] = 'АБВГДЕЁЖЗИЙКЛМНПРСТУФХЦШЩЫЭЮЯЪЬ';
  }

  $symbols = implode('', $symbols);
  $symbols = preg_split('//u', $symbols, null, PREG_SPLIT_NO_EMPTY);
  
  for ($i=0; $i < $length; $i++) {

    do {
      $newIdx = array_rand($symbols);
    } while($newIdx == $oldIdx);

    $password .= $symbols[$newIdx];
    $oldIdx = $newIdx;
  }

  return $password;
}
Естественно, здесь перечислены не все возможные способы, а наиболее понравившиеся мне. Возможно, вы используете более интересные решения. Всегда готов выслушать все ваши комментарии. Спасибо и до новых встреч.

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: