编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN
使用加密技术可大大地增强安全性能,可以使用PHP的内置加密函数,还可以使用功能强大的加密扩展库。
1.内置加密函数:
PHP提供了比较常用的加密算法,像md5、crypt和sha1,需要时可以直接调用。
①MD5加密算法:
MD5全称是Message-Digest Algorithm 5(信息摘要算法),主要用于让大容量信息在用数字签名软件签署私人密钥前被压缩成一种保密的格式,即把任何一个字符串变换成一定长的大整数。
在PHP中使用MD5加密算法非常方便,只需调用md5()函数即可。语法格式为:
string md5(string $str [, bool $raw_output])
其中,$str参数是要加密的字符串,$raw_output参数是一个布尔值,默认为false表示返回一个32字节的十六进制数据传送散列值,如果值为true,则返回一个16位字节长度的原始二进制数据传送散列值。
由于MD5是单向加密,所以通常使用它对密码进行加密保存,然后对用户输入的密码使用MD5加密后与原始密码相比较实现校验。
②SHA-1加密算法:
SHA-1全称是Secure Hash Algorithm(安全哈希算法),由美国国家安全局设计,同样是单向加密,且提供了比MD5更加安全的加密方式。
PHP中使用sha1()函数进行SHA-1加密。语法格式为:
string sha1(string $str [, bool $raw_output])
其中,$str参数是要加密的字符串,$raw_output参数是一个布尔值,默认为false则返回一个长度为40字节的十六进制数据,如果值为true,则返回一个长度为20位字节的二进制数据。
③crypt()函数:
crypt()函数是一个单向的加密函数,在使用时可以把一个输入的密码和一个预存的密码进行比较,无需任何的解密过程。语法格式为:
string crypt(string $str [, string $salt])
该函数采用以UNIX的DES为基础的加密算法(或者操作系统提供的替代算法)来加密输入的字串。$str参数是要加密的字符串,$salt参数为加密时使用的密钥,如果忽略则会随机生成一个密钥。
2.加密扩展:
PHP还提供了非常强大的加密扩展函数库,这些库可以使数据更加安全,其中有提供双向加密的,还有为大量散列算法提供的,如下表:
扩展包和函数库 |
详细描述 |
Mcrypt |
提供广泛的加密功能,可以双向加密,用来加密大型文件或数据流 |
Mhash |
支持最流行的散列算法,如MD5 |
Crypt_Blowfish |
可以进行快速双向加密,可以选择使用或不使用密钥 |
Crypt_RSA |
提供RSA一样的密钥生成、加密/解密、数位签署及签署验证功能 |
Crypt_HMAC |
这个类可用来计算兼容RFC2104的散列值 |
Crypt_DiffieHellman |
这是一个在PHP5上的Diffie-Hellman密钥交换协议 |
PHP提供了众多的加密扩展,但比较常见的就两三种。
①Mcrypt库:
Mcrypt库中有大量的加密函数来对文件和数据流进行加密,Mcrypt库的加密都是针对固定长度的数据块,一般为64或128字节。但由于明文的长度是不固定的,再加上使用相同的密钥来加密相同的明文,可能会得到相同的结果。
Mcrypt库支持多种区块的加密算法,包括Blowfish、DES、TripleDES、SAFER-SK128、TWOFISH、TEA、RC2、3-WAY、SAFER-SK64及下表中的6种加密算法。
缩写 |
使用例子 |
详细描述 |
CBC |
MCRYPT_MODE_CBC |
密文块链模式,用来加密文件 |
CFB |
MCRYPT_MODE_CFB |
密文反馈模式,建议用来加密字节流 |
STREAM |
MCRYPT_MODE_STREAM |
特色的流模式,需要资料流算法时使用,例如WAKE或RC4 |
ECB |
MCRYPT_MODE_ECB |
电子密码本模式,适合随机数据,可用来加密不同的密码 |
OFB |
MCRYPT_MODE_OFB |
8位输出反馈模式,专门用在不允许出错的应用系统 |
NOFB |
MCRYPT_MODE_NOFB |
N位输出反馈模式,兼容OFB,但更加安全 |
Mcrypt库提供了30多个加密和解密函数,最重要最常用的有两个函数:
·mcrypt_encrypt()函数:
mcrypt_encrypt()的语法格式为:
string mcrypt_encrypt(string $dipher, string $key, string $data, string $mode[, string $iv])
其中,$dipher是要使用的加密算法,$key是使用的加密密钥,$mode是指定的6个加密模式中的一个加密模式,$data是要加密的数据,而参数$iv是对cbc、cfb、ofb以及流模式中使用的某种算法。该函数执行后返回加密后的结果字符串。示例:
<?php
$str="hello"; //加密内容
$key="111"; //密码
$cipher=MCRYPT_DES; //密码类型
$modes=MCRYPT_MODE_CBC; //密码模式
$iv=mcrypt_create_iv(mcrypt_get_iv_size($cipher, $modes), MCRYPT_RAND); //初始化向量
echo "原文:".$str."<p>";
$str_encrypt=mcrypt_encrypt($cipher, $key, $str, $modes,$iv); //加密函数
echo "密文:".bin2hex($str_encrypt)."<p>";
?>
·mcrypt_decrypt()函数:
mcrypt_decrypt()是针对mcrypt_encrypt()函数进行解密的函数。语法格式为:
string mcrypt_decrypt(string $dipher, string $key, string $data, string $mode[, string $iv])
其中各个参数的含义与mcrypt_encrypt()函数相同。示例:
<?php
$str_decrypt=mcrypt_decrypt($cipher, $key, $str_encrypt, $modes,$iv); //解密函数
echo "还原:".$str_decrypt;
?>
②Mhash库:
Mhash库是一个免费的加密函数开源库,为PHP加密的大量散列值算法提供一个有用的接口。可以用这种算法校验信息和进行数据验证等,还可以处理密码。
Mhash库中最常用的是mhash()函数。语法格式为:
string mhash(int $hash, string $data[, string $key]);
$hash参数用于设置散列算法,下表列出该函数支持的算法:
MHASH_ADLER32 |
MHASH_HAVAL128 |
MHASH_MD4 |
MHASH_SHA256 |
MHASH_CRC32 |
MHASH_HAVAL160 |
MHASH_MD5 |
MHASH_TIGER |
MHASH_CRC32B |
MHASH_HAVAL192 |
MHASH_RIPEMD160 |
MHASH_TIGER128 |
MHASH_GOST |
MHASH_HAVAL256 |
MHASH_SHA1 |
MHASH_TIGER160 |
示例:使用mhash()函数和MD5算法加密
<?php
$str="hello";
$PASSMHASH=mhash(MHASH_MD5, $str);
echo "密码散列值:".bin2hex($PASSMHASH);
?>
③PEAR的Crypt_RSA PEAR库:
Crypt_RSA PEAR库允许开发人员使用任意长度的密钥来加密数据,它以RSA区块加密技术为基础,支持双向加密,同时支持任意长度的密钥来解密和解密。
由于Crypt_RSA需要执行大量的数学计算,因此需要借助一些其他扩展才能使用,见下表:
模块名称 |
支持版本 |
PECL big_ini扩展模块 |
需要PEAR包1.0.3以上版本 |
PHP GMP扩展模块 |
PHP版本 |
PHP BCMath扩展模块 |
PHP4/PHP5 |
示例:使用Crypt_RSA PEAR库对数据加密
<?php
require_once 'Crypt/RSA.php';
//产生一对对称密钥
function generate_key_pair() {
global $public_key, $private_key;
$key_pair=new Crypt_RSA_KeyPair(32);
//从这对密钥中提取公钥
$public_key=$key_pair->getPublicKey();
$private_key=$key_pair->getPrivateKey();
}
$file='textfile.txt';
generate_key_pair();
$plain_text=file_get_contents($file);
//把公钥表达为一个字符串
$key=Crypt_RSA_Key::fromString($public_key->toString());
$rsa_obj=new Crypt_RSA;
//用密钥$key加密$plain_text
$encrypted=$rsa_obj->encrypt($plain_text, $key);
$encrypted_file=@fopen('encrypted.txt', 'w');
$ok_encrypt=fwrite($encrypted_file, $encrypted);
?>
④Crypt_HMAC库:
Crypt_HMAC库提供了一个类可以用来计算RFC2104兼容的散列值,只需要指定密钥和明文即可,而且还支持MD5和SHA-1算法。语法格式为:
$var=new Crypt_HMAC(string $key, string $dipher);
其中,$key是要提供的密钥,$dipher是要使用的散列算法。示例:
<?php
require_once 'HMAC.php';
//把字符"defre"重复40次来产生一个密钥
$key=str_repeat(chr(defre), 40);
//产生一个Crypt_HMAC类实体
$crypt=new Hmac($key, 'md5');
//散列函数
echo $crypt->sha1('Hello');
$key=str_repeat(chr(0xcc), 10);
$data=str_repeat(chr(0xdd), 50);
//把散列函数的密钥设定为$key
$crypt->setKey($key);
echo $crypt->sha1($data)."\n";
?>