当前位置: 首页 > Web前端 > vue.js

关于前端加aes加密

时间:2023-03-31 14:51:55 vue.js

作为前端,昨天接到一个小请求,是创建一个实名认证页面,给出的接口文档如下。说实话,刚开始看上面这段话的时候有点懵,里面到底是什么加密方式,padding,datablocks等等。但是仔细搜索了一下,发现并没有想象中那么难。AES是一种常用的对称加密算法,它使用相同的密钥进行加密和解密。但在应用中需要注意的是,如果加解密一方使用Nodejs,另一方使用Java、PHP等语言,则需要仔细测试。如果不能正确解密,需要确认双方是否遵循相同的AES算法,stringkey和IV是否相同,加密后的数据是否统一为hex或base64格式。AES的麻烦与其他加密相比,AES加密似乎有多种模式,包括ECB、CBC等,而每种模式又包括IV参数和Padding参数,不同的语言对AES加密的库设计也不同。这些使得AES加密在不同人之间协调起来非常麻烦。AES属于块加密。不难理解,加密的字符串越长,代价越大,所以通常会把明文分段,然后对每个明文进行加密,最后组装成一个字符串。块加密面临的一个问题是如何填充最后一个块?所以这就是PADDING的作用,用各种方法把最后一块字符串填满,所以对于解密端来说,也需要用同样的PADDING来求出最后一块真正数据的长度。加密模式AES分为ECB、CBC、CFB等几种模式,除了ECB因为没有使用IV不是很安全,其他模式区别不是太明显。大部分区别在于IV和KEY对加密的计算。写法略有不同。详情请参考WIKI说明。另外,AES分为AES128、AES256等,表示期望密钥的长度。例如,AES256密钥的长度应该是256/8的32个字节。有些语言库会自动截取它,让人以为任意长度的key都可以。这实际上有所作为。IVIV的作用称为初始向量。不同IV的加密字符串是不同的。加密和解密需要相同的IV。由于IV看起来与密钥相同,因此每个块都有一个额外的IV。例如key不变,只是用户提供第一个块的IV,其他块IV自动生成。IV的长度为16个字节。如果超过或不足,可能的库将被填充或截断。但是由于block的长度是16字节,所以一般可以认为需要的IV是16字节。因为上图中对iv没有要求,所以勾选了PADDINGAESblockencryption可以忽略。前面说过,PADDING是用来填充最后一个block,使之成为一个完整的block,所以加密和解密的两端都需要使用相同的PADDING模式。大多数PADDING模式是PKCS5、PKCS7、NOPADDING。PKCS5Padding和PKCS7Padding是一样的,所以思路如下:1.因为项目是用vue-clip搭建的,所以使用npminstallcrypto-js--save-dev或者cnpminstallcrypto-js--save-dev2.创建一个js,从'crypto-js'constkey='xxxxxxxx'exportdefault{encrypt(text){returnCryptoJS.AES.encrypt(text,CryptoJS.enc.Utf8.parse(key),{//iv:CryptoJS.enc.Utf8.parse(key),模式:CryptoJS.mode.ECB,填充:CryptoJS.pad.Pkcs7}).toString()},decrypt(text){letdecrypted=CryptoJS.AES.decrypt(text),CryptoJS.enc.Utf8.parse(key),{//iv:CryptoJS.enc.Utf8.parse(iv),模式:CryptoJS.mode.CBC,填充:CryptoJS.pad.Pkcs7})returndecrypted.toString(CryptoJS.enc.Utf8)}}crypto.js是纯JavaScript编写的加密算法类库,可以方便地在javascript中进行MD5、SHA1、SHA2、SHA3、RIPEMD-160哈希,并进行AES、DES、Rabbit、RC4,三重DES加密解密。参考以下链接https://www.cnblogs.com/EnSna...https://blog.csdn.net/lzrit/a...https://www.liaoxuefeng.com/w...https://www.npmjs.com/package...https://www.cnblogs.com/secre...