Извините меня за этот очень странный вопрос. Я понимаю цель кодирования 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
по какой-либо причине (хранение), если предположить, что он никогда не будет отправлен по проводу?
Каждый алгоритм хэширования ожидает соли в данном алфавите, что означает, что использование 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 используется для кодирования двоичных данных в текстовое представление. Это позволяет передавать двоичные данные с использованием текстовых каналов. Если вы хотите хранить хешированный пароль в БД, вам не нужно его кодировать – он уже находится в текстовом формате.