一、 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 格式;
- 在公钥秘钥的存储中最好严格保留秘钥的换行符;
- 在需要设置秘钥位数和格式的情况下请确保秘钥位数和格式的统一;