关于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(开源框架)中转化表中的编码字符
url编码处理
static const char *kWebSafeBase64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
通过以上两种⽅法可以解决这个问题,独⽴⼩⽩必经之路,⼤神勿喷。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论