前端加密和压缩

前端加密和压缩

最早在开发前端项目时根本不在意数据安全这块的东西,主要是开发需求太多了,根本顾不过来。但是随着公司对数据安全的要求不断提高,我们也在这方面做了点东西。

废话不说,直接开始。

压缩

首先我用的是pako对数据进行压缩

安装依赖包

npm i pako --save-d

其实网上关于pako的使用文档有很多,我就不细说了 基本上我也是跟着文档进行的编写。但是唯独有一点需要注意的是,在对数据量较大的内容进行压缩的时候有个地方需要注意下。因为普通的文档中并没有提及这部分,我也是遇到问题才完善的代码。

zip.js:

import pako from 'pako'

class Zip {
    decode(str){
        if(!str) return str
        const _str = window.atob(str)
        const charData = _str.split('').map(t => t.charCodeAt(0))
        const bin = new Uint8Array(charData)
        const data = pako.inflate(bin)
        const array = new Uint16Array(data)
        // 兼容数据量大的操作的,不然会有问题
        const chunk = 8 * 1024
        let _d = '', i
        for (i = 0; i < array.length / chunk; i++) {
            _d += String.fromCharCode.apply(null, array.slice(i * chunk, (i + 1) * chunk))
        }
        _d += String.fromCharCode.apply(null, array.slice(i * chunk))
        const json = decodeURIComponent(_d)
        return JSON.parse(json)
    }

    encode(data){
        if(!data || (typeof data === 'object' && !Object.keys(data).length)) return data
        const str = JSON.stringify(data)
        const binary = pako.gzip(encodeURIComponent(str), {to: 'string'})
        return window.btoa(binary)
    }
}

加密

使用压缩的目的是为了减少加密的内容量,比如城市code这么个数据(绘制树形结构),其数据内容量是很大的。其实加密才是主要的功能。

加密的方法有很多种:AES、RSA、md5、SHA等
一般登录或注册时提交的密码部分都是用md5去加密(不需要解密)
在前后端数据交互的时候我选用的是AES(比较高效并简单)

前后端商量一个密钥(key)和偏移量(iv)就可以了
crypt.js:

import CryptoJS from "crypto-js"

class Crypt {
    encrypt(params){
        const key = '123456'
        const iv = '654321'
        let cipher
        if (params) {
            const data = CryptoJS.enc.Utf8.parse(JSON.stringify(params))
            cipher = CryptoJS.AES.encrypt(data, key, {
                iv,
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.Pkcs7
            }).toString()
        }
        return { key, iv, cipher }
    }

    decrypt(data){
        const { key, iv, cipher } = data
        const json = CryptoJS.AES.decrypt(cipher, key, {
            iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        }).toString(CryptoJS.enc.Utf8)
        return JSON.parse(json)
    }
}

在封装请求的地方引用该方法就可以了。

另外除了在前后交互数据时进行加密,也可用在前端路由携带参数时进行加密。前后都有注意encodeURIComponentdecodeURIComponent一下,避免中文字符变成乱码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值