Как работают солевой аргумент и возвращаемое значение для функции crypt () PHP? - PullRequest
2 голосов
/ 24 августа 2011

Обычно, если у меня есть пароль, я бы использовал этот псевдокод:

$password = "this is the user's password";
/***/
$salt = GenerateSalt();
$hash = Hash($password);
$hash = Hash($hash . $salt);

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

Может кто-нибудь уточнить, как работает крипта?Мне все еще нужно добавить свою соль и перефразировать?В таком случае, я бы просто использовал фиксированную соль для крипты, а затем сгенерировал бы отдельную крипту для каждого пользователя?Или параметр crypt $salt позаботится об этом для меня?

Ответы [ 2 ]

5 голосов
/ 24 августа 2011

Выход crypt состоит из:

  • (опционально идентификатор алгоритма + коэффициент загрузки)
  • соль по используемому алгоритму
  • настоящий хэш

Когда вы передадите этот вывод "соль" обратно в crypt, он извлечет правильный алгоритм и соль и использует их для операции. Если упоминается только алгоритм, он использует его и генерирует случайную соль. В противном случае он выберет алгоритм по умолчанию и сгенерирует случайную соль. Часть hash в переданном параметре соли игнорируется.

Таким образом, вы можете просто сравнить свой сохраненный_хэш с криптой (пароль, сохраненный_хэш) - если он равен, вполне вероятно, что это был правильный пароль.

Вот объяснение псевдокода (в PHP-подобном синтаксисе), как работает crypt:

function crypt($password, $salt)
{
  if (substr($salt,0 1) == "_") {
     $count = substr($salt, 1, 4);
     $real_salt = substr($salt, 5, 4);
     return "_" . $count . $real_salt . crypt_ext_des($password, $count, $salt);
  }
  if(substr($salt, 0, 3) == "$1$") {
     list($ignored, $real_salt, $ignored) = explode("$", $salt);
     return "$1$" . $real_salt . "$" . crypt_md5($password, $real_salt);
  }
  if(substr($salt, 0, 4) == "$2a$") {
      $cost = substr($salt, 4, 2);
      $real_salt = substr($salt, 7, 22);
      return "$2a$" . $cost . "$" . $real_salt . crypt_brypt($password, $real_salt, $cost);
  }
  // ... SHA256 and SHA512 analogons

  // no match => STD_DES
  $real_salt = substr($salt, 0, 2);
  return $real_salt . crypt_std_des($password, $real_salt);
}

Затем отдельные функции crypt_xxx выполняют реальную работу, в зависимости от алгоритма. (На самом деле, генерация случайной соли в этом описании отсутствует. Это будет сделано, если $ real_salt пуст.)

0 голосов
/ 24 августа 2011

crypt - одностороннее хеширование, например, MD5

Используйте его, как указано в руководстве

<?php
$password = crypt('mypassword'); // let the salt be automatically generated

/* You should pass the entire results of crypt() as the salt for comparing a
   password, to avoid problems when different hashing algorithms are used. (As
   it says above, standard DES-based password hashing uses a 2-character salt,
   but MD5-based hashing uses 12.) */
if (crypt($user_input, $password) == $password) {
   echo "Password verified!";
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...