# 加密类
加密类提供了双向数据加密的方式,它依赖于 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 贡献你的力量