# hash_pbkdf2

(PHP 5 >= 5.5.0, PHP 7)

hash_pbkdf2 — 生成所提供密码的 PBKDF2 密钥导出

### 说明

hash_pbkdf2 ( string `$algo` , string `$password` , string `$salt` , int `$iterations` [, int `$length` = 0 [, bool `$raw_output` = `FALSE` ]] ) : string

### 参数

`algo`

  哈希算法名称，例如 md5，sha256，haval160,4 等。 受支持的算法清单请参见 hash_algos()。

`password`

  要进行导出的密码。

`salt`

  进行导出时所使用的“盐”，这个值应该是随机生成的。

`iterations`

  进行导出时的迭代次数。

`length`

  密钥导出数据的长度。如果 `raw_output` 为 `TRUE`， 此参数为密钥导出数据的字节长度。如果 `raw_output` 为 `FALSE`， 此参数为密钥导出数据的字节长度的 2 倍，因为 1 个字节数据对应的 2 个 16 进制的字符。

  如果传入 0，则使用所选算法的完整输出大小。

`raw_output`

  设置为 `TRUE` 输出原始二进制数据， 设置为 `FALSE` 输出小写 16 进制字符串。

### 返回值

如果 `raw_output` 设置为 `TRUE`， 则返回原始二进制数据表示的信息摘要， 否则返回 16 进制小写字符串格式表示的信息摘要。

### 错误／异常

在以下情况下会产生 `E_WARNING`： 指定了未知的算法， `iterations` 小于等于 0， `length` 小于等于 0 或者 `salt` 过长（大于 `INT_MAX` - 4）。

### 更新日志

版本 | 说明
--- | ---
7.2.0 | 不再支持非加密的哈希函数（adler32，crc32，crc32b，fnv132，fnv1a32，fnv164，fnv1a64，joaat）。

### 范例

Example #1 hash_pbkdf2() 例程，基础用法

    <?php
    $password = "password";
    $iterations = 1000;

    // 使用 openssl_random_pseudo_bytes()，random_bytes()，或者其他合适的随机数生成函数
    // 来生成随机初始向量
    $salt = openssl_random_pseudo_bytes(16, MCRYPT_DEV_URANDOM);

    $hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 20);
    echo $hash;
    ?>

以上例程的输出类似于：

    120fb6cffcf8b32c43e7

### 注释

Caution

为了安全起见，可以使用 PBKDF2 方法对密码明文进行哈希运算后再存储。 但是更好的方案是使用 password_hash() 函数 或者使用 `CRYPT_BLOWFISH` 算法调用 crypt() 函数。

### 参见

- crypt() - 单向字符串散列
- password_hash() - 创建密码的散列（hash）
- hash() - 生成哈希值 （消息摘要）
- hash_algos() - 返回已注册的哈希算法列表
- hash_init() - 初始化增量哈希运算上下文
- hash_hmac() - 使用 HMAC 方法生成带有密钥的哈希值
- hash_hmac_file() - 使用 HMAC 方法和给定文件的内容生成带密钥的哈希值
- openssl_pbkdf2() - 生成一个 PKCS5 v2 PBKDF2 字符串