前言
如今,数据安全和隐私保护变得至关重要。本文旨在引领大家探索前端数据加密与解密的基本概念,并介绍常用的加密算法,让大家深入了解数据加解密的世界,探究其背后的原理、最佳实践和常见应用场景。
前端主流加密方式
-
对称加密
对称加密使用相同的密钥来加密和解密数据。常见的对称加密算法包括
AES
(高级加密标准)、DES
(数据加密标准)和3DES
。 -
非对称加密
非对称加密使用一对密钥,即公钥和私钥。公钥用于加密数据,私钥用于解密数据。算法示例:常见的非对称加密算法包括
RSA
、DSA
和SM2
。 -
散列加密
散列加密是用于创建数据的固定长度哈希值的过程。哈希值通常是不可逆的。算法示例:常见的散列算法包括
SHA-256
、MD5
和SHA-1
。 -
混淆加密
混淆加密是通过混淆代码或者加入噪音的方式来增强安全性,常见的方式有代码混淆、字符替换等。不是一种加密算法。
总结
- 对称加密使用相同的密钥进行加密和解密,适用于快速加密和解密大量数据。
- 非对称加密使用一对密钥,公钥用于加密,私钥用于解密,适用于安全通信和数字签名。
- 散列加密用于生成数据的固定长度哈希值,通常不可逆,用于数据完整性验证。
- 混淆加密是一种用于隐藏代码或数据的技术,不是标准的加密方法,常用于软件保护。
sm2 加密(非对称)
SM2
是一种非对称加密算法,使用公钥进行加密,私钥进行解密。- 椭圆曲线密码算法:
SM2
基于椭圆曲线密码算法(Elliptic Curve Cryptography
,ECC
)实现。 - 密钥长度:
SM2
的密钥长度为256
位(32
字节)。 - 安全性:
SM2
具有较高的安全性,适用于数字签名、密钥交换、身份认证等场景。 - 应用场景:
SM2
广泛应用于数字证书、电子签名、安全通信等领域。
miniprogram-sm-crypto
miniprogram-sm-crypto
是专门为微信小程序环境开发的国密加密库。它被设计用于在微信小程序中进行加密操作。『官网地址』
安装
npm install miniprogram-sm-crypto --save
获取公私钥
const sm2 = require("miniprogram-sm-crypto").sm2;const keyPair = sm2.generateKeyPairHex();const publicKey = keyPair.publicKey;
const privateKey = keyPair.privateKey;console.log("公钥:", publicKey);
console.log("私钥:", privateKey);
打印结果
实例
封装文件
// 引入 miniprogram-sm-crypto 库中的 SM2 模块
const sm2 = require("miniprogram-sm-crypto").sm2;// SM2加密函数
function sm2Encrypt(msgString) {let msg = msgString;// 检查传入的消息是否为字符串,如果不是字符串则转换为 JSON 字符串if (typeof msgString !== "string") {msg = JSON.stringify(msgString);}let cipherMode = 1; // 加密模式固定为1let publicKey ="你的sm2公钥"; // SM2公钥// 使用 SM2 加密算法对消息进行加密let encryptData = sm2.doEncrypt(msg, publicKey, cipherMode); // 加密结果return encryptData;
}// SM2解密函数
function sm2Decrypt(msgString) {let msg = msgString;let cipherMode = 1; // 解密模式固定为1let privateKey = "你的sm2私钥"; // SM2私钥// 使用 SM2 解密算法对消息进行解密let decryptData = sm2.doDecrypt(msg, privateKey, cipherMode); // 解密结果return decryptData;
}// 导出加密和解密函数
module.exports = {sm2Encrypt,sm2Decrypt,
};
使用文件
const {sm2Encrypt,sm2Decrypt} = require('../../utils/index');//引入加密模块onLoad(){// 加密数据const originalData = {name: 'Alice',age: 30};const encryptedData = sm2Encrypt(originalData);// 解密数据const decryptedData = sm2Decrypt(encryptedData);console.log('加密后的数据:', encryptedData);console.log('解密后的数据:', JSON.parse(decryptedData));
}
打印结果
sm-crypto
sm-crypto
是适用于 Node.js
环境的国密加密库。它可以在 Node.js
中使用,但不适用于浏览器或微信小程序环境。『官网地址』
安装
npm install --save sm-crypto
获取公私钥
const sm2 = require('sm-crypto').sm2;let keypair = sm2.generateKeyPairHex();
let publicKey = keypair.publicKey; // 公钥
let privateKey = keypair.privateKey; // 私钥console.log("公钥: ", publicKey);
console.log("私钥: ", privateKey);
打印结果
实例
封装文件
import smCrypto from 'sm-crypto';
const sm2 = require('sm-crypto').sm2;// 生成密钥对
let keypair = sm2.generateKeyPairHex();
let publicKey = keypair.publicKey; // 公钥
let privateKey = keypair.privateKey; // 私钥export default {// 使用公钥加密数据encrypt(data) {try {return smCrypto.sm2.doEncrypt(data, publicKey, 1);} catch (error) {console.error("Encryption error: " + error.message);return null;}},// 使用私钥解密数据decrypt(encryptedData) {try {return smCrypto.sm2.doDecrypt(encryptedData, privateKey, 1);} catch (error) {console.error("Decryption error: " + error.message);return null;}},// 使用私钥对数据进行签名sign(data) {try {return smCrypto.sm2.doSignature(data, privateKey);} catch (error) {console.error("Signature error: " + error.message);return null;}},// 使用公钥验证数据的签名verify(data, signature) {try {return smCrypto.sm2.doVerifySignature(data, signature, publicKey);} catch (error) {console.error("Signature verification error: " + error.message);return false;}},// 计算数据的哈希值hash(data) {try {return smCrypto.sm3(data);} catch (error) {console.error("Hash calculation error: " + error.message);return null;}},// 使用公钥加密 JSON 对象encryptObject(data) {try {const dataStr = JSON.stringify(data);const encryptedData = smCrypto.sm2.doEncrypt(dataStr, publicKey, 1);return encryptedData;} catch (error) {console.error("Object encryption error: " + error.message);return null;}},// 使用私钥解密加密的 JSON 对象decryptObject(encryptedData) {try {const decryptedDataStr = smCrypto.sm2.doDecrypt(encryptedData, privateKey, 1);const decryptedData = JSON.parse(decryptedDataStr);return decryptedData;} catch (error) {console.error("Object decryption error: " + error.message);return null;}}
};
main.js
文件
import smCrypto from './utils/smCrypto';
Vue.prototype.$smCrypto = smCrypto;
任意使用文件
mounted() {// 加密对象const originalData = { name: "John", age: 30 };const encryptedData = this.$smCrypto.encryptObject(originalData);console.log("加密后的对象:", encryptedData);// 解密对象const decryptedData = this.$smCrypto.decryptObject(encryptedData);console.log("解密后的对象:", decryptedData);
},
打印结果
04补位问题
在 SM2
算法中,对于加密的数据,需要进行 04
补位,以确保数据的长度符合 SM2
算法的要求。但上面我们使用的是 sm-crypto
库,该库已经封装了 04
补位的功能,所以就不需要手动进行 04
补位操作。当调用 smCrypto.sm2.doEncrypt
方法时,该方法会自动进行 04
补位操作。同样,当调用 smCrypto.sm2.doDecrypt
方法时,该方法也会自动去除 04
补位。
sm4 加密(对称)
SM4
是一种对称加密算法,使用相同的密钥进行加密和解密。- 块密码算法:
SM4
以128
位(16
字节)的分组大小进行加密,对每个分组进行独立的加密操作。 - 密钥长度:
SM4
的密钥长度为128
位(16
字节)。 - 加密速度:
SM4
具有较高的加密速度,适用于大量数据的加密和解密操作。 - 应用场景:
SM4
广泛应用于数据加密、网络通信、存储介质加密等领域。
实例
封装文件
// 导入'miniprogram-sm-crypto'包中的sm4模块
const sm4 = require('miniprogram-sm-crypto').sm4;// 以十六进制格式定义加密密钥
const hexKey = "yuorpasword";// 使用TextEncoder将十六进制密钥转换为字节数组
const keyBytes = new TextEncoder().encode(hexKey);// 使用SM4算法的加密函数
function sm4Encrypt(text) {// 使用指定的参数使用SM4算法对文本进行加密const cipherText = sm4.encrypt(text, keyBytes, 'ecb', 'base64', '1234567891011121');return cipherText;
}// 使用SM4算法的解密函数
function sm4Decrypt(text) {// 使用指定的参数使用SM4算法对文本进行解密const decryptedText = sm4.decrypt(text, keyBytes, 'ecb', 'base64', '1234567891011121');return decryptedText;
}// 导出加密和解密函数以供外部使用
module.exports = {sm4Encrypt,sm4Decrypt
};
使用文件
const plaintext = "Hello, World!";
const encryptedText = util.sm4Encrypt(plaintext);
console.log("加密后的文本:", encryptedText);
const decryptedText = util.sm4Decrypt(encryptedText);
console.log("解密后的文本:", decryptedText);
打印结果
MD5 加密(不可逆)
MD5
是一种单向哈希算法,即将任意长度的“消息”经过哈希运算,生成一个 128
位的“指纹”。使用 MD5
加密可以将原始的字符串转化为不可逆的密文,从而保证数据在传输中不被篡改,提高安全性。在前端中,我们可以通过 JS
库调用 md5
加密函数进行字符串加密,以保护用户信息。
安装
npm install --save js-md5
1. 常规使用
<script>
import md5 from "js-md5";
export default {mounted() {const hashedText = md5("123456789");console.log("加密后:", hashedText);},
};
</script>
2. 加盐使用
为了增强加密的安全性,我们可以在原始字符串的基础上再加上一段随机的字符串,这个字符串就是“盐”。
<script>
import md5 from "js-md5";
export default {mounted() {const hashedText = md5("123456789");console.log("加密后:", "hello world" + hashedText);},
};
</script>
3. 多次加密使用
为了提高加密的强度,我们可以将加密结果再次进行 md5
加密,多次加密后的结果更加难以破解。
<script>
import md5 from "js-md5";
export default {mounted() {const hashedText = md5(md5("123456789"));console.log("加密后:", hashedText);},
};
</script>
md5
使用注意事项
- 不要使用固定的密钥进行加密,否则容易被破解。应该采用随机密钥或者动态生成密钥进行加密。
- 不要将加密算法公开,否则可能会被攻击者破解。应该将加密算法保密,仅在需要的场合使用。
- 即使在前端进行加密,也应该在后端进行加密验证,以增强应用的安全性。