前端微信小程序AES加密解密踩坑

项目场景:

今天蛮沮丧的,在和别人对接的时候aes加解密的时候踩了坑。今天有个同事请假了,所以本来他和别人对接的活,老大给了我,然后我就正式踏上了战战兢兢的对接之路。

1.一开始的时候对面先是问用的啥加密方法。这个我记得当时做的时候我就在旁边还问我了的,AES。顺利答出。
2.然后对面又问要key和偏移量,key我知道,偏移量是什么鬼,然后去百度了一下,一个叫IV的东西,对加密有点了解脑子里大概知道是做啥用的了,去找了一下还真有,key,iv都发过去了。还算顺利

问题描述

到这里应该都结束了。哪曾想对面拿到这两个东西,解密还是解不了,解密返回的是空。

原因分析:

然后我就开始找原因
①我先是试了一下我本地加密解密,ok没有问题
②我又试了一下在密文前面加空格然后解密,返回的是空,那是不是就是这个原因呢,发给对面让对面把空格去了试试,好还是不行
③然后就是半个多小时过去,对面看我久久不回,把解密的方法发给了我,我看了一下和我这边差别不大,唯一有差别的就是
对面的key是我发的字符串
在这里插入图片描述

,而我这边的key是生成的
在这里插入图片描述
有没有可能是两个不一样呢,我把两个都输出比较了一下都一样的没问题看起来都是字符串。这是我踩的第一个坑。
然后呢,不信自己的眼睛又用了一下key == key1 输出了一下true,也没问题呀。这是我踩的第二个坑。被两个坑给埋了。

最后问同事,同事试了一下也愣住了,然后我给他展示了一下我用key == key1是true ,他让我试试 key === key1,一输出false,好这个时候原因很明显了,我又用typeof key,输出了是object,好家伙。
至于key == key1为什么是true,我想大概是对象的toString方法,让他输出了和key1相等的字符串

解决方案:

最后最后我把对面晾了两个多小时,对面让我把生成密钥的盐值,密码短语,KEY_SIZE,ITERATION_COUNT都发给他,自己生成密钥去了。

虽然问题解决了,但是还是要探讨一下有密钥了,这个key到底应该怎么写。我的chat今天下午竟然罢工了,不然问一下应该很快就能解决(顺便吐槽一下国内的大模型真lj,根本比不了),目前还用不了,先记录一下,等能用了我再问问。


回来填坑
直接这么写不行
在这里插入图片描述
然后这样写

var key2 = CryptoJS.enc.Utf8.parse("asdfasdfsadfsadfasdf");

输出了一下
在这里插入图片描述
用这个key2解密还是不行,一样返回为空

突发奇想又把正确的key输出了一下
在这里插入图片描述

哦,很明显问题出来了,比正确的key长,问问chat老师

User
还是key不对,var key =
CryptoJS.enc.Utf8.parse(“222d95e87666d9eed4429e0a2daa39a8”);
生成的key,array是8,正确应该是5?

在你提到的情况下,密钥的生成可能存在问题。AES 的密钥长度应该是 128 位(16 字节),192 位(24 字节)或 256 位(32
字节)。你提到生成的密钥数组长度为 8,这不符合标准的 AES 密钥长度。

如果你的密钥是 32 位的十六进制字符串,你可以使用 CryptoJS.enc.Hex.parse
来解析为字节数组。确保使用正确的密钥长度,可以根据需要截断或补齐。例如:

javascript Copy code // 如果密钥是 32 字节的十六进制字符串 var keyHex =
“222d95e87666d9eed4429e0a2daa39a8”; var key =
CryptoJS.enc.Hex.parse(keyHex); 上述代码将 32
字节的十六进制字符串解析为字节数组,然后你可以将其用作密钥。

确保你的密钥长度正确,并尽量不要硬编码密钥,因为密钥的保密性非常重要。最好的做法是将密钥存储在安全的地方,而不是在代码中硬编码。如果你需要使用密码来派生密钥,可以考虑使用密码学上的密钥派生函数(如
PBKDF2)。

User
和CryptoJS.enc.Utf8.parse(“222d95e87666d9eed4429e0a2daa39a8”);有什么区别

在 CryptoJS 中,CryptoJS.enc.Utf8.parse 和 CryptoJS.enc.Hex.parse
是两个不同的方法,用于解析字符串并生成对应的字节数组。

CryptoJS.enc.Utf8.parse:

