唐伯虎 发表于 2021-7-8 18:49:55

Node.js从入门到放弃(七)

  
Node.js从入门到放弃(七)
  前言常用加密方式前端+后端的加密解密(java版)前端+后端的加密解密(node版)
前言
  这是该系列的第七篇文章,主要介绍Node.js中的加密解密
常用加密方式
  Node中有三种常用加密方式,安全性由低到高一次是md5,sha1,sha256。
借助Node中自带的crypto模块,可以轻松的完成一系列加密解密操作
  封装加密函数
const crypto = require("crypto");//打印支持的hash算法console.log(crypto.getHashes()); function encrypt(str, type = "md5", mode = "base64") {    // type可以是crypto.getHashes()任意一种,常用的是md5,sha1,sha256    // mode可以是base64,latin1,hex    const encryptType = crypto.createHash(type);    const encryptStr = encryptType.update(str).digest(mode);    return encryptStr;}//测试console.log("加密前:123456");console.log("加密后:" + encrypt("123456","md5","base64"));前端+后端的加密解密(java版)
  单向加密指的是理论上无法解密,非单向加密指的是每一个加密序列,都可以解开。使用场景不同,这两种需求都会有的,像上述三种都是单向加密。md5使用特别广,有人根据其加密序列采用了字典形式的暴力破解,不推荐一层两层的md5加密。涉及到前后端通信的业务处理,往往使用AES前台加密,后台根据情况决定是否需要解密
  登录时对用户密码的加密

[*]  安装 npm i crypto-js
[*]  封装加密函数
// key,iv长度为16位,可相同 自定义即可const Encrypt = word => {    const keyStr = '1234567898745621';    const ivStr = keyStr;    const key = CryptoJS.enc.Utf8.parse(keyStr);    const iv = CryptoJS.enc.Utf8.parse(ivStr);    const srcs = CryptoJS.enc.Utf8.parse(word);    const encrypted = CryptoJS.AES.encrypt(srcs, key, {        iv: iv,        mode: CryptoJS.mode.CBC,        padding: CryptoJS.pad.ZeroPadding    });    return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);}  传参处理

  后台解密处理
public class AesHelper {    //使用AES-128-CBC加密模式,key,iv长度为16位,可相同 自定义即可    private static String key = "1234567898745621";    private static String iv = "1234567898745621";    //解密方法--接收aes加密后的字符串序列    public static String desEncrypt(String str)  {        try {            byte[] decodeBytes =   Base64.getDecoder().decode(str);            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);            byte[] original = cipher.doFinal(decodeBytes);            String originalString = new String(original);            return originalString;        } catch (Exception e) {            System.out.println("解密失败:"+e.getMessage());            return null;        }    }}  使用
AesHelper.desEncrypt(password)//静态方法不需要new,直接用就ok前端+后端的加密解密(node版)
  后端封装加密函数
const crypto = require('crypto');function cipherFn(str) {    // 加密    let sign = '';    // key,v为16位随机字符串序列,可相同     //打印支持的cipher算法     // console.log(crypto.getCiphers());    const cipher = crypto.createCipheriv('aes-128-cbc',key, v);    sign += cipher.update(str, 'utf8', 'hex');    sign += cipher.final('hex');    return sign}  后端封装解密函数
const crypto = require('crypto');function decipherFn(str){    let res = '';    // 这里的key,v和上述加密的key,v一致    const cipher = crypto.createDecipheriv('aes-128-cbc',key,v);    res += cipher.update(str, 'hex', 'utf8');    res += cipher.final('utf8');    return res}

[*]  前端请求加密接口,传入要加密的数据字符串
[*]  前端在需要的地方请求解密接口,传入加密后字符串
[*]  确保加密解密函数的key,v不要外泄,数据就是安全的


  
文档来源:51CTO技术博客https://blog.51cto.com/u_14219805/3007599
页: [1]
查看完整版本: Node.js从入门到放弃(七)