资讯专栏INFORMATION COLUMN

php中使用openssl_encrypt代替mcrypt_encrypt实现js加密php解密的方

FullStackDeveloper / 2210人阅读

摘要:项目背景因为自己开发的接口希望在传递的工程中可以保证参数是密文的形式,主要是前端使用加密,后端使用解密在网络上搜索了很多的方法,但是大部分的都是使用和进行端的加解密,但是众所周知的问题,这两个方法在以后将会被废弃,故而采用。

项目背景

因为自己开发的接口希望在传递的工程中可以保证参数是密文的形式,主要是前端使用js加密,后端使用php解密

在网络上搜索了很多的方法,但是大部分的都是使用mcrypt_decrypt和mcrypt_encrypt进行php端的加解密,但是众所周知的问题,这两个方法在php7.1以后将会被废弃,故而采用。

实现方式说明

php使用mcrypt_decrypt和mcrypt_encrypt的组合方式,以及openssl_decrypt和openssl_encrypt的组合方式

js端使用Crypto-js

为了说明两种方式的区别,在使用mcrypt_decrypt和mcrypt_encrypt方式的时候,使用crypto-helper-zeropadding.js来命名自定义的js加密帮助类,使用test_crypto_zeropadding.html来命令对应的测试html文件;在使用openssl_decrypt和openssl_encrypt的组合方式的时候,使用crypto-helper-pkcs7.js来命名自定义的js加密帮助类,使用test_crypto_pcks7.html来命名测试页面 ,详细的区别可以参见 帖子
https://segmentfault.com/q/10...

demo地址

github地址

方法一 :使用mcrypt_decrypt和mcrypt_encrypt php加密解密类

js端的关键代码
自定义封装的crypto-helper-zeropadding.js
var IV = "1234567890123412";

var KEY = "201707eggplant99"
/**
 * 加密
 */
function encrypt(str) {
    key = CryptoJS.enc.Utf8.parse(KEY);// 秘钥
    var iv= CryptoJS.enc.Utf8.parse(IV);//向量iv
    var encrypted = CryptoJS.AES.encrypt(str, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding });
    return encrypted.toString();
}
/**
 * 解密
 * @param str
 */
function decrypt(str) {
    var key = CryptoJS.enc.Utf8.parse(KEY);// 秘钥
    var iv=    CryptoJS.enc.Utf8.parse(IV);//向量iv
    var decrypted = CryptoJS.AES.decrypt(str,key,{iv:iv,padding:CryptoJS.pad.ZeroPadding});
    return decrypted.toString(CryptoJS.enc.Utf8);
}
js测试调用页面test_crypto_zeropadding.html

test crypto-js









js端页面运行效果

方法二 :openssl_decrypt和openssl_encrypt的组合方式 php加密解密类

js端的关键代码
自定义封装的crypto-helper-pkcs7.js
var IV = "1234567890123412";

var KEY = "201707eggplant99"
/**
 * 加密
 */
function encrypt(str) {
    key = CryptoJS.enc.Utf8.parse(KEY);// 秘钥
    var iv= CryptoJS.enc.Utf8.parse(IV);//向量iv
    var encrypted = CryptoJS.AES.encrypt(str, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7});
    return encrypted.toString();
}
/**
 * 解密
 * @param str
 */
function decrypt(str) {
    var key = CryptoJS.enc.Utf8.parse(KEY);// 秘钥
    var iv=    CryptoJS.enc.Utf8.parse(IV);//向量iv
    var decrypted = CryptoJS.AES.decrypt(str,key,{iv:iv,padding:CryptoJS.pad.Pkcs7});
    return decrypted.toString(CryptoJS.enc.Utf8);
}
test_crypto_pcks7.html代码

test crypto-js








参考资料

前端基于jsencrypt、php基于openssl的rsa非对称加密的实现

PHP OpenSSL&Mcrypt实现AES加密

crypto-js项目地址

为什么 CryptoJS DES 加密的结果和 Java DES 不一样

JS AES加密与PHP解密

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23228.html

相关文章

  • php使用openssl_encrypt代替mcrypt_encrypt实现js加密php解密的方

    摘要:项目背景因为自己开发的接口希望在传递的工程中可以保证参数是密文的形式,主要是前端使用加密,后端使用解密在网络上搜索了很多的方法,但是大部分的都是使用和进行端的加解密,但是众所周知的问题,这两个方法在以后将会被废弃,故而采用。 项目背景 因为自己开发的接口希望在传递的工程中可以保证参数是密文的形式,主要是前端使用js加密,后端使用php解密 在网络上搜索了很多的方法,但是大部分的都是使...

    wuyumin 评论0 收藏0
  • PHP7.1废弃加密方法替换方案

    摘要:废弃加密方法替换方案前瞻最近,我负责在重构项目的支付渠道,因为之前都是接一个渠道在的方式,代码显的比较混乱,恰巧整体项目在微服务化,所以我们决定将支付做成一个微服务,独立出来。 PHP7.1废弃加密方法替换方案 前瞻 最近,我负责在重构项目的支付渠道,因为之前都是接一个渠道在ifelse的方式,代码显的比较混乱,恰巧整体项目在微服务化,所以我们决定将支付做成一个微服务,独立出来。当前比...

    afishhhhh 评论0 收藏0
  • php如何openssl_encrypt加密解密

    摘要:密钥长度是位,超过位数密钥被忽略。跨语言做加密解密经常会出现问题,往往是填充方式不对编码不一致或者加密解密模式没有对应上造成。是为了兼容用加密的结果。 最近在对接客户的CRM系统,获取令牌时,要用DES方式加密解密,由于之前没有搞错这种加密方式,经过请教了百度和谷歌两个老师后,结合了多篇文档内容后,终于实现了。 一、DES介绍 DES 是对称性加密里面常见一种,全称为 Data Enc...

    JouyPub 评论0 收藏0
  • PHP 常用类分享(记录)

    摘要:加密解密类由于开始废弃传统的加密函数而改用,因此该类支持的版本为简易加解密类通用秘钥所有可用的加密类型可参考构造函数加密类型。 加密解密类 由于 PHP7.1 开始废弃传统的加密函数 mcrypt_encrypt 而改用 openssl_encrypt,因此该类支持的 PHP 版本为: (PHP 5 >= 5.3.0, PHP 7)

    seal_de 评论0 收藏0
  • PHP mcrypt_encrypt加密使用java解密

    摘要:使用给定的和加密的数据,没有使用函数填充的情况下,如果数据长度不是分组大小,则在其后使用补齐。 PHP mcrypt_encrypt使用给定的 cipher 和 mode 加密的数据,没有使用pkcs5_pad()函数填充的情况下,如果数据长度不是n*分组大小,则在其后使用0补齐。 Java 不能使用AES/ECB/PKCS5Padding,因为填充方式与php不同,不能正常的解密 在...

    Corwien 评论0 收藏0

发表评论

0条评论

FullStackDeveloper

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<