PHP 5.6.0beta1 released

mhash_keygen_s2k

(PHP 4 >= 4.0.4, PHP 5)

mhash_keygen_s2kGenera una clave

Descripción

string mhash_keygen_s2k ( int $hash , string $password , string $salt , int $bytes )

Genera una clave de acuerdo al algoritmo hash dado, utilizando el password provisto por el usuario.

Este es el algoritmo S2K con Sal, tal y como se encuentra especificado en el documento OpenPGP (» RFC 2440).

Tener en cuenta que las contraseñas suministradas por el usuario no son realmente útiles como claves en algoritmos criptográficos, ya que los usuarios normalmente eligen claves que pueden escribir con el teclado. Estas contraseñas utilizan sólo 6 o 7 bits por caracter (o menos). Es altamente recomendable utilizar algún tipo de transformación (como esta función) a la clave provista por el usuario.

Parámetros

hash

El ID de hash utilizado para crear la clave. Una de las constantes MHASH_hashname.

password

Una contraseña suministrada por el usuario.

salt

Debe ser diferente y lo suficientemente aleatorio para cada clave generada con el fin de crear claves distintas. Debido a que el parámetro salt debe ser conocido cuando se comprueban las claves, es una buena idea anexarle la clave. Este parámetro tienen una longitud fija de 8 bytes y será rellenada con ceros si se suministran menos bytes.

bytes

La longitud de la clave, en bytes.

Valores devueltos

Devuelve la clave generada en formato cadena, o FALSE en caso de error.

add a note add a note

User Contributed Notes 3 notes

up
0
alix dot axel+php at gmail dot com
1 year 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
0
gmic
7 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
0
php_at_share-foo.com
10 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