Hash pbkdf2: примеры (PHP)

Полное руководство по функции hash_pbkdf2 в PHP с практическими примерами
Раздел: Хеширование и шифрование
hash_pbkdf2(string $algo, string $password, string $salt, int $iterations, int $length = 0, bool $binary = false): string

Функция hash_pbkdf2

Функция hash_pbkdf2 реализует алгоритм PBKDF2 (Password-Based Key Derivation Function 2). Ее основное назначение - безопасное преобразование пароля или другой исходной строки в криптографический ключ заданной длины.

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

Когда применяется
  • Создание ключей шифрования из паролей
  • Хеширование паролей для хранения в базах данных
  • Генерация производных ключей в криптографических протоколах
Параметры функции
  1. algo (string) - имя алгоритма хеширования (например, 'sha256', 'sha512')
  2. password (string) - исходный пароль
  3. salt (string) - криптографическая соль
  4. iterations (int) - количество итераций (рекомендуется не менее 10000)
  5. length (int) - длина выходной строки в байтах (0 для полного хеша)
  6. binary (bool) - если true, возвращает бинарные данные, иначе шестнадцатеричную строку

Базовые примеры использования

Простое хеширование с минимальными параметрами
$hash = hash_pbkdf2('sha256', 'мой_пароль', 'случайная_соль', 1000);
echo $hash;
0f5d4e7c6e8d9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5
Хеширование с заданной длиной ключа
$hash = hash_pbkdf2('sha256', 'пароль', 'соль', 5000, 32);
echo bin2hex($hash); // Преобразуем бинарные данные в hex
a1b2c3d4e5f67890abcd1234ef567890abcdef1234567890fedcba9876543210
Возврат бинарных данных
$binaryHash = hash_pbkdf2('sha256', 'secret', 'salt', 10000, 16, true);
echo 'Длина: ' . strlen($binaryHash) . ' байт';
Длина: 16 байт

Альтернативные функции в PHP

password_hash

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

$hash = password_hash('мой_пароль', PASSWORD_DEFAULT);

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

$hash = crypt('пароль', '$5$rounds=5000$случайнаясоль$');
Рекомендации по выбору

Для хеширования паролей в новых проектах предпочтительнее использовать password_hash. Функция hash_pbkdf2 больше подходит для генерации ключей шифрования или в legacy-системах.

Аналоги в других языках программирования

Python (hashlib.pbkdf2_hmac)
import hashlib
hash = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000, dklen=32)
print(hash.hex())
0394a2ede332c9a13eb82e9b246... (урезано)
Node.js (crypto.pbkdf2Sync)
const crypto = require('crypto');
const hash = crypto.pbkdf2Sync('password', 'salt', 100000, 32, 'sha256');
console.log(hash.toString('hex'));
5e884898da28... (урезано)
MySQL (PBKDF2)

В MySQL нет встроенной функции PBKDF2, но можно реализовать через пользовательские функции или на стороне приложения.

Типичные ошибки

Слишком мало итераций
// Небезопасно!
$hash = hash_pbkdf2('sha256', 'пароль', 'соль', 1);

Малое количество итераций снижает стойкость к brute-force атакам.

Использование предсказуемой или короткой соли
// Плохая практика
$hash = hash_pbkdf2('sha256', 'пароль', '123', 10000);

Соль должна быть криптографически случайной и достаточно длинной (рекомендуется не менее 16 байт).

Неподдерживаемый алгоритм
// Вызовет ошибку в PHP 8+
try {
    $hash = hash_pbkdf2('md5', 'пароль', 'соль', 1000);
} catch (Throwable $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
Ошибка: hash_pbkdf2(): Unknown hashing algorithm: md5

Изменения в последних версиях PHP

PHP 8.0

Параметр algo теперь проверяется во время компиляции для известных алгоритмов. Удалена поддержка не криптографических хешей (adler32, crc32, crc32b, fnv132, fnv1a32, fnv164, fnv1a64, joaat).

PHP 8.1

Добавлена передача параметра $algo как строки. Улучшены сообщения об ошибках при использовании неподдерживаемых алгоритмов.

Расширенные примеры

Сравнение времени выполнения при разных итерациях
Пример php
$start = microtime(true);
$hash1 = hash_pbkdf2('sha256', 'пароль', 'соль', 1000);
$time1 = microtime(true) - $start;

$start = microtime(true);
$hash2 = hash_pbkdf2('sha256', 'пароль', 'соль', 100000);
$time2 = microtime(true) - $start;

echo "1000 итераций: {$time1} сек\n";
echo "100000 итераций: {$time2} сек";
1000 итераций: 0.00123 сек
100000 итераций: 0.12345 сек
Генерация ключа для шифрования
Пример php
// Генерация ключа для AES-256 (32 байта)
$key = hash_pbkdf2('sha256', 'master_password', 'unique_salt', 100000, 32, true);
$key_hex = bin2hex($key);
echo "Ключ AES-256: $key_hex";
Ключ AES-256: 4a7f8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8
Использование с разными алгоритмами хеширования
Пример php
$algorithms = ['sha256', 'sha512', 'sha3-256'];
foreach ($algorithms as $algo) {
    $hash = hash_pbkdf2($algo, 'одинаковый_пароль', 'одинаковая_соль', 1000, 20);
    echo "$algo: " . substr($hash, 0, 20) . "...\n";
}
sha256: 1a2b3c4d5e6f7890abcd...
sha512: a1b2c3d4e5f67890abcd...
sha3-256: f0e1d2c3b4a59687fed...
Формирование совместимого с RFC 2898 вывода
Пример php
// PBKDF2 с HMAC-SHA1 как в RFC 2898
$password = 'password';
$salt = random_bytes(16);
$iterations = 4096;
$keyLength = 20;

$derivedKey = hash_pbkdf2('sha1', $password, $salt, $iterations, $keyLength, true);

// Формат: salt:iterations:key
$encoded = base64_encode($salt) . ':' . $iterations . ':' . base64_encode($derivedKey);
echo $encoded;
MTIzNDU2Nzg5MDEyMzQ1Ng==:4096:QUJDREVGR0hJSktMTU5PUFFSU1Q=

PHP hash_pbkdf2 function comments

En
Hash pbkdf2 Generate a PBKDF2 key derivation of a supplied password