使用加密技术可大大地增强安全性能,可以使用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以及流模式中使用的某种算法。该函数执行后返回加密后的结果字符串。示例:
$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."
";
$str_encrypt=mcrypt_encrypt($cipher, $key, $str, $modes,$iv); //加密函数
echo "密文:".bin2hex($str_encrypt)."
";
?>
·mcrypt_decrypt()函数:
mcrypt_decrypt()是针对mcrypt_encrypt()函数进行解密的函数。语法格式为:
string mcrypt_decrypt(string $dipher, string $key, string $data, string $mode[, string $iv])
其中各个参数的含义与mcrypt_encrypt()函数相同。示例:
$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算法加密
$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库对数据加密
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是要使用的散列算法。示例:
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";
?>