# 加密類
加密類提供了雙向數據加密的方式,它依賴于 PHP 的 Mcrypt 擴展,所以要有 Mcrypt 擴展才能運行。
重要
這個類庫已經廢棄,保留只是為了向前兼容。請使用新的?[加密類](http://codeigniter.org.cn/user_guide/libraries/encryption.html)?。
[TOC=2,3]
## 使用加密類
### 設置你的密鑰
**密鑰**?是對字符串進行加密或解密的一段信息片段。實際上,你設置的密鑰 是?**唯一**?能解密通過該密鑰加密的數據,所以一定要慎重選擇你的密鑰, 而且如果你打算對持久數據進行加密的話,你最好不要修改密鑰。
不用說,你應該小心保管好你的密鑰,如果有人得到了你的密鑰,那么數據就能 很容易的被解密。如果你的服務器不在你的控制之下,想保證你的密鑰絕對安全 是不可能的,所以在在你使用密鑰對敏感數據(譬如信用卡號碼)進行加密之前, 請再三斟酌。
為了最大程度的利用加密算法,你的密鑰最好使用32位長度(256字節),為了 保證安全性,密鑰字符串應該越隨機越好,包含數字、大寫和小寫字符,**不應該**?直接使用一個簡單的字符串。
你的密鑰可以保存在?**application/config/config.php**?文件中,或者使用你 自己設計的保存機制也行,然后在加解密時動態的取出密鑰。
如果要通過文件?**application/config/config.php**?來保存你的密鑰,那么打開 該文件然后設置:
~~~
$config['encryption_key'] = "YOUR KEY";
~~~
### 消息長度
有一點很重要,你應該知道,通過加密方法生成的消息長度大概會比原始的消息長 2.6 倍。舉個例子來說,如果你要加密的字符串是 "my super secret data" ,它 的長度為 21 字符,那么加密之后的字符串的長度大約為 55 字符(這里之所以說 “大約” 是因為加密字符串以 64 位為單位非線性增長)。當你選擇數據保存機制時 請記住這一點,譬如 Cookie 只能存儲 4k 的信息。
### 初始化類
正如 CodeIgniter 中的其他類一樣,在你的控制器中使用?$this->load->library()?方法來初始化加密類:
~~~
$this->load->library('encrypt');
~~~
初始化之后,加密類的對象就可以這樣訪問:
~~~
$this->encrypt
~~~
## 類參考
classCI_Encrypt
>[info] ### encode($string[,?$key = ''])
參數:
* **$string**?(string) -- Data to encrypt
* **$key**?(string) -- Encryption key
返回: Encrypted string
返回類型: string
執行數據加密,并返回加密后的字符串。例如:
~~~
$msg = 'My secret message';
$encrypted_string = $this->encrypt->encode($msg);
~~~
如果你不想使用配置文件中的密鑰,你也可以將你的密鑰通過第二個可選參數傳入:
~~~
$msg = 'My secret message';
$key = 'super-secret-key';
$encrypted_string = $this->encrypt->encode($msg, $key);
~~~
>[info] ### decode($string[,?$key = ''])
參數:
* **$string**?(string) -- String to decrypt
* **$key**?(string) -- Encryption key
返回: Plain-text string
返回類型: string
解密一個已加密的字符串。例如:
~~~
$encrypted_string = 'APANtByIGI1BpVXZTJgcsAG8GZl8pdwwa84';
$plaintext_string = $this->encrypt->decode($encrypted_string);
~~~
如果你不想使用配置文件中的密鑰,你也可以將你的密鑰通過第二個可選參數傳入:
~~~
$msg = 'My secret message';
$key = 'super-secret-key';
$encrypted_string = $this->encrypt->decode($msg, $key);
~~~
>[info] ### set_cipher($cipher)
參數:
* **$cipher**?(int) -- Valid PHP MCrypt cypher constant
返回: CI_Encrypt instance (method chaining)
返回類型: CI_Encrypt
設置一個 Mcrypt 加密算法,默認情況下,使用的是?MCRYPT_RIJNDAEL_256?,例如:
~~~
$this->encrypt->set_cipher(MCRYPT_BLOWFISH);
~~~
訪問 php.net 獲取一份?[可用的加密算法清單](http://php.net/mcrypt)?。
如果你想測試下你的服務器是否支持 MCrypt ,你可以:
~~~
echo extension_loaded('mcrypt') ? 'Yup' : 'Nope';
~~~
>[info] ### set_mode($mode)
參數:
* **$mode**?(int) -- Valid PHP MCrypt mode constant
返回: CI_Encrypt instance (method chaining)
返回類型: CI_Encrypt
設置一個 Mcrypt 加密模式,默認情況下,使用的是?**MCRYPT_MODE_CBC**?,例如:
~~~
$this->encrypt->set_mode(MCRYPT_MODE_CFB);
~~~
訪問 php.net 獲取一份?[可用的加密模式清單](http://php.net/mcrypt)?。
>[info] ### encode_from_legacy($string[,?$legacy_mode = MCRYPT_MODE_ECB[,?$key = '']])
參數:
* **$string**?(string) -- String to encrypt
* **$legacy_mode**?(int) -- Valid PHP MCrypt cipher constant
* **$key**?(string) -- Encryption key
返回: Newly encrypted string
返回類型: string
允許你重新加密在 CodeIgniter 1.x 下加密的數據,這樣可以和 CodeIgniter 2.x 的 加密類庫保持兼容。只有當你的加密數據是永久的保存在諸如文件或數據庫中時,并且 你的服務器支持 Mcrypt ,你才可能需要使用這個方法。如果你只是在諸如會話數據 或其他臨時性的數據中使用加密的話,那么你根本用不到它。盡管如此,使用 2.x 版本 之前的加密庫加密的會話數據由于不能被解密,會話會被銷毀。
>[danger] 重要
> **為什么只是提供了一個重新加密的方法,而不是繼續支持原有的加密方法呢?**?這是因為 CodeIgniter 2.x 中的加密庫不僅在性能和安全性上有所提高,而且我們 并不提倡繼續使用老版本的加密方法。當然如果你愿意的話,你完全可以擴展加密庫, 使用老的加密方法來替代新的加密方法,無縫的兼容 CodeIgniter 1.x 加密數據。 但是作為一個開發者,作出這樣的決定還是應該小心謹慎。
~~~
$new_data = $this->encrypt->encode_from_legacy($old_encrypted_string);
~~~
| 參數 | 默認值 | 描述 |
| --- | --- | --- |
| **$orig_data** | n/a | 使用 CodeIgniter 1.x 加密過的原始數據 |
| **$legacy_mode** | MCRYPT_MODE_ECB | 生成原始數據時使用的 Mcrypt 加密模式,CodeIgniter 1.x 默認使用的是 MCRYPT_MODE_ECB , 如果不指定該參數的話,將默認使用該方式。 |
| **$key** | n/a | 加密密鑰,這個值通常在上面所說的配置文件里。 |
- 歡迎使用 CodeIgniter
- 安裝說明
- 下載 CodeIgniter
- 安裝說明
- 從老版本升級
- 疑難解答
- CodeIgniter 概覽
- CodeIgniter 將從這里開始
- CodeIgniter 是什么?
- 支持特性
- 應用程序流程圖
- 模型-視圖-控制器
- 設計與架構目標
- 教程 - 內容提要
- 加載靜態內容
- 讀取新聞條目
- 創建新聞條目
- 結束語
- 常規主題
- CodeIgniter URL
- 控制器
- 保留名稱
- 視圖
- 模型
- 輔助函數
- 使用 CodeIgniter 類庫
- 創建類庫
- 使用 CodeIgniter 驅動器
- 創建驅動器
- 創建核心系統類
- 創建附屬類
- 鉤子 - 擴展框架核心
- 自動加載資源
- 公共函數
- 兼容性函數
- URI 路由
- 錯誤處理
- 網頁緩存
- 程序分析
- 以 CLI 方式運行
- 管理你的應用程序
- 處理多環境
- 在視圖文件中使用 PHP 替代語法
- 安全
- PHP 開發規范
- 類庫參考
- 基準測試類
- 緩存驅動器
- 日歷類
- 購物車類
- 配置類
- Email 類
- 加密類
- 加密類(新版)
- 文件上傳類
- 表單驗證類
- FTP 類
- 圖像處理類
- 輸入類
- Javascript 類
- 語言類
- 加載器類
- 遷移類
- 輸出類
- 分頁類
- 模板解析類
- 安全類
- Session 類
- HTML 表格類
- 引用通告類
- 排版類
- 單元測試類
- URI 類
- 用戶代理類
- XML-RPC 與 XML-RPC 服務器類
- Zip 編碼類
- 數據庫參考
- 數據庫快速入門: 示例代碼
- 數據庫配置
- 連接你的數據庫
- 查詢
- 生成查詢結果
- 查詢輔助函數
- 查詢構造器類
- 事務
- 數據庫元數據
- 自定義函數調用
- 數據庫緩存類
- 數據庫工廠類
- 數據庫工具類
- 數據庫驅動器參考
- 輔助函數參考
- 數組輔助函數
- 驗證碼輔助函數
- Cookie 輔助函數
- 日期輔助函數
- 目錄輔助函數
- 下載輔助函數
- 郵件輔助函數
- 文件輔助函數
- 表單輔助函數
- HTML 輔助函數
- 語言輔助函數
- Inflector 輔助函數
- 數字輔助函數
- 路徑輔助函數
- 安全輔助函數
- 表情輔助函數
- 字符串輔助函數
- 文本輔助函數
- 排版輔助函數
- URL 輔助函數
- XML 輔助函數
- 向 CodeIgniter 貢獻你的力量