mhash_keygen_s2k

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

mhash_keygen_s2k生成密钥

警告

此函数自 PHP 8.1.0 起已 *弃用*。强烈建议不要依赖此函数。

描述

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

根据给定的 algo 生成密钥,使用用户提供的 password

这是 OpenPGP 文档中规定的加盐 S2K 算法 (» RFC 2440).

请记住,用户提供的密码并不真正适合用作加密算法中的密钥,因为用户通常会选择可以在键盘上输入的密钥。这些密码每个字符只使用 6 到 7 位(或更少)。强烈建议对用户提供的密钥进行某种形式的转换(比如使用此函数)。

参数

algo

用于创建密钥的哈希 ID。MHASH_hashname 常量之一。

password

用户提供的密码。

salt

对于您生成的每个密钥,必须不同且足够随机,以便创建不同的密钥。因为在检查密钥时必须知道 salt,所以最好将密钥附加到它。Salt 的固定长度为 8 个字节,如果您提供的字节数少于 8 个字节,则将用零填充。

length

密钥长度(以字节为单位)。

返回值

返回生成的密钥作为字符串,或在发生错误时返回 false

变更日志

版本 描述
8.1.0 此函数已弃用。请改用 hash_*() 函数

添加备注

用户贡献的备注 3 个备注

0
alix dot axel+php at gmail dot com
11 年前
我研究了 mhash 和 PHP 源代码,并将此函数移植到纯 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;
}

?>
-1
gmic
17 年前
对 ray ferguson 帖子的修正,

正如文档中所说:“mhash_keygen_s2k 从用户提供的密码生成一个长度为 bytes 的密钥,并使用指定的哈希算法创建密钥”。如果对任何人来说不清楚。

非 mhash 函数很好,只要您不需要超过原生 MD5 哈希(16 个字节)的密钥,它就不会给您更多。

因此,非 mhash 函数工作正常,但它们并非一回事。

只需尝试 ray ferguson 的示例,要求 32 个字节的密钥。

返回超过打包的 16 个字节字符串的子字符串不会在字符串中添加任何内容。加盐 S2K 算法确实会添加到密钥中。因此,最好使用 mhash 库或创建更类似于 RFC 2440 规范的内容。

我知道这篇文章对于 Ray 的帖子来说已经晚了,但如果它能帮助某些人避免像我一样浪费时间,那就太好了。
-4
php_at_share-foo.com
21 年前
// 给定随机的 8 位盐和明文密码

$clear_pw = "p4ssw0rd" ;
$rand8bites4salt = substr(pack("h*", md5(mt_rand())) , 0, 8);

// 这

mhash_keygen_s2k(MHASH_MD5, $clear_pw, $rand8bites4salt, 4) ;

// 与这相同

function myhash_keyge_s2k($pass, $salt, $bytes ){
return substr(pack("H*", md5($salt . $pass)), 0, $bytes);
}

myhash_keyge_s2k($clear_pw, $rand8bites4salt, 4);

// 但后者不需要 mhash 库。

// -ray ferguson
To Top