base64 string类 放不下_base64编码处理数据踩过的坑_weixin_39592026的博客-程序员宅基地

技术标签: base64 string类 放不下  

由于业务场景中使用了base64编码进行数据的处理,最近被它折腾的不轻,今天就来看看,都是哪里出了问题。

一、参与签名时,对base64编码结果处理不当

我们知道,base64编码是由大小写字母、数字和+/=三个特殊字符,合计65个字符构成,而=是作为末尾补位符使用,参与编码的字符是64个。

因此,base64编码结果存在等号(=),经过urlencode编码过后,等号会被处理成%3D

假定被base64编码的参数为note,其原始内容为:note=中国牛逼~,base64_encode的结果为:5Lit5Zu954mb6YC8fg==,经过urlencode处理的结果为:5Lit5Zu954mb6YC8fg%3D%3D,因此,我们的请求参数变成了:note=5Lit5Zu954mb6YC8fg%3D%3D,当我们约定note参与签名时,对方就可能得到3种不同的参与签名内容:

md5('note=中国牛逼~')

md5('note=5Lit5Zu954mb6YC8fg==')

md5('note=5Lit5Zu954mb6YC8fg%3D%3D')

一般来说,不刻意进行base64_decode处理,第一种不会出现。

但是第二种和第三种就比较容易混淆了,他们受到web服务器解析参数影响,有些web服务器对参数默认进行urldecode处理,有些却没有。

因此,假定我们参与签名的是urlencode的内容,即md5('note=5Lit5Zu954mb6YC8fg%3D%3D')时,默认进行urldecode的业务方,得到的内容却是note=5Lit5Zu954mb6YC8fg==,如果对方直接对内容进行生成签名,就会导致md5签名无法匹配,校验失败。

md5('note=5Lit5Zu954mb6YC8fg==')=142b4b3921701512f39e88a6bf9a97a3

md5('note=5Lit5Zu954mb6YC8fg%3D%3D')=fbb7df69af21293c8a280a4d1b4663af

如果一开始对接的时候测试内容note的base64_encode结果就带有等号,那对接时就会发现签名异常。

但还有一种情况,base64_encode在某种情况下,不需要补位处理,比如:

base64_encode

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39592026/article/details/111726436

智能推荐

android 通知折叠点击,如何折叠Android通知?-程序员宅基地

我每半小时向我的Android应用发送一次C2DM更新,这会创建一个通知.问题是,当我早上醒来时,我在状态栏中排队了15个通知.我如何只保留最新通知,覆盖以前的通知?我试着查看C2DM文档(http://code.google.com/android/c2dm/),其中提到了一个名为collapse_key的参数,但是我找不到如何使用它的解释,也不确定解决方案是在C2DM方面.谢谢!解决方法:如果..._android 通知栏被折叠

UML概述及UML图详解_函数uml图-程序员宅基地

​UML概述一、UML简介(一)UML (Unified Modeling Language)为面向对象软件设计提供统一的、标准的、可视化的建模语言。适用于描述以用例为驱动,以体系结构为中心的软件设计的全过程。(二)UML的定义包括UML语义和UML表示法两个部分。 1.UML语义:UML对语义的描述使开发者能在语义上取得一致认识,消除了因人而异的表达方法所造成的影响; 2.UML表..._函数uml图

使用VScode连接远程服务器的配置方法_vscode配置服务器_coast_s的博客-程序员宅基地

参考文章:https://zhuanlan.zhihu.com/p/1412052621.安装VScode官网地址:https://code.visualstudio.com/2.安装OpenSSH该服务的作用是让你可以在终端使用ssh指令,Windows10通常自带OpenSSH不需要安装。Windows10下检查是否已经安装OpenSSH的方法:按下快捷键Win + X,选择Windows PoweShell(管理员),输入以下指令:Get-WindowsCapability -Onli_vscode配置服务器

动态规划---背包问题-程序员宅基地

下面讲解一下动态规划中的经典例题---背包问题,其中背包问题又分为0-1背包问题、物品无限背包问题和多重背包问题。做动态规划习题的时候,最重要的求解过程是列表格,将问题分解为众多子问题。0-1背包问题 1 2 3 4 v 2 3 4 5 w 3 4 5 6 其中capacity = 8将背包问题抽...

业务相关的数据处理方式_删除dataframe对象的离群点-程序员宅基地

1: 对整体数据的处理train_data['bedrooms'] = train_data['bedrooms'].astype(int)test_data['bedrooms'] = test_data['bedrooms'].astype(int)train_data = train_data[['longitude', 'latitude', 'price', 'buildingT..._删除dataframe对象的离群点

图像处理:斑点检测和连接的组件_小白学视觉的博客-程序员宅基地

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达蝴蝶与检测到的斑点结合并补充图像中发现的每个单独的成分,可以绘制所需的部分内容。但是,如果只想独立..._图像处理 检测点状物

随便推点

1034 有理数四则运算 (20 分)测试点2,3-程序员宅基地

题目链接这里测试点2,3卡的是要用long long int类型不然范围不够我一向不喜欢做这种题gcd函数中要加一个判断a是不是为0,防止出现0/0这种,导致程序直接错误#include<iostream>#include<cmath>using namespace std;long long int a1,b1,a2,b2;long long int gcd(lo..._1034 有理数四则运算 c语言测试点

多个自定义列表同一行css,在项目符号之前将列表项与自定义CSS内容对齐-程序员宅基地

我有这段HT​​ML代码:Item 1Item 2Item 3.1Item 3.2Item 4Item 5Item 6和CSS:.custom {list-style:none;padding:0;margin:0;}.custom li:before {display:inline-block;content:attr(data-bullet);width:50px;}/*.custom {li...

php时区问题_php 时区问题-程序员宅基地

新装了php,用date("Y-m-d H:i:s");得出的时间比实际少了8小时。显然,这是时区的问题,如何调整呢?方法一在php.ini文件中修改设置找到date.timezone项,修改其设置date.timezone = Asia/Shanghai通过cgi方式运行php的话,记得重启apache配置才会生效。方法二如果有权限等问题,可以在PHP_php 时区问题

@PostConstruct注解和@PreDestroy注解(初始化和销毁)_@postconstruct 对应的清除方法-程序员宅基地

@PostConstruct基本:@PostConstruct注解不是Spring提供的。是Java自己的注解。Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行_@postconstruct 对应的清除方法

Mysql 分页语句 Limit原理与优化_mysql top 和limit-程序员宅基地

(1)、Mysql的limit用法在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。SELECT*FROMtableLIMIT[offset,]rows|rowsOFFSEToffset LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。..._mysql top 和limit

一种OPENSSL_Uplink(100F2010,05): no OPENSSL_Applink解决方法-程序员宅基地

最近项目中使用Openssl库时,程序编译没有错误,但是执行时出现OPENSSL_Uplink(100F2010,05): no OPENSSL_Applink错误,在网上找了好多原因,大部分是说DLL库调用方式不正确,应该修改为与Openssl库相同的编译方式也就是/Md方式,但是都不能解决问题,我的代码是从一个pem文件中读取RSA私钥,出错的代码如下: FILE* fp = f