了解国密
国密算法是指中国自主研发的密码算法标准,也被称为“中国密码算法”。它们是由国家密码管理局发布和推广的一系列密码算法,包括对称加密算法(如SM1、SM4)、非对称加密算法(如SM2)、散列函数(如SM3)、签名算法等。
SM2是国产的椭圆曲线公钥密码算法,用于数字签名、密钥交换等。
SM3是国产的密码杂凑算法,用于数据完整性校验和消息认证。
SM4是基于分组密码结构的对称加密算法,用于保护机密信息的传输和存储。
使用
1、项目安装工具
npm install --save sm-crypto
2、封装方法
/**
* 加解密的工具类
* 使用:https://github.com/JuneAndGreen/sm-crypto
*
*/
import smCrypto from 'sm-crypto';
const sm2 = smCrypto.sm2;
const sm3 = smCrypto.sm3;
const sm4 = smCrypto.sm4;
const cipherMode = 1; // 1 - C1C3C2,0 - C1C2C3,默认为1
const publicKey = '后端提供的公钥';
const privateKey = '后端提供的秘钥';
const key = '后端提供的key';
/**
* 国密加解密工具类
*/
// SM2加密
export function doSm2Encrypt(msgString) {
return sm2.doEncrypt(msgString, publicKey, cipherMode);
}
// SM2解密
export function doSm2Decrypt(encryptData) {
return sm2.doDecrypt(encryptData, privateKey, cipherMode);
}
// SM2数组加密
export function doSm2ArrayEncrypt(msgString) {
return sm2.doEncrypt(msgString, publicKey, cipherMode);
}
// SM2数组解密
export function doSm2ArrayDecrypt(encryptData) {
return sm2.doDecrypt(encryptData, privateKey, cipherMode, { output: 'array' });
}
// SM3哈希
export function doSm3Hash(msgString) {
return sm3(msgString);
}
// SM4 加密
export function doSm4Encrypt(msgString) {
return sm4.encrypt(msgString, key);
}
// SM4 CBC加密
export function doSm4CbcEncrypt(msgString) {
return sm4.encrypt(msgString, key, { mode: 'cbc', iv: 'fedcba98765432100123456789abcdef' }); //加密,cbc模式
}
// SM4 解密
export function doSm4Decrypt(encryptData) {
return sm4.decrypt(encryptData, key);
}
// SM4 CBC解密
export function doSm4CbcDecrypt(encryptData) {
return sm4.decrypt(encryptData, key, { mode: 'cbc', iv: 'fedcba98765432100123456789abcdef' }); //加密,cbc模式
}
3、业务中使用
比如后端要求调登录接口时,传过去的密码要使用国密加密。
import { doSm2Encrypt } from '@/utils/smCrypto.js';
<script>
methods: {
onSubmit({ validateResult }) {
const { account, password } = this.formData;
const param = { account, password: doSm2Encrypt(password) };
if (validateResult === true) {
this.$request.post('/doLogin', param).then((res) => {
console.log(res);
if (res.code === 200) {
this.$message.success('登录成功');
} else {
this.$message.error(res.msg);
}
});
}
}
}
</script>