CakeFest 2024: The Official CakePHP Conference

mhash_keygen_s2k

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

mhash_keygen_s2kГенерация ключа

Внимание

Функция объявлена УСТАРЕВШЕЙ начиная с PHP 8.1.0. Использовать эту функцию крайне не рекомендуется.

Описание

mhash_keygen_s2k(
    int $algo,
    string $password,
    string $salt,
    int $length
): string|false

Генерирует ключ в соответствии с заданным algo и указанным паролем password.

Используется алгоритм S2K с солью, как описано в документе OpenPGP (» RFC 2440).

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

Список параметров

algo

Идентификатор хеша. Одна из констант MHASH_hashname.

password

Пользовательский пароль.

salt

Должна быть разной и достаточно случайной для каждого создаваемого ключа. Так как salt должна быть известна при проверке ключа, то хорошей идеей будет добавить её к ключу. Соль имеет фиксированный размер в 8 байт и будет дополнена нулями, если заданный параметр будет короче.

length

Длина ключа в байтах.

Возвращаемые значения

Возвращает строку с ключом или false в случае возникновения ошибки.

Список изменений

Версия Описание
8.1.0 Функция объявлена устаревшей. Используйте вместо неё функции hash_*().

add a note

User Contributed Notes 3 notes

up
0
alix dot axel+php at gmail dot com
11 years ago
I looked into mhash and PHP source code and I've ported this function to pure PHP:

<?php

function keygen_s2k($hash, $password, $salt, $bytes)
{
$result = false;

if (
extension_loaded('hash') === true)
{
$times = $bytes / ($block = strlen(hash($hash, null, true)));

if (
$bytes % $block != 0)
{
++
$times;
}

for (
$i = 0; $i < $times; ++$i)
{
$result .= hash($hash, str_repeat("\0", $i) . $salt . $password, true);
}
}

return
$result;
}

?>
up
-1
gmic
17 years ago
Correction to ray ferguson post,

As said in the doc : "mhash_keygen_s2k generates a key that is bytes long, from a user given password and use the specified hash algorithm to create the key." if It wasn't clear to anyone.

The non mhash function is good as long you do not need a key longer than native MD5 hash (16 bytes) it wont give you more.

So the non mhash function work OK but they ARE NOT the same thing.

Just try ray ferguson exemple asking for a 32 bytes key.

Returning a substring longer than the packed 16 bytes string won't add anything to the string. Salted S2K algorithm does add to the key. So better use mhash lib or create something more alike the RFC 2440 specs.

I know the post is late on regard to Ray's post but if it can help someone not waisting time like me.
up
-4
php_at_share-foo.com
20 years ago
// given random 8 bits of salt and a clear text password

$clear_pw = "p4ssw0rd" ;
$rand8bites4salt = substr(pack("h*", md5(mt_rand())) , 0, 8);

// This

mhash_keygen_s2k(MHASH_MD5, $clear_pw, $rand8bites4salt, 4) ;

//is the same as this

function myhash_keyge_s2k($pass, $salt, $bytes ){
return substr(pack("H*", md5($salt . $pass)), 0, $bytes);
}

myhash_keyge_s2k($clear_pw, $rand8bites4salt, 4);

// But the latter doesn't require mhash libs.

// -ray ferguson
To Top