关于SM2,SM3前端加密的注意事项
前言
SM2,SM3 加密字符串并没有什么特殊的,本文主要讲解一下 前端SM2加密后,传给后端的特殊处理,以及SM3加密文件的处理
使用的加密库
sm-crypto
SM2加密处理
传递给后端的通常要在结果的基础上增加04,如果后端传递过来的密文前边有04的话,我们要去掉之后进行解密。这样前后端的加解密结果才一致。
SM3加密文件处理
使用的前端库是对字符串和数组加密的,所以直接对文件进行加密的结果等同于对空字符串进行加密。
以下是修改过的文件加密流程
// 读取文件方法
readFile (file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
resolve(reader.result);
};
reader.onerror = reject;
reader.readAsArrayBuffer(file);
});
},
// 文件加密部分
getFileHex (file) {
let fileBuffer = await this.readFile(file);
let view = new Uint8Array(fileBuffer);
let byteArry = Array.from(view);
sm3Encrypt(byteArry);
}
加密的工具类
const sm2 = require('sm-crypto').sm2;
const sm3 = require('sm-crypto').sm3;
const cipherMode = 1; // 1 - C1C3C2,0 - C1C2C3,默认为1
const publicKey = '具体的公钥';
// 加密
// value:需要加密的内容
export function encrypt (value) {
// 给后端传值时需要在加密的密文前面加04 ,这样后端才能解密正确不报错
// return sm2.doEncrypt(value, publicKey, cipherMode);
return '04' + sm2.doEncrypt(value, publicKey, cipherMode);
}
export function sm3Encrypt (str) {
return sm3(str);
}