加密/解密应用场景

  • 前言: 通常在前后端之间数据传输经常会涉及到一些敏感数据、cookie携带的token加密等问题。

  • 提到加密,相对于后台开发来说,遇到最多的需要加密处理的应用场景应该是接口的加密签名校验了。不过这种一般都用于服务端与服务端之间的相互调用。因为没有暴露在外的代码这种加密校验相对比较安全。但javaScript不一样,它是运行在浏览器端的一种脚本语言。基本除了在sojson.v6加密过的js代码,黑客可以通过逆向分析你的js代码来盗取一些数据。

常用的js加密:

  • 对称加密(AES):用的同一个密钥进行加解密的

    优点: 速度快

    缺点: 在传输密钥过程中,这个密钥容易被拦截,导致密钥泄漏,安全性不高

  • 非对称加密(RSA): 生成密钥,分别为公钥和秘钥,公钥对数据进行加密,私钥对数据进行解密

    优点: 只需要服务端把公钥,传递给前端,前端通过公钥进行加密,服务端通过私钥解密,安全性很高

    缺点: 速度慢

1、 js内置api(escape和unescape)
const code = 'hello world';const _enCode = escape(code); // 加密const _unescapeCode = unescape(code); // 解密console.log('加密code前:', code); // 加密code前: hello worldconsole.log('加密code后:',_enCode); // 加密code后:hello%20worldconsole.log('解密code后:', _unescapeCode); // 解密code后: hello world

由此可以看到用escape函数加密后,字符变成了%开头形式的特殊编码。需要用unescape反编译回来。escape/unescape通常应用于url中携带数据加密较为多些。

2、md5加密

我这里演示借助了crypto插件(项目里安装了),没有的话可以自行安装一下,安装地址: https://github.com/brix/crypto-js

import Crypto from "crypto";const user_key = 'md5_121212';const passWord = Crypto.createHash('md5').update(`${user_key}\n`).digest('hex');console.log('passWord:', passWord);

MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。md5加密一般用于确保文件和代码的唯一性,可以根据计算代码的md5值来判断代码是否被改变。不过md5属于对称加密范畴。

3、 des/aes加密方式

DES是一种使用密钥加密的块算法,已被美国联邦政府的国家标准局授权在非密级政府通信中使用

我这里演示借助了crypto插件(项目里安装了),没有的话可以自行安装一下,安装地址: https://github.com/brix/crypto-js

import crypto from "crypto";const message = 'hello des';const key = 9727;const keyHex = crypto.enc.Utf8.parse(key);const encrypted = crypto.DES.encrypt(message,keyHex,{mode: crypto.mode.ECB,padding: crypto.pad.Pkcs7,});// 打印加密结果console.log(encrypted.toString());
4、 RSA双向加密解密
  • RSA是被研究得最广泛的公钥算法,从提出到现在已近三十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。

  • 使用:服务端和客户端分别生成自己的RSA密钥,服务端拿客户端的公钥,客户端拿服务端的公钥,彼此的数据都可以加解密,但是缺点很明显,就是加解密数据速度慢。

插件安装地址: https://github.com/rzcoder/node-rsa

import rsa from 'node-rsa';const key = new rsa({b: 512});const text = 'hello rsa!';// 加密const encrypted = key.encrypt(text, 'base64');// 打印加密结果console.log(encrypted);// 解密const decrypted = key.decrypt(encrypted, 'utf8');// 打印解密结果console.log(decrypted);

以上介绍了几种加密方式,希望可以帮助得到你,有错误也可指出可以互相交流交流。