base64编码之去除特殊字符

Cookie+Base64编码:一个不易察觉的坑 之前做过一个项目,为了更简单的实现业务功能,我在 Cookie 中存放了用户姓名信息。 但我们知道 Cookie 中只支持 ASCII 码,而且 Cookie 本身就有其安全性的隐患,加之我保存的是姓名这种敏感信息。所以,出于编码和安全性这两点考虑,我选择了在服务端设置 Cookie 时使用 Base64 编码,之后在前端 JS 脚本中对该字符串进行 Base64 解码提取真实数据。 编码方式(该... 阅读详情

           这些天h5需要做一个推广页面,需要客户端将地理位置信息以及用户的一些信息传递给h5页面,一般的话可以通过给h5注入对象,调用方法的方式来实现。但是想想这个页面是需要通过客户端生成二维码,别的用户用微信或者其他的二维码扫描工具扫描之后才出现的,所以不是通过自己客户端的webview来加载的,所以说这种方式不可行,那么就另外一种方式,就是在h5页面地址后面进行拼接,然后让h5取值,就是采用了这个方案。

           但是不管是用户的信息还是客户端取到的地理位置信息,都是用户的隐私信息,所以不能直接就通过?以及&的方式明文拼接在后面,要是通过微信扫描打开页面还好,看不到地址,但是如果是在浏览器中打开,那么地址就是一目了然了,那么用户信息岂不就是泄漏了么?所以还是稍微加密下吧,因为不想太麻烦,所以就直接采用Base64进行编码,其实也不属于加密。那么方案有了,接下来就是实施了。

           其实之前也用Base64转过字符串,不过那时候是将一张图片通过base64转换为字符串传递给服务端了,以前总是用那个sun.misc.BASE64Decoder.jar了,其实android里面里面已经自带了的base64工具类,所以这次我们用这个方法吧。它有encodeToString方法,如果不需要特殊处理,那么第二个参数直接传递Base64.DEFAULT就好了。我们可以试一下:对字符串String param = “北京市哈哈取某某门门南大街靠近值招商银行(北二环支行)&province=北京市&city=北京市&area=某某区&country=中国&street=哈哈门西大街&aaid=000000&time=1505370170813”进行base64编码。android自带的Base64.encodeToString方法,即为Base64.encodeToString(param.getBytes(),Base64.DEFAULT)我们得到的结果为:                                              

 5YyX5Lqs5biC5ZOI5ZOI5Y+W5p+Q5p+Q6Zeo6Zeo5Y2X5aSn6KGX6Z2g6L+R5YC85oub5ZWG6ZO2
 6KGMKOWMl+S6jOeOr+aUr+ihjCkmcHJvdmluY2U95YyX5Lqs5biCJmNpdHk95YyX5Lqs5biCJmFy
 ZWE95p+Q5p+Q5Yy6JmNvdW50cnk95Lit5Zu9JnN0cmVldD3lk4jlk4jpl6jopb/lpKfooZcmYWFp
 ZD0wMDAwMDAmdGltZT0xNTA1MzcwMTcwODEz

是的,它换行了,因为我们是让h5同学去解编码的,让h5同学一看,当时就懵了,直接就不能解,为什么会换行呢?那是因为默认模式下,编码后的如果长度超过76,那么每逢76个字符就会加一个换行符。前面我们看到encodeToString有两个参数,那就看看第二个参数还有别的什么值吧,可以看到注释如下:

/**
     * Default values for encoder/decoder flags.
     */
    public static final int DEFAULT = 0;

    /**
     * Encoder flag bit to omit the padding '=' characters at the end
     * of the output (if any).
     */
    public static final int NO_PADDING = 1;

    /**
     * Encoder flag bit to omit all line terminators (i.e., the output
     * will be on one long line).
     */
    public static final int NO_WRAP = 2;

    /**
     * Encoder flag bit to indicate lines should be terminated with a
     * CRLF pair instead of just an LF.  Has no effect if {@code
     * NO_WRAP} is specified as well.
     */
    public static final int CRLF = 4;

    /**
     * Encoder/decoder flag bit to indicate using the "URL and
     * filename safe" variant of Base64 (see RFC 3548 section 4) where
     * {@code -} and {@code _} are used in place of {@code +} and
     * {@code /}.
     */
    public static final int URL_SAFE = 8;

    /**
     * Flag to pass to {@link Base64OutputStream} to indicate that it
     * should not close the output stream it is wrapping when it
     * itself is closed.
     */
    public static final int NO_CLOSE = 16;
可以看到第二个参数有6种情况,第一种就是默认,我们刚刚试了。如果要解决换行问题,那么得用NO_WRAP了,因为它的意思就是会将所有字符输出至一行,所以我们换成Base64.encodeToString(param.getBytes(),Base64.NO_WRAP),输出结果如下:5YyX5Lqs5biC5ZOI5ZOI5Y+W5p+Q5p+Q6Zeo6Zeo5Y2X5aSn6KGX6Z2g6L+R5YC85oub5ZWG6ZO26KGMKOWMl+S6jOeOr+aUr+ihjCkmcHJvdmluY2U95YyX5Lqs5biCJmNpdHk95YyX5Lqs5biCJmFyZWE95p+Q5p+Q5Yy6JmNvdW50cnk95Lit5Zu9JnN0cmVldD3lk4jlk4jpl6jopb/lpKfooZcmYWFpZD0wMDAwMDAmdGltZT0xNTA1MzcwMTcwODEz;对,这次没有换行, 貌似是我们想要的呢,假装我们拼接后生成二维码背后的地址就是https://www.baidu.com?param=5YyX5Lqs5biC5ZOI5ZOI5Y+W5p+Q5p+Q6Zeo6Zeo5Y2X5aSn6KGX6Z2g6L+R5YC85oub5ZWG6ZO26KGMKOWMl+S6jOeOr+aUr+ihjCkmcHJvdmluY2U95YyX5Lqs5biCJmNpdHk95YyX5Lqs5biCJmFyZWE95p+Q5p+Q5Yy6JmNvdW50cnk95Lit5Zu9JnN0cmVldD3lk4jlk4jpl6jopb/lpKfooZcmYWFpZD0wMDAwMDAmdGltZT0xNTA1MzcwMTcwODEz;好的用微信扫描该地址生成的二维码可以出来页面,但是我们的页面还有引导用户下载我们apk的功能,但是微信里面是不支持下载的,故而必须提示用户在浏览器中打开,所以最终这个地址是需要在浏览了器中打开,那我们可以将其生成二维码,然后用微信扫描后再次在手机浏览器中打开试试(一定得是手机浏览器中哦),可是地址变成了下面酱紫:https://www.baidu.com/?param=5YyX5Lqs5biC5ZOI5ZOI5Y%20W5p%20Q5p%20Q6Zeo6Zeo5Y2X5aSn6KGX6Z2g6L%20R5YC85oub5ZWG6ZO26KGMKOWMl%20S6jOeOr%20aUr%20ihjCkmcHJvdmluY2U95YyX5Lqs5biCJmNpdHk95YyX5Lqs5biCJmFyZWE95p%20Q5p%20Q5Yy6JmNvdW50cnk95Lit5Zu9JnN0cmVldD3lk4jlk4jpl6jopb%2FlpKfooZcmYWFpZD0wMDAwMDAmdGltZT0xNTA1MzcwMTcwODEz;可以看到跟上面相比所有的+以及斜杠都转义成了%,那这后面一串让h5去解肯定会失败,那就看看其他的参数;突然发现URL_SAFE这个意思是能够将编码后的+以及/转换成-以_了,貌似符合我们个预期,我们试试,最终结果如下:

5YyX5Lqs5biC5ZOI5ZOI5Y-W5p-Q5p-Q6Zeo6Zeo5Y2X5aSn6KGX6Z2g6L-R5YC85oub5ZWG6ZO2
6KGMKOWMl-S6jOeOr-aUr-ihjCkmcHJvdmluY2U95YyX5Lqs5biCJmNpdHk95YyX5Lqs5biCJmFy
ZWE95p-Q5p-Q5Yy6JmNvdW50cnk95Lit5Zu9JnN0cmVldD3lk4jlk4jpl6jopb_lpKfooZcmYWFp
ZD0wMDAwMDAmdGltZT0xNTA1MzcwMTcwODEz

的确那些加号以及斜杠被替换了,可是又换行了呀,所以在想如果有一个属性能够同时实现URL_SAFE和NO_WRAP就好了呢,可是属性就那么6个,没有一个能够达到这种效果,可以看到后面第二个参数其实是一个常量,其实之前这样写过,view.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM)就是希望该view在其父布局的底部且水平方向居中。那么encodeToString方法是否可以这样子写呢,试了下,答案是可以的,哈哈。所以现在可以酱紫写 Base64.encodeToString(param.getBytes(),Base64.URL_SAFE|Base64.NO_WRAP)),我们的得到的结果是什么呢?结果如下:5YyX5Lqs5biC5ZOI5ZOI5Y-W5p-Q5p-Q6Zeo6Zeo5Y2X5aSn6KGX6Z2g6L-R5YC85oub5ZWG6ZO26KGMKOWMl-S6jOeOr-aUr-ihjCkmcHJvdmluY2U95YyX5Lqs5biCJmNpdHk95YyX5Lqs5biCJmFyZWE95p-Q5p-Q5Yy6JmNvdW50cnk95Lit5Zu9JnN0cmVldD3lk4jlk4jpl6jopb_lpKfooZcmYWFpZD0wMDAwMDAmdGltZT0xNTA1MzcwMTcwODEz;嗯,这次没有换行且没有特殊字符了,终于满足我们的预期。其实还有最后一点,在有些定位地址下,编码后的字符串最后几位会出现=,而=在浏览器里面打开也是有问题的,所以也需要替换掉,此时可以用上面的NO_PADDING,它的意思就是在最后会省略填充=。那么最终我们的方式是这样子的:Base64.encodeToString(param.getBytes(),Base64.URL_SAFE|Base64.NO_WRAP|Base64.NO_PADDING)的。如果不是非要在浏览器中打开,其实是不用这么费事的。

        好了,以上就是本次文章的所有内容。如果不对之处,欢迎批评指正。


