一、 AES 加密與解密
高階加密標準(AES,Advanced Encryption Standard)為最常見的對稱加密演算法(微信小程式加密傳輸就是用這個加密演算法的)。是一種對稱加密演算法也就是加密和解密用相同的金鑰;
1.1 使用 crypto-js 實現 AES 加密
1.1.1 引數說明
- data 要加密的明文
- key 祕鑰
- iv 偏移
- mode 加密的模式
- padding 填充
1.1.2 程式碼演示
const CryptoJS = require('crypto-js');
const encrypt = (data) => {
const key = CryptoJS.enc.Latin1.parse('sd7JD8sKzc8MHdf8');
const iv = CryptoJS.enc.Latin1.parse('29JlOd8SCdk82CFd');
const encrypted = CryptoJS.AES.encrypt(
data,
key,
{
iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding
});
return `${encrypted}`;
}
複製程式碼
1.2 使用 實現 AES 解密
1.2.1 引數說明
- data 要加密的明文
- key 祕鑰
- iv 偏移
- mode 加密的模式
- padding 填充
1.2.2 程式碼演示
const decrypt = (data) => {
const key = CryptoJS.enc.Latin1.parse('sd7JD8sKzc8MHdf8');
const iv = CryptoJS.enc.Latin1.parse('29JlOd8SCdk82CFd');
decrypted='';
decrypted=CryptoJS.AES.decrypt(
data,
key,
{
iv : iv,
mode : CryptoJS.mode.CBC,
padding : CryptoJS.pad.ZeroPadding
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
複製程式碼
二、 RSA 加密與解密
RSA加密演算法是一種非對稱加密演算法。在公開金鑰加密和電子商業中RSA被廣泛使用。在使用 RSA 進行加密和解密時需要一對公鑰和私鑰,公鑰一般儲存在前端(前端使用公鑰進行加密),而私鑰一般儲存與後端(後端使用私鑰對密文進行解密);
3.1 公鑰私鑰的獲取
- Linux 下可直接通過終端命令來獲取;
- 通過線上網站生成:
http://web.chacuo.net/netrsakeypair
(選擇合適的祕鑰位數和格式);
3.2 jsencrypt 庫實現 RSA 加密
import JSEncrypt from 'jsencrypt';
const encrypted = (data) => {
var encrypt = new JSEncrypt();
const pubkey = `
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDpxv+yCAYuwXCSxLviAFyiy3V0
rvveRTbzt4KKASqzbwSJ4Kst73HFFka5GaI4nnQZQt4OzJUD3jNYKphE6WdDpSEJ
VuTbIzEoV0j9AS56gCF0YP8o8vTT3hQm2WtS+biG7sxJgDefdaWSaN6utwFZFfTh
RvBBeuOMIPb6X60lIwIDAQAB
-----END PUBLIC KEY-----`;
encrypt.setPublicKey(pubkey);
return encrypt.encrypt(data);
}
複製程式碼
3.3 jsencrypt 庫實現 RSA 解密
import JSEncrypt from 'jsencrypt';
const uncrypted = (encrypted) => {
var decrypt = new JSEncrypt();
const privkey = `
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOnG/7IIBi7BcJLE
u+IAXKLLdXSu+95FNvO3gooBKrNvBIngqy3vccUWRrkZojiedBlC3g7MlQPeM1gq
mETpZ0OlIQlW5NsjMShXSP0BLnqAIXRg/yjy9NPeFCbZa1L5uIbuzEmAN591pZJo
3q63AVkV9OFG8EF644wg9vpfrSUjAgMBAAECgYAbuTnBhyoUiWQsQ6B0YM6bj71S
JR5Bcbvekzir3Q+PT+8d2sLyI58+XDHu6ZdPV5s1E7T51FEnsEYugn6kTXmtVfP/
rg46H8t8iMkHZ99APeyeDw7xuvuTMZTU+7LO+kwdjjQazIcUd9UhBmBJkZXOJmG5
HG6TuFjuYHELn0xQwQJBAPiJ5FCH9h1rhxYMtyE7octuRH/bB7235UGXfgcMcitF
SXmwFCyyXh5pYUxAjV0BVWYTbvqnDoZbQjXMMYiWUokCQQDwy6k9Pe0f8C0Jtw/1
Etv2BaqN1sN3d8E/3MGTANlCjmLuZuFgolcdvMGp0NuXayPUP8y+Ie5YpQ2pTwPa
6X9LAkAv1TIIwbH/RYORHc9c6QIhic5LIRdjTvIjZomNx7ptU39pmRa453cvuS5N
o5rRTIFoDNNuEBq+hu++NNdPp0apAkBuUzGwYI4jgvxvphNGmyRyvTfektauBw1g
wDlkrA/fAbPsPPDoQJkfg9tLfekOoEUjOzQIrS0yKjVvLEe85hyvAkEArluaKhJc
gd+ptsqbAnbQClxhnRYP+OjCM89X+hE24iPDmGMjAZ2mCbl8Px8wGZ9HAbwyo6k9
IanXW1Ad0NJlGw==
-----END PRIVATE KEY-----`;
decrypt.setPrivateKey(privkey);
return decrypt.decrypt(encrypted);
}
複製程式碼
3.4 補充說明:
- RSA 加密後的密文為 base64 格式;
- 在公鑰祕鑰的儲存中最好嚴格保留祕鑰的換行符;
- 在需要設定祕鑰位數和格式的情況下請確保祕鑰位數和格式的統一;