mhash_keygen_s2k

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

mhash_keygen_s2kGera uma chave

Aviso

Esta função tornou-se DEFASADA a partir do PHP 8.1.0. O uso desta função é fortemente desencorajado.

Descrição

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

Gera um chave de acordo com o parâmetro algo a partir de uma senha de usuário informada em password.

Este é o algoritmo Salted S2K como especificado no documento OpenPGP (» RFC 2440).

Tenha em mente que senhas fornecidas pelos usuários não são adequadas para uso como chaves em algoritmos criptográficos, pois os usuários normalmente escolhem chaves que podem ser escritas no teclado. Estas senhas usam somente 6 a 7 bits por caractere (ou menos). É altamente recomendado usar algum tipo de transformação (como esta função) na chave informada pelo usuário.

Parâmetros

algo

O ID da hash usada para criar a chave. Um das constantes MHASH_hashname.

password

Uma senha fornecida pelo usuário.

salt

Deve ser diferente e aleatório o suficiente para cada chave gerada de forma que sejam criadas chaves diferentes. Como salt precisa ser conhecido quando se verifica as chaves, é uma boa prática concatenar a chave a ele. Salt tem um comprimento fixo de 8 bytes e será completado com zeros forem fornecidos menos bytes.

length

O tamanho da chave, em bytes.

Valor Retornado

Retorna a chave gerada como uma string, ou false em caso de erro.

Registro de Alterações

Versão Descrição
8.1.0 Esta função está defasada. Use as funções hash_*() em seu lugar.

add a note add a note

User Contributed Notes 3 notes

up
1
alix dot axel+php at gmail dot com
12 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
-1
php_at_share-foo.com
21 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