基于dify平台批量分析excel格式信息 如何以表格形式批量输入一些信息,然后让大模型以对话应用形式逐条进行推理分析?请逐行分析以下数据,给出推理结果:{{input}}这里提供一个分步解决方案,结合。 阅读详情

相关推荐

DBeaver连接IoTDB避坑指南:手动配置JDBC驱动的完整流程(附问题排查)

本文提供了在DBeaver中手动配置Apache IoTDB JDBC驱动的完整流程与避坑指南。详细解析了从驱动创建、库文件添加(关键是指向整个lib目录)到连接测试的每一步,并重点针对常见的ClassNotFoundException、连接拒绝等错误提供了深度排查方案,帮助用户高效建立图形化管理连接。

weixin_28327051的博客 394

java base64 + BASE64Encoder 解决base64加密后的特殊字符被拦截问题

java base64 + BASE64Encoder 解决base64加密后的特殊字符被拦截问题

lige12的专栏 1373

【软考高项】五十一、常见必会的几种进度网络图(单代号、双代号、七格图、横道图)

软考高项计算题进度网络图画图介绍

有莘不破的博客 3万+

Base64升级 去掉特殊字符 / % +

1、起因:用的 为 java.util.Base64 , Base64.getEncoder().encodeToString("加密byte字节"); 如果加密结果用在url中,由于特殊字符/ ,%的出现,会打乱现有的url请求 2、解决:为此,需要用方法 getUrlEncoder,来过滤掉这些特殊字符 Base64.getUrlEncoder().encodeToString("...

liuxy_236的博客 1万+

手把手教你用单结晶体管搭建简易振荡电路(含电路图和波形分析)

本文详细介绍了如何使用单结晶体管(UJT)搭建简易振荡电路,包括电路设计、波形分析和实战技巧。通过具体的电路图和参数计算,帮助电子爱好者和工程师快速掌握UJT振荡器的设计与调试方法,适用于脉冲信号生成和时钟源制作等应用场景。

weixin_29207533的博客 516

11.8 LangGraph生产级AI Agent开发:从节点定义到高并发架构的终极指南

本文介绍了如何使用 LangGraph 构建生产级 AI Agent,重点解析了 LangGraph 的核心设计、节点与边的实现方法论、生产级实现技巧以及性能优化策略。LangGraph 通过图结构抽象复杂 AI 工作流,核心组件包括节点、边、状态和检查点。节点通过 Python 函数封装原子业务逻辑,边通过条件分支实现动态工作流。生产级实现技巧包括状态管理、多会话控制和错误处理机制。性能优化策略涉及并行执行和缓存机制设计。文章还提供了旅行规划 Agent 的实战案例和常见问题解决方案,帮助开发者构建高效、

yonggeit的博客 3268

使用base64前台加密后台解密的方式处理参数中的特殊字符

使用base64前台加密后台解密的方式处理参数中的特殊字符

weixin_42683007的博客 2124

携程滑块、点选验证码登录识别逆向

本文分析了携程登录系统的风控机制,主要包含三种验证场景:无验证码、滑块验证码和二次图标点选验证码。通过跟踪risk_inspect风控接口,发现验证流程采用标准AES加密,需提交设备指纹等加密信息。当触发验证码时,需额外提交包含轨迹坐标的verify_msg参数及token/rid参数。最终通过风控检测后,需使用一致的指纹参数和验证token完成加密登录。文章强调所有分析仅用于学习,代码实现需确保符合法律规范。

码王吴彦祖的博客 1100

Base64编码,去掉等号特殊字符

/// 自定义包含指定字符的base64工具 internal static class Base64Helper { static readonly string base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-"; static read

企业级技术与网站app运营 2万+

【Android 11】使用Android Studio调试系统应用之Settings移植(五):编译Settings 模块、解决编译错误

基于Andorid 11,系列第5篇文章,本章开始,终于轮到解决正主Settings的编译问题了,使用android studio编译出Settings.apk,能看到这一章的同学,也着实不容易了,再接再厉

上周的博客 3919

自顶向下与自底向上编程思想的对比

一、核心定义与本质差异自顶向下编程思想如同绘制一幅完整的地图,从整体轮廓逐步细化到局部细节。其本质是从系统的整体目标出发,通过逐层分解将复杂问题简化为可实现的子问题,强调先定义 “做什么”,再考虑 “如何做”。自底向上编程思想则类似于搭建积木,从基础组件开始逐步构建复杂系统。其本质是从现有资源和基础功能出发,通过组合和扩展简单组件来实现复杂功能,强调先解决 “如何做” 的细节,再整合为 “做什么” 的整体。二、设计起点与逻辑流程对比设计起点:以系统的整体目标和业务需求为起点。例如设计一个电商平台,首先明确

二进制君 830

Base64特殊字符引起的坑【解码异常、编译报错】

java、base64

qq_44672668的博客 8091

字节系,ali系,ks,pdd最新抓包方案

各大厂安卓逆向

qq_38759383的博客 1145

我的Base64编码,去掉等号特殊字符

1 /// <summary>自定义包含指定字符的base64工具</summary> 2 internal static class Base64Helper 3 { 4 static readonly string base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXY...

dilexia1609的博客 3513

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

base64与base64url编码

注意:这是两种编码base64和base64url,不要混为一谈。(注:不过两者的区别确实不大) 关于base64可以参考这篇文章:https://blog.youkuaiyun.com/mijichui2153/article/details/106629860 总的来说就是选用"A-Z、a-z、0-9、+、/" 64个可打印字符来表示不可见字符(注:另外可能还有补齐用的"=")。诶,,好像出现了一些奇怪的字符。 参见这篇文章https://blog.youkuaiyun.com/mijichui2153/arti..

mijichui2153的博客 4671

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java 计算base64字符串 文件大小、常见用途

要计算一个 Base64 编码的字符串所代表的原始数据的大小,我们需要了解 Base64 编码的原理。Base64 是一种将二进制数据转换为 ASCII 字符串的编码方式,主要用于传输或存储二进制数据,例如图片或音频文件。Base64 编码后的字符串长度通常是原始数据长度的四分之三(即原始数据长度乘以 4/3)。

Yweir的博客 5728

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

base64url

BASE64URL是一种在BASE64的基础上编码形成新的加密方式,为了编码能在网络中安全顺畅传输,需要对BASE64进行的编码,特别是互联网中。 BASE64URL编码的流程:       1、明文使用BASE64进行加密       2、在BASE64的基础上进行一下的编码:                1)去除尾部的"="                2)把"+"替换成

