关于SM2,SM3前端加密的注意事项(SM3加密文件)

1,090 阅读1分钟

关于SM2,SM3前端加密的注意事项

前言

SM2,SM3 加密字符串并没有什么特殊的,本文主要讲解一下 前端SM2加密后,传给后端的特殊处理,以及SM3加密文件的处理

使用的加密库

sm-crypto

SM2加密处理

传递给后端的通常要在结果的基础上增加04,如果后端传递过来的密文前边有04的话,我们要去掉之后进行解密。这样前后端的加解密结果才一致。

SM3加密文件处理

使用的前端库是对字符串和数组加密的,所以直接对文件进行加密的结果等同于对空字符串进行加密。

企业微信截图_17085814777603.png

企业微信截图_17085814607294.png

以下是修改过的文件加密流程

// 读取文件方法
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);
}