该方法将 UTF-8 编码的字符串转换为字节数组。 适用于包含文本字符的字符串。
例如:CryptoJS.enc.Utf8.parse(“Hello, World!”) 会生成一个包含每个字符的 UTF-8
编码的字节数组。 CryptoJS.enc.Hex.parse:

该方法将十六进制字符串转换为字节数组。 适用于包含十六进制字符的字符串,每两个字符表示一个字节。
例如:CryptoJS.enc.Hex.parse(“48656c6c6f2c20576f726c6421”) 会生成一个字节数组,对应于
ASCII 编码的 “Hello, World!”。 在你的情况下,你提到密钥是一个 32 位的十六进制字符串:

javascript Copy code var key =
CryptoJS.enc.Hex.parse(“222d95e87666d9eed4429e0a2daa39a8”); 这里使用了
CryptoJS.enc.Hex.parse,因为你提供的密钥是一个十六进制字符串。这样可以确保正确地将这个字符串转换为字节数组,以便在
CryptoJS 的 AES 加密和解密过程中使用。

如果密钥是一个普通的文本字符串,而不是十六进制,你应该使用 CryptoJS.enc.Utf8.parse。

总的来说,选择使用哪个方法取决于你的密钥的表示形式。如果密钥是十六进制字符串,使用
CryptoJS.enc.Hex.parse;如果是普通文本字符串,使用
CryptoJS.enc.Utf8.parse。在加密和解密的过程中,确保使用相同的格式来处理密钥。

总结一下喽如果想要把key直接写出来得把密钥写成十六进制的字符串

var key = 	CryptoJS.enc.Hex.parse("asdfasdfsadfsadfasdf");

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go后端开发 -- Golang的语言特性

Go后端开发 – Golang的语言特性 文章目录 Go后端开发 -- Golang的语言特性一、Golang的优势1.部署极其简单:2.静态语言3.语言层面的并发4.强大的标准库5.简单易学6.运行效率对比 二、Golang的适用领域1.应用领域2.明星产品 三、Golang的不足 一、Golang的优势 1.部…

华清远见作业第十四天

