mhash_keygen_s2k

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

mhash_keygen_s2kBir anahtar üretir

Uyarı

Bu işlevin kullanımı PHP 8.1.0 itibariyle ÖNERİLMEMEKTEDİR. Bu işleve kesinlikle güvenilmemelidir.

Açıklama

mhash_keygen_s2k(
    int $algo,
    string $parola,
    string $tuz,
    int $uzunluk
): string|false

Belirtilen algo için kullanıcı tarafından sağlanan parola ile bir anahtar üretir.

Kullanılan algoritma OpenPGP belgesinde (» RFC 2440) belirtilen Tuzlu S2K algoritmasıdır.

Kullanıcılar normalde klavyede yazabilecekleri anahtarları seçtikleri için, kullanıcı tarafından sağlanan parolaların kriptografik algoritmalarda anahtar olarak kullanılmaya uygun olmadığını unutmayın. Bu parolalar, karakter başına yalnızca 6 ila 7 bit (veya daha az) kullanır. Kullanıcı tarafından sağlanan anahtara bir dönüşüm (bu işlev gibi) uygulanması şiddetle tavsiye edilir.

Bağımsız Değişkenler

algo

MHASH_algoAdı sabitlerinden biri olarak anahtarı oluşturmak için kullanılacak algoritma.

parola

Kullanıcı tarafından sağlanmış parola.

tuz

Anahtar üretirken her anahtar için farklı bir tuz belirtilmelidir. Anahtarı denetlerken bu tuzu bilmeniz gerekir. Bu bakımdan en iyisi anahtara eklemektir. tuz sabit 8 bayt uzunlukta olmalıdır, eğer daha kısa belirtilirse dolgu karakteri olarak "\0" kullanılır.

uzunluk

Bayt cinsinden anahtar uzunluğu.

Dönen Değerler

Bir hata durumunda false, yoksa üretilen anahtarı bir dizge olarak döndürür.

Sürüm Bilgisi

Sürüm: Açıklama
8.1.0 Bu işlevin kullanımı artık önerilmiyor. Yerine hash_*() işlevleri kullanılmalıdır.

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