>[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!
~~~
- 序言
- 为什么要编码规范?
- 如何进行编码规范?
- 编码规范宏观微观细节
- PHP编码规范
- 基础规范
- 1 语法规范
- 2 变量命名规范
- 3 常量命名规范
- 4 类命名规范
- 5 函数命名规范
- 6 方法命名规范
- PSR-规范
- 基本代码规范
- Tp项目规范
- TP命名规范
- Tp目录规范
- Tp基础目录构架
- Tp项目开发思考
- Tp控制器规范
- 控制器构架
- Tp模型规范
- 模型性能优化
- Tp业务规范
- 返回结构规范
- 业务异常规范
- Tp输出规范
- Restful API
- 模板渲染输出
- Tp异常规范
- 异常码状态码
- 异常输出方式
- Tp验证规范
- Tp路由规范
- Tp加密规范
- Password Hashing
- Tp缓存规范
- 常见数据缓存
- 缓存设计思考
- Tp日志规范
- 日志信息
- 日志分析
- Tp日志接管分析
- Tp性能优化
- vendor包规范
- 项目自动化思考
- 项目检测告警思考
- 项目注释规范
- Mysql设计规范
- 序言
- 命名规范
- 表及字段规范
- 索引规范
- 索引原理
- Sql规范
- 事务规范
- 读写分离
- 乐观锁悲观锁
- 数据库审计
- 性能优化
- 查询优化神器
- 慢查询优化步骤
- 分库分表、分区表
- 根据sql日志筛选数据
- 设计原则
- MongoDB规范
- MongoDB基础
- MongoDB设计
- MongoDB安全性
- MongoDB备份
- 操作手册规范
- API文档说明规范
- 管理端操作手册
- 用户使用说明书
- 溯源项目构想