base64
介绍:严格而言不算一种加密方式,不过也可以用于对明文数据进行转换,使之变为不能被人直接识别的形式。
-
使用演示:
//浏览器自带方法 btoa用于加密,atob用于解密 加密前:123 加密方法:btoa(123) 加密后:MTIz 解码前:MTIz 解密方法:atob("MTIz") 解密后:123 //或者 npm install --save js-base64 // 引入 import { Base64 } from 'js-base64'; // 加密 Base64.encode('123'); // MTIz // 解密 Base64.decode(a); // 123
MD5
介绍:属于不可逆的一种,一般后台存储
password
的时候会采取MD5的方式进行存储-
使用演示:
npm install js-md5 // 引入 import md5 from 'js-md5'; md5('holle') // bcecb35d0a12baad472fbe0392bcc043
对称加密
介绍:使用同一个
密钥
进行加解密,相当于发送方
使用一个密钥对数据进行加密后,接受方
也使用同一个密钥对加密数据进行解密-
使用演示:
import CryptoJS from "crypto-js"; const key = CryptoJS.enc.Utf8.parse("87R6W73IO8C43P32"); //十六位十六进制数作为密钥 const iv = CryptoJS.enc.Utf8.parse("T7K702065Y9BZSZU"); //十六位十六进制数作为密钥偏移量 //加密 function encrypt(text) { return CryptoJS.AES.encrypt(text, CryptoJS.enc.Utf8.parse(key), { iv: CryptoJS.enc.Utf8.parse(iv), mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, }); } //解密 function decrypt(text) { const result = CryptoJS.AES.decrypt(text, CryptoJS.enc.Utf8.parse(key), { iv: CryptoJS.enc.Utf8.parse(iv), mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, }); return result.toString(CryptoJS.enc.Utf8); } const text = "123456"; const encoded = encrypt(text); //加密 console.log(encoded.toString()); //解密 console.log(decrypt(encoded));
非对称加密
介绍:非对称加密就是加密和解密使用的不是相同的
密钥
:只有同一个公钥-私钥
对才能正常加解密,每次加密后的密文
都不一样-
使用演示:
/** * 前端用这个 * * npm install jsencrypt * import { JSEncrypt } from 'jsencrypt' * */ /** * node 后端用这个 * * npm install --save node-jsencrypt * const JSEncrypt = require('node-jsencrypt') */ import JSEncrypt from "node-jsencrypt"; //后端可以使用 node-jsencrypt 解密 也可以使用 node-rsa 解密 jsencrypt 加密的数据 import NodeRSA from "node-rsa"; //公钥 const pubKey = `-----BEGIN PUBLIC KEY----- MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgFEFW0YUF5sN05Hu8sj4fJswJYR/ yXDJklYLdIjPzXH7uf17goTpyULezXpYlfXvSQKrHRdJ8vVpboLny8kRKvi8Ue/p RZBjklpZLbBXVONvjGacvlgLmE0s/pD43qHd2bwhWL0AbF6HEFLyLskfPUzQLwaI 5ih1BiXrsRTJGFqhAgMBAAE= -----END PUBLIC KEY-----`; //私钥 const priKey = `-----BEGIN RSA PRIVATE KEY----- MIICWgIBAAKBgFEFW0YUF5sN05Hu8sj4fJswJYR/yXDJklYLdIjPzXH7uf17goTp yULezXpYlfXvSQKrHRdJ8vVpboLny8kRKvi8Ue/pRZBjklpZLbBXVONvjGacvlgL mE0s/pD43qHd2bwhWL0AbF6HEFLyLskfPUzQLwaI5ih1BiXrsRTJGFqhAgMBAAEC gYA6uohDzvKheS9AHBWuqbghAZBgcASDlglWB62sMfz4v4A9BpdAYvp5V2lYYvgo sg+ZOJG4vOi5DXiGuSDVmXUs0P21+1Wb6UuaTC2S5ReWrTpZQ7qgmnVuwW7AziOE 0H8eTHEOrg4AqRcK2lHRn/UlbInvzY/+oPPMhW8mzHqKxQJBAJIQzQlJvPuyX0Oy 7qDfPlLacJz1fsJC4H1kzr30ERWjfiyXFWj3byOAnzOYDJ1Gq/z4xU1rVtE171cY GVXMn5cCQQCOABC5kCCPKwYE6Ml4G3ffiq204Rz8oLeabiUfXy/n1vj/IjI+AK0n QtXHZALJHUaA1y6P/r0BjRH9EDSD956HAkBYdPZG3rIlV7Oboxwirq/mq0UxuPao HKopJkiR/uHt0dJSnLiplddnj7haHYXeJXN4wwtxxESSdHBatUx6im5HAkA1OJsM IZPCdRqdbm5MYOct1nlCiPjnSolmDRBG0NNQrobGgReZm4FKbMdZIwfUPu+0zHG8 MHrAgRIT6iX0rDMzAkAoPpoIeK2C7QdBQfuQYdp/VH0TAGY6btmBK6UXi8SRRYp5 0RERmqRwb9Mc3gYgxVUF1R5cBMJjSTCRqOUkfusR -----END RSA PRIVATE KEY-----`; // 加密内容 const txt = "123"; // 加密 const encrypted = new JSEncrypt(); encrypted.setPublicKey(pubKey); const encryptedValue = encrypted.encrypt(txt); // HsFuawMMmkAUwSVHs/pSRVdfHuEOA6VjrKbXpUfN01RWgsc2L6IO6BNIFaYDOXWmbAxvRX28ml6xx2+mWtmx7RSEdexgXiDD2kxoSP6XXCi8yvr94YvMo3YR2NSzCFJo/XxGBMYYpwuuQKqOblSlW6mhaB9onzWfqYei3LLUwiI= console.log(encryptedValue); // //解密 // const decrypted = new JSEncrypt(); // decrypted.setPrivateKey(priKey); // const decryptionValue = decrypted.decrypt(enc); // console.log(decryptionValue) const decrypted = new NodeRSA(priKey); // 因为jsencrypt自身使用的是pkcs1加密方案, nodejs需要修改成pkcs1。 decrypted.setOptions({ encryptionScheme: "pkcs1" }); const decryptionValue = decrypted.decrypt(encryptedValue, "utf8"); // 123 console.log(decryptionValue);
总结:
- 各加密算法加密数据后特征:
// 如果是 RSA建议采用1024位的数字,ECC建议采用160位,AES采用128 主要是为了加解密速度
//1. base64加密
// 结尾处一般没有什么符号,中间可能有 / 之类的,长度一般比较短,不算很长
MTIzNDU2
6Zi/5p2+5aSn
//2. MD5加密
// 一般全是字母加数字 长度一般比较短,不算很长
bcecb35d0a12baad472fbe0392bcc043
D35803BC4BC2143C218A0C6FE107FD79
//3. 对称加密算法,加密后的结果不会变
// 结尾处一般会有 = == 符号结尾 长度不算很长
// 对称加密中的 AES 加密 一般结尾会有 ==
wuAdJRRgJyoBcG4Rg/gYng==
// 对称加密中的 DES 加密 一般结尾会有 =
TT398xn+XlU5LDYjyTjuj4M5eVNDtBoK2yOdXha9its=
//4. 非对称加密 (RSA)
// 结尾处一般会有 = 符号结尾 长度比较长,且每次密文都不一致
UJ8Ng/eqmZrs6co4/ZytHtPdR4SAUs+qD59T/7nTTBC6R6AvCnsx5COToPr+0tmffbNEof5cwZ5f939/pFA7JZErsPnb0i9W+hnNPJK3dk+NvCMDcOxLoX7ETTV+scOnM1IRlMW0bY0vtXTLKRmkVPkPyJkhTY+598r2wnSefl4=