🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[info] ## php官方推荐加密方法: * password_get_info — Returns information about the given hash * password_hash — Creates a password hash * password_needs_rehash — Checks if the given hash matches the given options * password_verify — Verifies that a password matches a hash >[success]## 加密算法 password\_hash — 创建密码的散列(hash)  (PHP 5 >= 5.5.0, PHP 7,PHP8) >[success]>当前支持的算法: * **`PASSWORD_DEFAULT`** - 使用 bcrypt 算法 (PHP 5.5.0 默认)。 注意,该常量会随着 PHP 加入更新更高强度的算法而改变。 所以,使用此常量生成结果的长度将在未来有变化。 因此,数据库里储存结果的列可超过60个字符(最好是255个字符)。 * **`PASSWORD_BCRYPT`** - 使用 **`CRYPT_BLOWFISH`** 算法创建散列。 这会产生兼容使用 "$2y$" 的 [crypt()](http://php.net/manual/zh/function.crypt.php)。 结果将会是 60 个字符的字符串, 或者在失败时返回 **`FALSE`**。 * **`PASSWORD_ARGON2I`** - 使用 Argon2 散列算法创建散列。 *** **`PASSWORD_BCRYPT`** 支持的选项: * *salt*([string](http://php.net/manual/zh/language.types.string.php)) - 手动提供散列密码的盐值(salt)。这将避免自动生成盐值(salt)。 省略此值后,**password\_hash()** 会为每个密码散列自动生成随机的盐值。这种操作是有意的模式。 **Warning** 盐值(salt)选项从 PHP 7.0.0 开始被废弃(deprecated)了。 现在最好选择简单的使用默认产生的盐值。 * *cost* ([integer](http://php.net/manual/zh/language.types.integer.php)) - 代表算法使用的 cost。[crypt()](http://php.net/manual/zh/function.crypt.php) 页面上有 cost 值的例子。 省略时,默认值是 *10*。 这个 cost 是个不错的底线,但也许可以根据自己硬件的情况,加大这个值。 **`PASSWORD_ARGON2I`** 支持的选项: * *memory\_cost* ([integer](http://php.net/manual/zh/language.types.integer.php)) - 计算 Argon2 散列时的最大内存(单位:字节 byte)。默认值: **`PASSWORD_ARGON2_DEFAULT_MEMORY_COST`**。 * *time\_cost* ([integer](http://php.net/manual/zh/language.types.integer.php)) - 计算 Argon2 散列时最多的时间。默认值: **`PASSWORD_ARGON2_DEFAULT_TIME_COST`**。 * *threads* ([integer](http://php.net/manual/zh/language.types.integer.php)) - 计算 Argon2 散列时最多的线程数。默认值: **`PASSWORD_ARGON2_DEFAULT_THREADS`**。 *** >[success]### 默认盐值例子: ``` <?php  \\ 我们想要使用默认算法散列密码   \\  当前是 BCRYPT,并会产生 60 个字符的结果。   \\    \\  请注意,随时间推移,默认算法可能会有变化,   \\ 所以需要储存的空间能够超过 60 字(255字不错)   \\  echo password_hash("rasmuslerdorf", PASSWORD\_DEFAULT); ?> ``` ~~~html $2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a ~~~ >[success]### 手动设置盐值的例子: ``` <?php \\  \\ 注意,这里的盐值是随机产生的。  \\ 永远都不要使用固定盐值,或者不是随机生成的盐值。  \\ \\ 绝大多数情况下,可以让 password_hash generate 为你自动产生随机盐值 \\ $options = [     'cost' => 11,     'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM), ]; echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options); ?> ``` ~~~html $2y$11$q5MkhSBtlsJcNEVsYh64a.aCluzHnGog7TQAKVmQwO9C8xb.t89F ~~~ >[success] ## 解密算法: password\_verify — 验证密码是否和散列值匹配  (PHP 5 >= 5.5.0, PHP 7)  ### 说明 **password\_verify** ( string `$password` , string `$hash` ) : bool 验证密码是否和指定的散列值匹配。 注意 [password\_hash()](http://php.net/manual/zh/function.password-hash.php) 返回的散列包含了算法、 cost 和盐值。 因此,所有需要的信息都包含内。使得验证函数不需要储存额外盐值等信息即可验证哈希。 时序攻击(timing attacks)对此函数不起作用。 ### 参数 `password` 用户的密码。 `hash` 一个由 [password\_hash()](http://php.net/manual/zh/function.password-hash.php) 创建的散列值。 ### 返回值 如果密码和散列值匹配则返回 **`TRUE`**,否则返回 **`FALSE`** 。 ### 范例 **Example #1 **password\_verify()** 例子** ```<?php // 想知道以下字符从哪里来,可参见 password_hash() 的例子 $hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; if (password_verify('rasmuslerdorf', $hash)) {     echo 'Password is valid!'; //解密成功 } else {     echo 'Invalid password.'; //解密失败 } ?>``` 以上例程会输出: ~~~html Password is valid! ~~~