mhash_keygen_s2k

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

mhash_keygen_s2kGénère une clé

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 8.1.0. Dépendre de cette fonction est fortement déconseillé.

Description

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

Génère une clé suivant l'algo fourni, en utilisant le mot de passe password fourni.

Cette fonction utilise l'algorithme Salted S2K, spécifié dans OpenPGP (» RFC 2440).

N'oubliez pas que les mots de passe fournis par les utilisateurs ne sont pas conseillés pour faire des clés cryptographiques, étant donné que les utilisateurs normaux retiennent des mots de passe qu'ils peuvent saisir au clavier. Ces mots de passe utilisent uniquement 6 à 7 des 8 bits d'un caractère (voire moins). Il est vivement recommandé d'appliquer une fonction de transformation (comme celle-ci), à un mot de passe utilisateur.

Liste de paramètres

algo

L'identifiant du hash utilisé pour créer la clé. Une parmi les constantes MHASH_hashname.

password

Mot de passe fourni par l'utilisateur.

salt

Doit être différent et suffisamment aléatoire pour chaque clé que vous générez, afin de créer des clés différentes. Du fait que le paramètre salt doit être connu lorsque vous vérifiez les clés, c'est une bonne idée de l'ajouter à la clé. Le paramètre salt doit avoir une longueur de 8 octets, et sera complété de zéro si vous en fournissez un d'une taille inférieure.

length

La longueur de la clé, en octets.

Valeurs de retour

Retourne la clé générée, sous la forme d'une chaîne de caractères, ou false si une erreur survient.

Historique

Version Description
8.1.0 Cette fonction a été rendue obsolète. Utiliser les fonctions hash_*() à la place.

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