海洋专栏 4464

base64文件大小计算

有时候图片被base64之后需要计算图片大小,因为被编码后全是字符,计算文件大小可以反序列化成文件之后再获取大小,但是会比较麻烦。简单介绍一种利用base64编码原理计算大小的方法. 编码原理 要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,用0填充,输出字符使用’=’,因此编码后输出的文本末...

232

Python中如何检测URL安全的Base64编码?

【代码】Python中如何检测URL安全的Base64编码?

blwwpyen5834d的博客 280

URL安全的Base64算法

base64是取3个字节(24位)的数据强行组成4个字节(32位)的数据做为一个分组,24位分成4个字节的话,每个字节分到6位,然后前面补两位0,然后这个字节的值位索引去base64表找值。 1. 因为前面补两个0,那么只有6位来算索引,最长就是2^6=64,所以base64表只有64个。 2.因为每4个字节一个分组,所以base64后的长度肯定是4的倍数。 3.因为不是所有的字符串都能...

Linux C/C++后台开发 1326

base64 加密有空格 换行_[编码解码] Base64 编码换行和+号遍空格的处理

Android自身带有Base64加密与解密的包,可以方便地加密密码方便传输。String base64Token = Base64.encodeToString(token.trim().getBytes(), Base64.NO_WRAP);byte[] mmmm = Base64.decode(base64Token,Base64.DEFAULT);在用Base64加密做签权的时候用Base...

