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

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-_";


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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