PHP程序员们在编写代码程序时,除了要保证代码的高性能之外,还有一点是非常重要的,那就是程序的安全性保障。PHP除了自带的几种加密函数外,还有功能更全面的PHP加密扩展库Mcrypt和Mhash。
其中,Mcrypt扩展库可以实现加密解密功能,就是既能将明文加密,也可以密文还原。
Mcrypt 函数
- mcrypt_cbc— 以 CBC 模式加解密数据
- mcrypt_cfb— 以 CFB 模式加解密数据
- mcrypt_create_iv— 从随机源创建初始向量
- mcrypt_decrypt— 使用给定参数解密密文
- mcrypt_ecb— 已废弃:使用 ECB 模式加解密数据
- mcrypt_enc_get_algorithms_name— 返回打开的算法名称
- mcrypt_enc_get_block_size— 返回打开的算法的分组大小
- mcrypt_enc_get_iv_size— 返回打开的算法的初始向量大小
- mcrypt_enc_get_key_size— 返回打开的模式所能支持的最长密钥
- mcrypt_enc_get_modes_name— 返回打开的模式的名称
- mcrypt_enc_get_supported_key_sizes— 以数组方式返回打开的算法所支持的密钥长度
- mcrypt_enc_is_block_algorithm_mode— 检测打开的模式是否支持分组加密
- mcrypt_enc_is_block_algorithm— 检测打开模式的算法是否为分组算法
- mcrypt_enc_is_block_mode— 检测打开的模式是否以分组方式输出
- mcrypt_enc_self_test— 在打开的模块上进行自检
- mcrypt_encrypt— 使用给定参数加密明文
- mcrypt_generic_deinit— 对加密模块进行清理工作
- mcrypt_generic_end— 终止加密
- mcrypt_generic_init— 初始化加密所需的缓冲区
- mcrypt_generic— 加密数据
- mcrypt_get_block_size— 获得加密算法的分组大小
- mcrypt_get_cipher_name— 获取加密算法名称
- mcrypt_get_iv_size— 返回指定算法/模式组合的初始向量大小
- mcrypt_get_key_size— 获取指定加密算法的密钥大小
- mcrypt_list_algorithms— 获取支持的加密算法
- mcrypt_list_modes— 获取所支持的模式
- mcrypt_module_close— 关闭加密模块
- mcrypt_module_get_algo_block_size— 返回指定算法的分组大小
- mcrypt_module_get_algo_key_size— 获取打开模式所支持的最大密钥大小
- mcrypt_module_get_supported_key_sizes— 以数组形式返回打开的算法所支持的密钥大小
- mcrypt_module_is_block_algorithm_mode— 返回指定模块是否是分组加密模式
- mcrypt_module_is_block_algorithm— 检测指定算法是否为分组加密算法
- mcrypt_module_is_block_mode— 检测指定模式是否以分组方式输出
- mcrypt_module_open— 打开算法和模式对应的模块
- mcrypt_module_self_test— 在指定模块上执行自检
- mcrypt_ofb— 使用 OFB 模式加密/解密数据
- mdecrypt_generic— 解密数据
封装加密类代码
<?php
/**
* 加密类
*/
class Security
{
private static $_instance;
private function __construct() {}
private function __clone() {}
private $_secret_key = 'key'; //加密密钥 可自定义设置 防止泄露
/**
* 单例模式
*/
public static function getInstance()
{
if (!(self::$_instance instanceof self)) {
self::$_instance = new self;
}
return self::$_instance;
}
/**
* 加密工具函数
*/
private function encode1($data)
{
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$this->_secret_key = 'swtrademark_key';
mcrypt_generic_init($td, $this->_secret_key, $iv);
$encrypted = mcrypt_generic($td, $data);
mcrypt_generic_deinit($td);
return $iv . $encrypted;
}
/**
* 解密工具函数
*/
private function decode1($data)
{
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
$iv = mb_substr($data, 0, 32, 'latin1');
$this->_secret_key = 'swtrademark_key';
mcrypt_generic_init($td, $this->_secret_key, $iv);
$data = mb_substr($data, 32, mb_strlen($data, 'latin1'), 'latin1');
$data = mdecrypt_generic($td, $data);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return trim($data);
}
/**
* 替换
*/
private function replace($str)
{
$str1 = str_replace('/', '*', $str);
$str2 = str_replace('=', '^', $str1);
return str_replace('+', '_', $str2);
}
/**
* 反替换
*/
private function base64replace($str)
{
$str1 = str_replace('*', '/', $str);
$str2 = str_replace('^', '=', $str1);
return str_replace('_', '+', $str2);
}
/**
* 加密调用函数
*/
public function word_encode($keyWord)
{
$str = $this->encode1($keyWord);
return trim($this->replace(base64_encode($str)));
}
/**
* 解密调用函数
*/
public function word_decode($keyWord)
{
$str = base64_decode($this->base64replace($keyWord));
return trim($this->decode1($str));
}
}
/**
* 调用
*/
$str = '这是个秘密';
//加密
$password = Security::getInstance()->word_encode( $str );
echo $password . '<br>';
//解密
echo Security::getInstance()->word_decode( $password );
//结果: (加密密码为动态的,实时变化,两次运行结果如下)
/**
* bUxwS2u24waVyrXtMu*vKgsPGWVnjzrFD1na8krUAxZOJuAm7qMO4S_o4MogWL1G82OYhCUjt_uW8phmU_niww^^
* 这是个秘密
*/
/**
* 2A_GIJvNHQ9J9NPpKu6x2wehP4ondYQeU1QJQNKj1Bd9NCDPZz0QbENIXE5_pgbespM5qS78Dj2cfSibgL3vWQ^^
* 这是个秘密
*/
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。