weixin_39683172的博客 1664

base64编码之后的字符串,在客户端和服务端传值问题

    base64编码之后可能会含有“+”等特殊字符,通过URL传值时,一些特殊字符会在传输过程中发生改变    “/” 在客户端变为 "2F"     "+"  ..........." "     "="  ..........."%3D" 并且每76个字符都会添加一个换行“\n”,传输过程中换行符并没有丢失。所以需要转义这些特殊字符以便传值。String str = base64Strin...

a_yue_yue的博客 3494

[转]PHP base64_encode 在URL地址参数编码上使用

因为我使用公钥,使用php的 openssl 加密之后的资料 base64_encode()字符串,然后放入请求 url 中当作参数,urlencode(base64_encode()),然后用 urldecode() 传过来的参数,出现+和 =丢失的情况,导致 openssl 解密base64_decode()的字符串失败。 我们知道Base64是网络上最常见的用于传输8Bit字节代...

weixin_30843605的博客 334

Python编码实战:URLEncode与Base64在Web开发中的关键应用

本文深入探讨Python在Web开发中URLEncode与Base64编码的关键应用,涵盖URL参数处理、二进制数据转换及API安全传输等实战场景。通过代码示例解析URLEncode解决特殊字符问题、Base64实现图片文本化传输,并介绍Base64URL优化方案,帮助开发者构建高效安全的Web应用。

weixin_42542669的博客 416

一些有关base64的坑,不要再犯这些错了

前言 最近在和百度对接中,需要通过base64加密的方式对数据加密并校验。对方环境是jdk1.8的,我们的环境是jdk1.7的,在对接中遇到一些问题,所以总结一下。 概述 Base64是一种字符串编码格式,采用了A-Z,a-z,0-9,“+”和“/”这64个字符来编码原始字符(还有垫字符“=”)。一个字符本身是一个字节,也就是8位,而base64编码后的一个字符只能表示6位的信息。也就是原始字符...

m0_37825219的博客 2万+

url安全的编码

URL安全的字符串编码: function urlsafe_b64encode($string) {    $data = base64_encode($string);    $data = str_replace(array('+','/','='),array('-','_',''),$data);    return $data; } 复制代码   U...

liukaixiansheng的专栏 459
上一篇: Python之初体验
下一篇: CoordinatorLayout中设置layout_behavior的布局无法垂直居中问题解决
和小胖
博客等级 码龄12年 8粉丝 42原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值