>[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文檔說明規范
- 管理端操作手冊
- 用戶使用說明書
- 溯源項目構想