Node.js從入門到放棄(七)

前言

這是該系列的第七篇文章,主要介紹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不要外泄,數據就是安全的
發佈了468 篇原創文章 · 獲贊 827 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章