之前公司做的支付,用的mcrypt的加密,但是当服务器php版本升级到7.2之后就报错了,检查发现是mcrypt库在7.1就已经不被推荐使用,7.2就已经正式被废弃,官方推荐使用openssl,当然你想用还是可以下载一个库然后使用的。
旧版加密:

$size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);
$str = $this->pkcs5Pad($str, $size);
//$aaa = mcrypt_cbc(MCRYPT_DES, $key, $str, MCRYPT_ENCRYPT, $key);
$aaa = mcrypt_encrypt(MCRYPT_DES, $key, $str, MCRYPT_MODE_CBC,$key);

这里设置的是des加密,cbc模式,改为openssl的代码为:

openssl_encrypt($param_string,'DES-CBC',$key,OPENSSL_RAW_DATA,$key);

第一个参数是需要加密的内容,第二个参数是密码方法,比如这里的DES-CBS,如果想用别的密码方法,使用函数

openssl_get_cipher_methods();

或者复制以下代码打印输出一下就能看到所有的加密方法

$ciphers             = openssl_get_cipher_methods();
$ciphers_and_aliases = openssl_get_cipher_methods(true);
$cipher_aliases      = array_diff($ciphers_and_aliases, $ciphers);
print_r($ciphers);
//ECB mode should be avoided
$ciphers = array_filter( $ciphers, function($n) { return stripos($n,"ecb")===FALSE; } );
//At least as early as Aug 2016, Openssl declared the following weak: RC2, RC4, DES, 3DES, MD5 based
$ciphers = array_filter( $ciphers, function($c) { return stripos($c,"des")===FALSE; } );
$ciphers = array_filter( $ciphers, function($c) { return stripos($c,"rc2")===FALSE; } );
$ciphers = array_filter( $ciphers, function($c) { return stripos($c,"rc4")===FALSE; } );
$ciphers = array_filter( $ciphers, function($c) { return stripos($c,"md5")===FALSE; } );
$cipher_aliases = array_filter($cipher_aliases,function($c) { return stripos($c,"des")===FALSE; } );
$cipher_aliases = array_filter($cipher_aliases,function($c) { return stripos($c,"rc2")===FALSE; } );
print_r($ciphers);
print_r($cipher_aliases);

第三个参数是加密密钥,比之前简单很多,需要注意的是openssl必须传iv变量,也就是openssl_encryptfafangfa方法的第五个参数,不然会报错滴。

初始化向量 $iv

初始化向量$ iv的要求类似于$password(加密密匙)的要求。它应该是与密码块大小相同长度的二进制字符串。过多的字节被丢弃,并且太短的$ iv被填充到零字节的块大小。
初始化向量应该是来自CSPRNG的随机字节的二进制串。不要重复使用IV。

旧版解密:

mcrypt_decrypt(MCRYPT_DES, $key, $strBin, MCRYPT_MODE_CBC,$key);

改为openssl为:

openssl_decrypt($strBin,'DES-CBC',$key,OPENSSL_RAW_DATA,$key)

写的较为简单,这里只是介绍一下浅显的应用

分类: PHP

发表评论

电子邮件地址不会被公开。 必填项已用*标注