思维导图 1、顺序表按元素删除 代码: int delete_num_delete(sqlist *list,datatype key) {int indexseek_num(list,key);//元素查找函数if(index-1){return -1;}delete_index(list,index);return 0; } 2、顺序表按照元素修改 代码: //顺序表按照元…

搭载紫光展锐芯的移远通信RedCap模组顺利通过中国联通OPENLAB实验室认证

近日,移远通信联合紫光展锐在中国联通5G物联网OPENLAB开放实验室,完成了RedCap模组RG207U-CN端到端测试验收,并获颁认证证书。移远通信RG207U-CN成为业内率先通过联通OPENLAB认证的紫光展锐RedCap芯片平台的模组。 本次测试基于联通OPENLAB实…

【Java代码审计】RCE篇

【Java代码审计】RCE篇 1.Java中的RCE2.ProcessBuilder命令执行漏洞3.Runtime exec命令执行漏洞4.脚本引擎代码注入5.RCE的防御 1.Java中的RCE 在PHP开发语言中有system()、exec()、shell_exec()、eval()、passthru()等函数可以执行系统命令。在Java开发语言中可以执行系统命令…

7-1 建立二叉搜索树并查找父结点(PTA - 数据结构)

按输入顺序建立二叉搜索树,并搜索某一结点,输出其父结点。 输入格式: 输入有三行: 第一行是n值,表示有n个结点; 第二行有n个整数,分别代表n个结点的数据值; 第三行是x,表示要搜索值…

利用ffmpeg cv2取h265码流视频(转换图片灰屏问题解决)

利用海康威视相机拍出来的视频是H265格式的,相比于常规的H264编码,压缩率更高,但因此如果直接用正常取流方法读取,会出现无法读取的情况 1. 如图h265码流取出图片为灰屏 2 、解决灰屏问题 import subprocess import cv2# 将h265流…

【MyBatis Plus】Service Mapper内置接口讲解

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《MyBatis-Plus》。🎯🎯 &am…

IXXAT NT系列高稳定性网关网桥解决方案

CAN网关网桥功能特点 在之前的文章中我们介绍了CAN中继器在实际场景中的使用,它通常用在CAN的信号远距离传输和降低干扰方面。 我们知道CAN中继器本身并不发出CAN数据帧,而是对CAN数据进行过滤。而CAN网桥则是将上一个网段中的CAN数据帧收取后&a…

自定义Taro上传图片hooks(useUploadImg)

有两个方法需要提前引入 FileUtil(上传文件的方法)、to(对请求接口返回做了二次处理,数据和错误提示等) //FileUtil export namespace FileUtil {const env {timeout: 10000,uploadImageUrl: "阿里云的地址",};const genPolicy …

【Java】Mac下的Tomcat安装配置

🔔Tomcat是一个免费的开源web应用服务器,是开发和调试JSP 程序的首选🖐可利用它响应HTML页面的访问请求。 我们在进行网络编程时,其中重要的中间件就是Tomcat,下面我们将进行在Mac上配置Tomcat的讲解。😲 …

LeetCode做题总结 1. 两数之和

1. 两数之和 暴力法哈希法重新分析Java语法 暴力法 2023.09.20 刚开始用暴力法破解&#xff08;C&#xff09; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> a;for(int i0; i<nums.size()-1; i) {for(…

企业网络常用网关冗余技术-VRRP协议原理与配置

局域网中的用户终端通常采用配置一个默认网关的形式访问外部网络&#xff0c;如果此时默认网关设备发生故障&#xff0c;将中断所有用户终端的网络访问&#xff0c;这很可能会给用户带来不可预计的损失&#xff0c;所以可以通过部署多个网关的方式来解决单点故障问题&#xff0…

PCB变压器相关记录

PCB平面变压器设计指南--转载自21世纪电源网_北京泰科斯德技术有限公司 PCB变压器电流密度

智能感知时代已来,汉威科技柔性传感器迎来发展新机遇

近年来&#xff0c;消费电子、医疗健康、智能汽车、人机交互等领域的黑科技产品不断出现&#xff0c;催生了许多新功能、新场景、新市场。 TWS耳机&#xff1a;许多TWS&#xff08;真无线立体声&#xff09;耳机厂商开始摒弃传统的触摸感应模式&#xff0c;转而采用最先进的压…

什么是小红书垂直达人,垂直达人优势在哪里?

有不少商家&#xff0c;在小红书平台投广告&#xff0c;来扩大产品和品牌声量时&#xff0c;我们第一时间优选的就是垂直达人。有不少商家和小伙伴会产生了疑问&#xff0c;为什么在投流时&#xff0c;要选择小红书垂直达人?今天&#xff0c;我们就为大家科普一下。 一、什么是…

等待队列头实现阻塞 IO(BIO)

文章目录 等待队列头实现阻塞 IO(BIO)模型等待队列头init_waitqueue_headDECLARE_WAIT_QUEUE_HEAD 等待队列项使用方法驱动程序应用程序模块使用参考 等待队列头实现阻塞 IO(BIO) 等待队列是内核实现阻塞和唤醒的内核机制。 等待队列以循环链表为基础结构&#xff0c;链表头和…

​​​​​​​配置MUX VLAN示例(接入层设备)

组网需求 在企业网络中&#xff0c;企业所有员工都可以访问企业的服务器。但对于企业来说&#xff0c;希望企业内部部分员工之间可以互相交流&#xff0c;而部分员工之间是隔离的&#xff0c;不能够互相访问。 如图1所示&#xff0c;为了解决上述问题&#xff0c;可在连接终端…

unity脚本API中OnCollisionEnter()、OnTriggerEnter()二者的区别

Unity中的OnCollisionEnter和OnTriggerEnter两个函数在日常的开发中很常见但也容易混淆&#xff0c;下面说一说两者的区别。 碰撞器&#xff08;Collider&#xff09;与触发器&#xff08;Trigger&#xff09;的概念 碰撞器&#xff08;Collider&#xff09;和触发器&#xff…

解锁高效工作!5款优秀工时管理软件推荐

工时管理&#xff0c;一直是让许多企业和团队头疼的问题。传统的纸质工时表、复杂的电子表格&#xff0c;不仅操作繁琐&#xff0c;还容易出错。幸好&#xff0c;随着科技的进步&#xff0c;我们迎来了工时管理软件的春天。今天&#xff0c;就让我们一起走进这个新时代&#xf…

虚幻学习笔记20—C++中用户输入控制

一、前言 用户输入主要有鼠标和键盘以及其他的遥感外接设备等&#xff0c;在虚幻中经常会用到这些输入设备的值&#xff0c;比如通过鼠标控制摄像头的方向、键盘控制人物移动等。本文主要讲解简单的输入绑定和虚幻5新增的”增强输入控制“两种方法。 二、实现 2.1、原始的输入…