【electron7】调试对话图片的加密处理

1.图片加解密的公共数据:key、iv等

// 字符串转字节数组的方法
const stringToBytes = (str: string) => {let ch = 0let st = []let re: any[] = []for (let i = 0; i < str.length; i++) {ch = str.charCodeAt(i) // get charst = [] // set up "stack"do {st.push(ch & 0xFF) // push byte to stackch = ch >> 8 // shift value down by 1 byte}while (ch)// add stack contents to result// done because chars have "wrong" endiannessre = re.concat(st.reverse())}// return an array of bytesreturn re
}/*** 生成加解密:公共加密key、iv、*/
export const CryptoGlobal = (Codekey: string) => {// 将上面下载的图片转为base64编码,并处理key和iv的格式const key = Codekey || 'xxxxxxxxxx'const iv = 'xxxxxxxxxxxxxxx'// 密钥转字节数组(16位)  let keyBy = stringToBytes(key)let ivBy = stringToBytes(iv)// 字节数组转Uint8Arraylet keyBv = new Uint8Array(keyBy)let ivBv = new Uint8Array(ivBy)// Uint8Array转WordArraylet keyWA = CryptoU8array.u8array.parse(keyBv) let ivWA = CryptoU8array.u8array.parse(ivBv)return {key: keyWA,subtile: {iv: ivWA,// 解密方式和后端商定为为CBC模式mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7}}
}

2.图片插件所需的方法u8array方法

注:此代码我用了单独的代码管理,文件名:enc-u8array.ts
const CryptoJS = require(‘crypto-js’);

CryptoJS.enc.u8array = {/*** Converts a word array to a Uint8Array.** @param {WordArray} wordArray The word array.** @return {Uint8Array} The Uint8Array.** @static** @example** var u8arr = CryptoJS.enc.u8array.stringify(wordArray);*/stringify: function (wordArray: { words: any; sigBytes: any }) {// Shortcutsvar words = wordArray.wordsvar sigBytes = wordArray.sigBytes// Convertvar u8 = new Uint8Array(sigBytes)for (var i = 0; i < sigBytes; i++) {var byte = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xffu8[i] = byte}return u8},/*** Converts a Uint8Array to a word array.** @param {string} u8Str The Uint8Array.** @return {WordArray} The word array.** @static** @example** var wordArray = CryptoJS.enc.u8array.parse(u8arr);*/parse: function (u8arr: string | any[]) {// Shortcutvar len = u8arr.length// Convertvar words: number[] = []for (var i = 0; i < len; i++) {words[i >>> 2] |= (u8arr[i] & 0xff) << (24 - (i % 4) * 8)}return CryptoJS.lib.WordArray.create(words, len)}
}
export default {u8array: CryptoJS.enc.u8array
}

3.图片加密

const CryptoJS = require('crypto-js');
import CryptoU8array from './enc-u8array'
import { CryptoGlobal } from './cryptoGlobal'
/*** 图片加密*/
export function avatarEncrypt(type: string, reorganizationUrl: string, file: any, Codekey?: string, ) {const recodekey = Codekey?.slice(0, 16)const { key, subtile } = CryptoGlobal(recodekey)const messageWordArray = CryptoU8array.u8array.parse(file);let encrypted = CryptoJS.AES.encrypt(messageWordArray, key, subtile);const encryptedBytes = encrypted.ciphertext;const toWordArray = CryptoU8array.u8array.stringify(encryptedBytes)let blob = new Blob([toWordArray], { type }); // 将加密后串转bloblet blobToFile = new File([blob], reorganizationUrl);return blobToFile
}

4.图片解密

import axios from 'axios'
const CryptoJS = require('crypto-js');
import CryptoU8array from './enc-u8array'
import { CryptoGlobal } from './cryptoGlobal'/*** base64转blob* @param {*} base64 * @returns */
function base64ToBlob(base64: string) {const binary = atob(base64.split(',')[1]);const array = [];for (let i = 0; i < binary.length; i++) {array.push(binary.charCodeAt(i));}return new Blob([new Uint8Array(array)], { type: 'image/jpeg' }); // 这里的type可以根据实际情况进行修改
}/*** 头像解密* @param {*} buffer * @returns */
function avatarDecrypt(buffer: ArrayBuffer, Codekey?: string) {let view = new Uint8Array(buffer)// 将Uint8Array 转成 WordArraylet contentWA = CryptoU8array.u8array.parse(view)// base64字符串let dcBase64String = contentWA.toString(CryptoJS.enc.Base64)// 解密const { key, subtile } = CryptoGlobal(Codekey)let decryptedData = CryptoJS.AES.decrypt(dcBase64String, key, subtile)console.log(decryptedData)// 把解密后的对象再转为base64编码,这步是关键,跟解密文字不同let d64 = decryptedData.toString(CryptoJS.enc.Base64)let encodedData = 'data:image/png;base64,' + d64// 将blob解析URLconst blob = base64ToBlob(encodedData);var url = URL.createObjectURL(blob);return url
}/*** 获取图片路径并调用头像解密方法* @param list 路径* @param key sessionId 对话图片才会需要用* @returns */
export async function decodeAvatarUrl(list: string, key?: string) {const resetList = list[0]=== '{' && list[list.length - 1] === '}' ? JSON.parse(list) : listlet isListType = null;if(resetList != null) {isListType = typeof resetList === 'string' ? resetList : resetList?.urlisListType = isListType.replace(/^http:/gi, '')// 判断是否需要解密头像, 并判断图片数据是否有损坏,损坏显示默认头像try {if(isListType.includes('@#¥%&')) {const res: {data: ArrayBuffer} = await axios.request({responseType: 'arraybuffer',url: isListType,method: 'get'})if(res.data) {const reKey = key?.slice(0, 16)const avatarBase64 = avatarDecrypt(res.data, reKey)isListType = avatarBase64} else {isListType = null}}} catch (error) {isListType = null}}return isListType
}

5.图片加密使用

/** 上传图片方法传参校验 */
type UploadFileType = {/** 图片数据:Uint8Array */stream: any;/** 图片名字 */key: string,/** 上传图片的类型: 1:头像 2:消息图片 */updateType: number;/** sessionId */sessionId: string
}
/*** 上传图片 -> 七牛云** @param stream           图片流:Uint8Array* @param stream           图片名称* @param updateType       1:头像 2:消息图片* @param sessionId       1:头像 2:消息图片* */
export const uploadFile = ({ stream, key, updateType, sessionId }: UploadFileType) => {return new Promise(async (resolve: (res: { rescode: number, url: string, error: any }) => void, reject) => {const folderOs = 'Desktop'const folder = updateType === 1 ? 'avatars' : 'conversations'const folderEnd = '@#¥%&'const reorganizationUrl = `${folderOs}/${folder}/${reorganizationName()}${folderEnd}`const imageType = 'image/' + key.split('.').pop()const putExtra = { // 上传需要的参数fname: '',params: {},mimeType: [imageType]};const config = { // 上传需要的参数useCdnDomain: true,};// token是接口获取const { data } = await updateImageToken()const { qiniuLinkUrl, token } = dataconst decode: any = await avatarEncrypt(imageType, reorganizationUrl, stream, sessionId)const observable = qiniu.upload(decode, reorganizationUrl, token, putExtra, config);observable.subscribe({next(res: any){// console.log(res)},error(err: any){ // 失败// console.log(err)reject({error: err,url: '',rescode: 100})}, complete(res: any){ // 成功// console.log(res)resolve({error: null,url: qiniuLinkUrl+reorganizationUrl,rescode: 200})}})})
}

6.图片解密使用

import { decodeAvatarUrl } from '@/utils/decodeAvatar'
// src: 图片路径,sessionId: 唯一key值,每条对话单独的id
decodeAvatarUrl(src, sessionId)

参考:
CSDN(注:仅能参考解密,不够全面):https://blog.csdn.net/ningtt/article/details/118301703
简书(参考的这篇加密,加解密都有,较为全面):https://www.jianshu.com/p/1f75cd571786

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/57885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot企业微信SCRM管理系统源码带本地搭建教程

系统是前后端分离的架构&#xff0c;前端使用Vue2&#xff0c;后端使用SpringBoot2。 技术框架&#xff1a;SpringBoot2.0.0 Mybatis1.3.2 Shiro swagger-ui jpa lombok Vue2 Mysql5.7 运行环境&#xff1a;jdk8 IntelliJ IDEA maven 宝塔面板 系统与功能介绍 基…

C++ —— 《模板进阶详解》,typename和class的用法,非类型模板参数,模板的特化,模板的分离编译

目录 1.非类型模板参数 2.模板特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 2.3.2 偏特化 3 模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 4.模板总结 在讲解模板进阶之前&#xff0c;我想先简单单独聊聊class和typename的用法 我们在平时…

goalng框架Gin解析

本文通过案例的形式&#xff0c;说明gin框架的基本用法&#xff0c;主要列举后端的案例&#xff0c;前端和相对简单的知识点未在此分析&#xff1b; 过完案例后可以有个基本的印象&#xff1a;就是封装和简便 package mainimport ("fmt""github.com/gin-gonic/…

博弈论 C++

前置知识 若一个游戏满足&#xff1a; 由两名玩家交替行动在游戏进行的任意时刻&#xff0c;可以执行的合法行动与轮到哪位玩家无关不能行动的玩家判负 则称该游戏为一个公平组合游戏。 尼姆游戏&#xff08;NIM&#xff09;属于公平组合游戏&#xff0c;但常见的棋类游戏&…

前端零基础入门到上班:【Day5】HTML 和 CSS

HTML 和 CSS 的完美结合&#xff1a;从基础到进阶 引言 1. HTML 与 CSS 的基础知识1.1 HTML 概述常用标签 1.2 CSS 概述选择器与属性 1.3 HTML 与 CSS 的基本结合 2. HTML 与 CSS 的基本结合2.1 选择器的使用2.1.1 元素选择器2.1.2 类选择器2.1.3 ID 选择器2.1.4 组合选择器 2.…

ASP.NET Core开发Chatbot API

本文介绍基于ASP.NET Core的Chatbot Restful API开发&#xff0c;通过调用大语言模型的SDK&#xff0c;完成一个简单的示例。并且通过容器化进行部署. 安装 首先需要安装.NET环境&#xff0c;笔者在Ubuntu 22.04通过二进制包进行安装&#xff0c;Windows和Mac下都有installer…

终止,半成收入来自海外,收入可持续性被质疑

芬尼科技终止原因如下&#xff1a;芬尼科技4年期间经历了两次IPO失败&#xff0c;公司半成收入来自海外&#xff0c;然而公司泳池收入面临欧洲地区冲突冲击及德国新节能措施影响。交易所质疑其收入是否具有可持续性。 作者&#xff1a;Eric 来源&#xff1a;IPO魔女 9月25日&a…

grafana 和 prometheus

1. 监控 mysql 数据库 使用 Grafana 配合 Prometheus 对 MySQL 数据库进行监控的步骤主要包括配置 Prometheus、MySQL Exporter 和 Grafana。以下是详细的步骤&#xff1a; 1. 安装 MySQL Exporter MySQL Exporter 是一个 Prometheus 的 Exporter&#xff0c;用于从 MySQL 数…

使用HIP和OpenMP卸载的Jacobi求解器

Jacobi Solver with HIP and OpenMP offloading — ROCm Blogs (amd.com) 作者&#xff1a;Asitav Mishra, Rajat Arora, Justin Chang 发布日期&#xff1a;2023年9月15日 Jacobi方法作为求解偏微分方程&#xff08;PDE&#xff09;的基本迭代线性求解器在高性能计算&#xff…

Webserver(2)GCC

目录 安装GCCVScode远程连接到虚拟机编写代码gcc编译过程gcc与g的区别Xftp连接虚拟机上传文件 安装GCC sudo apt install gcc g查看版本是7.5 touch test.c创建代码 但是在虚拟机中写代码很不方便 VScode远程连接到虚拟机编写代码 gcc test.c -o app在虚拟机中用gcc编译的…

AtCoder ABC376A-D题解

个人觉得 ABC 变得越来越难了/kk/kk/kk 比赛链接:ABC376 Problem A: Code #include <bits/stdc.h> using namespace std; int main(){int N,C;cin>>N>>C;for(int i1;i<N;i)cin>>T[i];int ans0,pre-1e5;for(int i1;i<N;i){if(T[i]-pre>C){…

APP专项测试-冷启动-流量-电量-内存

1、响应时间 1.1怎么获取冷启动时间&#xff08;热启动&#xff0c;就是后台不关后台再次打开&#xff09; 方法一 1.2怎么获取包名 与 启动页 方法三soloPi&#xff1a;启动时间(用户角度出发&#xff0c;页面差异进行计算时间)&#xff1a; 然后默认配置。点击开始录制 1开…

今日头条躺赚流量:自动化新闻爬取和改写脚本

构建一个自动化的新闻爬取和改写系统&#xff0c;实现热点新闻的自动整理和发布&#xff0c;需要分为以下几个模块&#xff1a;新闻爬取、信息解析与抽取、内容改写、自动发布。以下是每个模块的详细实现步骤和代码示例&#xff1a; 1. 新闻爬取模块 目标&#xff1a;从新闻网…

leetcode hot100【LeetCode 146. LRU缓存】java实现

LeetCode 146. LRU缓存 题目描述 设计和实现一个 LRU (Least Recently Used) 缓存机制。它应该支持以下操作&#xff1a; get(key)&#xff1a;如果缓存中存在 key&#xff0c;则返回 value&#xff0c;否则返回 -1。put(key, value)&#xff1a;如果缓存已满&#xff0c;移…

未来汽车驾驶还会有趣吗?车辆动力学系统简史

未来汽车驾驶还会有趣吗&#xff1f;车辆动力学系统简史 本篇文章来源&#xff1a;Schmidt, F., Knig, L. (2020). Will driving still be fun in the future? Vehicle dynamics systems through the ages. In: Pfeffer, P. (eds) 10th International Munich Chassis Symposiu…

高边坡稳定安全监测预警系统解决方案

一、项目背景 高边坡的滑坡和崩塌是一种常见的自然地质灾害&#xff0c;一但发生而没有提前预告将给人民的生命财产和社会危害产生严重影响。对高边坡可能产生的灾害提前预警、必将有利于决策者采取应对措施、减少和降低灾害造成的损失。现有的高边坡监测技术有人工巡查和利用测…

Java基础题:循环求水仙花数

所谓水仙花数&#xff0c;是指一个三位数abc&#xff0c;如果满足 a^3b^3c^3abc&#xff0c;则abc 是水仙花数&#xff0c;此处^表示次方。 分析&#xff1a;因为这里求得的是水仙花的3位数&#xff0c;定义一个方法接收3位数&#xff0c;对每一位进行取值&#xff0c;最后进行…

python3的基本数据类型:字符串的其他操作

一. 简介 前面文章学习了 python3 中字符串的创建&#xff0c;连接与转化。文章如下&#xff1a; 本文继续来学习 python3 中字符串的其他操作。 二. python3 的基本数据类型&#xff1a;字符串的其他操作 1. 字符转义 python3 中使用反斜杠 \ 转义特殊字符&#xff0c;它…

Docker 搭建mysql

拉取mysql镜像 docker pull mysql # 拉取镜像 [rooteason ~]# docker pull mysql Using default tag: latest latest: Pulling from library/mysql 72a69066d2fe: Pull complete 93619dbc5b36: Pull complete 99da31dd6142: Pull complete 626033c43d70: Pull complete 37d…

Vue 常用的狗钩子函数

beforeCreate(){ console.log(刚刚创建实例); },created(){console.log(实例创建完成);},beforeMount(){console.log(模板编译之前 ); },mounted(){/* 请求数据&#xff0c;操作Dom时常用 */console.log(实力挂载完成);},beforeUpdate(){console.log(更新前)},update…