Intereting Posts
Как использовать bind_result () вместо get_result () в php php.ini не существует. Загруженный файл конфигурации (нет) Пользовательское мобильное меню в Drupal 7 не может получить доступ к дочерним ссылкам gform_after_submission Сообщение для стороннего API Могу ли я создать функцию PHP, которую я могу вызвать без круглых скобок? могу ли я получить значение unicode символа или наоборот с php? WordPress, nginx proxy и подкаталог: wp-login.php перенаправляет в домен Как «сгладить» многомерный массив до простого в PHP? Использование PHP и MySQL для заполнения раскрывающегося списка Проблемы с вставкой данных с использованием «безопасного способа ввода данных в mysql с помощью PHP» cakephp загрузить png файл Как объединить запросы для нескольких файлов javascript в один HTTP-запрос? Загрузите файл с помощью ajax-вызова PHP лучший способ проверить, является ли строка пустой или нет Как найти mime-тип файла с php?

Нужно ли мне base64 кодировать мою соль (для хэширования паролей)?

Извините меня за этот очень странный вопрос. Я понимаю цель кодирования base64 для передачи данных (например, кодирование Base64 MIME), но я не знаю, нужно ли мне кодировать base64 на основе base64.

Я написал класс утилиты (базовый абстрактный класс):

use Symfony\Component\Security\Core\Encoder\BasePasswordEncoder; abstract class AbstractCryptPasswordEncoder extends BasePasswordEncoder { /** * @return string */ protected abstract function getSaltPrefix(); /** * @return string */ protected abstract function getSalt(); /** * {@inheritdoc} */ public function encodePassword($raw, $salt = null) { return crypt($raw, $this->getSaltPrefix().$this->getSalt()); } /** * {@inheritdoc} */ public function isPasswordValid($encoded, $raw, $salt = null) { return $encoded === crypt($raw, $encoded); } } 

Реальный класс реализации:

 class Sha512CryptPasswordEncoder extends AbstractCryptPasswordEncoder { /** * @var string */ private $rounds; /** * @param null|int $rounds The number of hashing loops */ public function __construct($rounds = null) { $this->rounds = $rounds; } /** * {@inheritdoc} */ protected function getSaltPrefix() { return sprintf('$6$%s', $this->rounds ? "rounds={$this->rounds}$" : ''); } /** * {@inheritdoc} */ protected function getSalt() { return base64_encode(openssl_random_pseudo_bytes(12)); } } 

Ключевой частью является генерация соли, которая будет встроена в пароль: нужен ли base64_encode по какой-либо причине (хранение), если предположить, что он никогда не будет отправлен по проводу?

Solutions Collecting From Web of "Нужно ли мне base64 кодировать мою соль (для хэширования паролей)?"

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

Возьмите BCrypt, например, это хороший алгоритм хеширования для паролей (SHA-512 не подходит, потому что он слишком быстр), он принимает все символы строки с кодировкой base64, за исключением символа «+». С другой стороны он принимает «.» символов, которые не являются частью строки с кодировкой base64.

PHP 5.5 будет иметь функции password_hash() и password_verify() , чтобы упростить использование BCrypt, я действительно могу их рекомендовать. Существует также пакет совместимости для старых версий PHP, в строке 121 вы можете видеть, что base64_encode() действительно используется, но впоследствии все недопустимые символы «+» заменяются на разрешенные «.». персонажи:

Кодирование соли для BCrypt:

 $salt = str_replace('+', '.', base64_encode($buffer)); 

BASE64 используется для кодирования двоичных данных в текстовое представление. Это позволяет передавать двоичные данные с использованием текстовых каналов. Если вы хотите хранить хешированный пароль в БД, вам не нужно его кодировать – он уже находится в текстовом формате.