之前公司做的支付,用的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);
第三个参数是加密密钥,比之前简单很多。第四个参数有多种,一般可传0,若需自动补全可使用其余参数,比如例子里面用的OPENSSL_RAW_DATA
。需要注意的是openssl必须传iv变量,也就是openssl_encrypt方法的第五个参数,不然会报错滴。
初始化向量 $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)
写的较为简单,这里只是介绍一下浅显的应用
1 条评论
感谢 · 2019年5月30日 23:50
感谢 解决我一个问题