首页 > 编程语言 >vue 3.0 国密sm2算法加密解密文件流

vue 3.0 国密sm2算法加密解密文件流

时间:2022-08-25 17:46:21浏览次数:55  
标签:文件 vue const buffer sm2 sliceBuffer Buffer 国密 file

  针对文件流加密需要考虑性能问题,所以选择部分文件字节加密,破坏文件内容,达到用户不能随意下载打开文件

 

ts文件:
import { sm2 } from 'sm-crypto';
import { Buffer } from 'buffer';
// 公钥-示例
const publickey_buffer =
  '0451d6cad24f7719edd7e4e6fccbb2fa9867aec2e609ffeb69ec17570e41daf3073d5e8be23828b41e70c92445e1bc30a992d51c425a83ec0a1c0988b87dce0967';
// 私钥-示例
const privateKey_buffer = '24417f87b5e72f7d6f624b5a82e3c53193b819926dd914d772e179b78d9b4914';

// 截取文件流部分字节加密
export const encryptBufferSlice = function (file, fileName) {
  getArrayBuffer(file, (result) => {
    const buffer = Buffer.from(result, 'base64');

    const sliceBuffer_head = buffer.slice(0, 100000);

    const sliceBuffer_tail = buffer.slice(100000);

    const encryptStr = '04' + sm2.doEncrypt(sliceBuffer_head, publickey_buffer, 1);

    const encryptBufferArr = Buffer.from(encryptStr, 'hex');

    const concatBuffer = Buffer.concat([encryptBufferArr, sliceBuffer_tail]);

    const blob = new Blob([concatBuffer]);
    downBlob(blob, fileName);
  });
};

// 截取文件流部分字节解密
export const decryptBufferSlice = function (file, fileName) {
  getArrayBuffer(file, (result) => {
    const buffer = Buffer.from(result, 'hex');

    const sliceBuffer_head = buffer.slice(0, 100097);

    const sliceBuffer_tail = buffer.slice(100097);

    let strHex = sliceBuffer_head.toString('hex');
    strHex = strHex.slice(2);

    const decryptStr = sm2.doDecrypt(strHex, privateKey_buffer, 1, { output: 'array' });

    const decryptBuffer = Buffer.from(decryptStr, 'base64');

    const concatBuffer = Buffer.concat([decryptBuffer, sliceBuffer_tail]);

    const blob = new Blob([concatBuffer]);
    downBlob(blob, fileName);
  });
};

// 获取图片ArrayBuffer
export const getArrayBuffer = function (file, callback: (result) => void) {
  const reader = new FileReader();
  reader.readAsArrayBuffer(file);
  reader.addEventListener('load', () => callback(reader.result));
};

// 下载文件
const downBlob = function (blob, filename) {
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');

  a.setAttribute('href', url);
  a.setAttribute('download', filename);

  const event = document.createEvent('MouseEvent');
  event.initMouseEvent('click');

  a.dispatchEvent(event);
};

 

 

 

vue文件引用:
  const handleBeforeUpload = function (file) {
    // 解密
    decryptBufferSlice(file, '截取前100097字节解密文件.ai');
    // 加密
    // encryptBufferSlice(file, '截取前100000字节加密文件.ai');
    return false;
  };

 

标签:文件,vue,const,buffer,sm2,sliceBuffer,Buffer,国密,file
From: https://www.cnblogs.com/Joseph-lrc/p/16625065.html

相关文章

  • antdesign vue中写了样式不加载的解决方法
    在vue组件里,lang设置为less,在style设置为scoped的时候,在写样式有时候对子组件不生效。如果想让某些样式对子组件生效,可以使用/deep/深度选择器。代码:/deep/.ant-men......
  • vue 国际化i18n在弹出框中$t()报错:TypeError: Cannot read properties of undefined (
    废话不用多说,直接上图:   解决思路如下:在main.js文件中把vue挂载到window。window.vm=newVue({el:'#app',i18n:i18n,...})在弹出的窗口中获取window.vmm......
  • vue socket socketio typescript
    main.ts注册和导出,xx.vue导入使用xx.vue在传递给xxx.vue使用注意类型的定义......
  • vue表格之:summary-method="getSummaries"与show-summary(列求和)
    //表格列求和<el-table:summary-method="getSummaries"show-summary></el-table>getSummaries(param){const{columns,data}=paramconstsums=[]......
  • vue接口获取路由菜单
    menuFormat.js(格式化路由表)exportconstinitMenu=(data)=>{letlist=[];data.forEach(router=>{let{path,comp......
  • Vue项目使用高德地图
    流程:注册账号获取KEY安装使用注册链接:https://lbs.amap.com/选择Web端(JSAPI),同时需要域名限制请按提示进行输入:创建完成后即可看到KEY。安装高德地图JSAPI......
  • vue2的nextTick使用
    1、关于nextTick。vue中的Dom更新是异步的,是异步的意味着当被处理数据是动态变化时,此时对应的Dom未能及时更新(同步更新)就会导致数据已经更新(model层已经更新)而视力层未更......
  • vue集成elementUI
    vue集成elementUI1.使用npm安装elementui模块:指令:npm/cnpminstallelement-ui–S2.安装按需引入的插件:指令:npminstallbabel-plugin-component-D3.设置.babe......
  • vue 安装插件 eslint检测警告
    npm安装报错npmERR!codeERESOLVEnpmERR!ERESOLVEcouldnotresolvenpmERR!npmERR!问题原因安装的包与已经存在的包有冲突解决办法npminstallxxx--fo......
  • Vue项目创建(完整步骤级版本查看)
    涉及软件版本:Nodev14.17.0;npm6.14.13;vue3.2.13;@vue/cli5.0.8一:安装node、npm1.检查Node,未安装【https://nodejs.org/en/】访问网址下载最新版安装2.检查......