php openssl 3des,记录 Openssl 替代 Mcrypt 3DES CBC 算法解决方案

楼主代码给了,我来给大家简单说一说这个函数 openssl_encrypt 的函数

PHP 7.0 开始就不推荐 Mcrypt 模块(这个模块太旧了,有十多年了,早就不安全了,而且有些算法名不太兼容事实上的密码套件 openssl)

首先上面的 openssl_encrypt/decrypt 为对称加密函数,优点是速度快,arm 芯片也能胜任大部分大部分对称加密函数的计算。

另外楼主的加密算法 DES-EDE3-CBC 为不推荐,不安全的对称加密算法,建议切换。目前对称加密算法(tls 1.2 标准)比较常用的 AES 算法。

其中算法后面的 CBC 三个字母为填充模式。加密过程为分块加密,即一个块一个块的加密,块越大,运算越复杂。

以 AES-256-CBC 算法的举例:即使用 AES(高级对称加密)- 256(分成 256 bit 一块一块的来加密,对应的密钥为 256 bit 即 32 为字符)-CBC(为填充模式,像上面的 pkcs5 填充即在,最后一块不够 256 bit 时填 0,pkcs7 则为块长 - 剩余,即最后剩了 1 byte 的话,则填充为 07,07,07,07,07,07,07。(8 - 1))。另外加密完后后时返回的是 byte,所以必须转成 hex 或 base64 才能传输。而以上这些填充,转成 base64 这些操作,openssl_encrypt 函数都自带了。所以

// option = 0 ,自动进行 pkcs7 填充(pkcs5 是 7 的子集,兼容),并返回 base64 格式。解密同样

openssl_encrypt($originString, "AES-256-CBC", $_256bitkey, 0, $iv);

另外加密这种一般会与别的语言进行交互,所以你要确保其他语言能解密,最好 iv 两边确定,只传输 key,贴一段 java 的解密

public static String decrypt(String encrypted) {

try {

SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(StandardCharsets.UTF_8), "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");

cipher.init(Cipher.DECRYPT_MODE, keySpec, IV);

byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));

return new String(original);

} catch (Exception ex) {

ex.printStackTrace();

}

return null;

}

另外直接升级 https 可以解决很多问题,https 的 tls 安全套件的算法更牛逼,1.2,1.3 基本能做到,一次消息一个密钥(截获了,解了只对应当前消息,即这条消息的密钥,不能解下条消息),椭圆曲线算法性能也更高,很多 CPU 指令都有对应优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值