Алгоритм хеширования паролей - PullRequest
1 голос
/ 22 июля 2011

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

hash('sha512', crypt(hash('whirlpool', $password.$username), base64_encode(md5(strlen($password)))))

Ответы [ 5 ]

3 голосов
/ 22 июля 2011

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

3 голосов
/ 22 июля 2011

Не смешивайте более одного хэша, каждый оптимизирован для лучшей работы сам по себе.

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

Если вы храните хеш в базе данных, вы также можете улучшить его, добавив динамическую случайную строку перед использованием алгоритма хеширования. Затем для каждого посещения будет генерироваться новый хэш.

1 голос
/ 22 июля 2011

Вот класс, который я создал для хранения комбинаций идентификатора и пароля для API, с которым я интегрируюсь.Каждый пользователь может иметь свои уникальные учетные данные.Я не советую хранить данные кредитной карты на компьютере, не поддерживающем PCI.

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

Ключ находится вне публичного каталога, который переходит к другой теме защиты вашегокоробка.

<?php
// This is on my index page but added here so you see all constants.
define('DIR', dirname(__FILE__) . '/');


class locker {
  private $algorithm = MCRYPT_RIJNDAEL_256;
  private $key;
  private $mode = MCRYPT_MODE_CBC;
  public $iv;  // Public so we can change to the one used to encrypt it.

  public function __construct()
  {
    // Lets include our key
    // The key is located Outside of the public directory.
    $this->key = file_get_contents(DIR .'../keys/passphrase.key');
    // Create the initialization vector for added security.
    $this->iv = mcrypt_create_iv(mcrypt_get_iv_size($this->algorithm, MCRYPT_MODE_ECB), MCRYPT_RAND);
  }

  public function encrypt($string)
  {
    return base64_encode(mcrypt_encrypt($this->algorithm, $this->key, base64_encode($string), $this->mode, $this->iv));
  }

  public function decrypt($string)
  {
    return base64_decode(mcrypt_decrypt($this->algorithm, $this->key, base64_decode($string), $this->mode, $this->iv));
  }

  // Helper functions so you can see what you can do on your own box.
  public function list_modes()
  {
    print_r(mcrypt_list_modes());
  }

  public function list_algorithms()
  {
    print_r(mcrpt_list_algorithms());
  }
}
?>

<?php
//Example usage
$locker = new locker;
$pass = $locker->encrypt('passwordvalue');
$iv = $locker->iv;

// Decrypt it
$locker = new locker;
$locker->iv = $iv;
$pass = $locker->decrypt($pass);
?>
0 голосов
/ 19 июня 2012

попробуйте этот (очень простой в использовании) класс, который я написал, который включает автоматическое определение алгоритма, чтобы получить наиболее безопасный алгоритм, поддерживаемый вашим сервером: http://netentwicklung.wordpress.com/2012/06/17/87/

0 голосов
/ 22 июля 2011

Если хочешь чего-то сильного.Вы должны - никогда не сохранять пароль, но хеш (не нужно так много), чтобы избежать взлома паролем.

  • и никогда не спрашивать пароль, но для хэша хэша pasword + соль (например, дата), чтобы избежать атаки воспроизведения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...