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.
mhash_keygen_s2k
(PHP 4 >= 4.0.4, PHP 5)
mhash_keygen_s2k — Gerar uma chave
Descrição
Gera um chave de acordo com hash apartir de uma password (senha) do usuário.
Este é o algoritmo Salted S2K como especificado no documento OpenPGP (RFC 2440).
Tenha em mente que as senhas fornecidas pelos usuários não são boas para serem usadas como chaves em algoritmos criptográficos, pois usuários normalmente escolhem chaves que eles podem escrever no teclado. Estas senhas usam somente 6 a 7 bits por caracter (ou menos). É altamente recomendado usar algum tipo de transformação (como esta função) na chave dada pelo usuário.
Parâmetros
- hash
-
O hash id usado para criar uma chave. Um das constantes MHASH_XXX.
- password
-
A senha fornecida do usuário.
- salt
-
Deve ser diferente e aleatório o suficiente para que cada chave que você gere seja diferente. Este salt tem que ser sabido quando você checar as suas chaves (keys), logo é uma boa ideia que a chave siga o salt. O salt tem o comprimento fixo de 8 bytes e será completado com zeros se voce fornecer menos bytes.
- bytes
-
O tamanho da chave, em bytes.
Valor Retornado
Retorna a chave gerada como uma string, ou FALSE em erro.
mhash_keygen_s2k
14-Mar-2007 08:42
17-Jul-2003 08:18
// 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
