关于Base64编码中的‘+’ 和‘/’字符处理

最近遇到个问题:某些用户反馈自己的密码无法登录,于是打算从整个登录过程入手分析。

1、将密码字符串转data

2、用系统的加密方法进行3DES加密

3、用Base64编码加密之后的NSData数据,得到最终加密之后的字符串。


其中1、2两步我想都是调用苹果原生的系统方法应该不会出现问题,就把目光锁定到第3步,Base64编码方法是用网上开源的,直接拿来就用了。

开始调试异常帐号,当走到Base64编码这一步,得到的字符串中含有‘+’号,后台调试得到的字符中这个符号变为空格,这个地方明显就出问题了。

然后查看了Base64的具体编码作用:将二进制数据(NSData)表示为ASCII文本字符串,用了一个标准化的转化表格将二进制数据的没6位编码为一个字符。


发现里面有‘/’ 这个字符,我想到的就是这个字符如果出现在url里面肯定会出问题(笔者没用GET方式),于是翻开了《iOS网络高级编程》,其中第11章在讲解应用之间通信可以传递任何复杂数据的时候,讲到了'+' 和 '/'在URL中含有特别的含义,可能会导致接受方无法正确解码二进制数据。其中'+'表示空白字符串,如果数据被解释为空白会导致解析器过早终止或者解释不正确的数据,'/'表示URL的路径部分,这可能会导致解析器过早开始或者结束。


找到问题了。查看开源的Base64中指定的编码字符表,发现将所有字符组成字符串:

static const char *kBase64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";


果然有这两个字符吧。


解决方案:

1、通过苹果提供的URL编码Base64字符串方法:

base64EncodedDataWithOptions:


2、替换Base64(开源框架)中转化表中的编码字符

static const char *kWebSafeBase64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";


通过以上两种方法可以解决这个问题,独立小白必经之路,大神勿喷

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

moxi_wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值