最近,苹果公司发布了新通知,大致是要求升级https吧,大部分公司也在开始升级https,其实升级过后,对我们客户端改动量不大。今天,我们主要讨论的是,iOS请求中的用户安全。
在开发应用的时候,数据的安全性至关重要,而仅仅用POST请求提交用户的隐私数据,还是不能完全解决安全问题。如:可以利用软件(比如Charles)设置代理服务器,拦截查看手机的请求数据。因此,在提交数据的时候,我们要尽量避免明文提交,采用加密传输。
在做网络请求的时候,我们通常也需要对请求参数做一个不可逆的加密,不仅仅是字符加密,还需要添加一个动态的加密参数,尤其是涉及到账户资金,积分,密码等操作的时候,如果所有参数均采用明文的话,只要对方对网络请求稍有研究,对方则可通过网络抓包工具,可以获取到我们请求的全过程,然后对方模拟我们得网络请求,则可模拟出和我们正常操作一样的流程,从而获取到我们的信息,并且去进行一些不法操作,如盗窃账户资金,充值积分,模拟聊天信息等,对我们开发者,用户均会造成很大程度上的影响。
字符加密的话,大家也大致清楚,常用的为md5,aes,des等,通常情况下这些加密都是不可逆的,网络所谓的md5反编译,只是建立的一个相对的md5反编译字典,通过一一比对去得到相应的值,只要我们的字符不要太过简单,则是无法反编译出来的,这通常用于保护密码等信息不被他人盗用。在请求过程中,我们还需要添加一个动态加密字段,动态加密字段,一般是选择用户ID+动态随机字符串,因为如果我们直接添加一个加密字段,对方网络请求的时候,可以不理会加密方式,直接请求,也能获取到结果。而动态字段则不同,每次请求的时候,都会去进行比对,比对过后这一串字符次就已经失效,不会二次与数据库进行比对,则请求失败,如果对方简单修改字符串,与数据库比对失败,同样不会完成请求,就相对的保护了我们账户安全。
在动态字符串选取的过程中,我们可以选择随机生成16位随机字符串,然后通过md5,这其中重复的概率就相当低了,也不容易被破解。当然我们也可以选择当前时间戳,时间戳随时都在变化,再加上我们固定字段,被破解以及重复的概率都会降到极低点,这个随机字符串选取主要是看个人喜好,也没有固定要求。在这里,我也简单附上部分代码吧,这部分代码我并没有重新写,而是在网上copy的一段,大家将其运用在网络请求中即可:
#define Salt @"fsdhjkfhjksdhjkfjhkd546783765"/** * 直接用MD5加密 */
- (NSString *)digest:(NSString *)str {
NSString *anwen = [str md5String];
NSLog(@"%@ - %@", str, anwen);
return anew;
}
/** * 加入随机字符串 */
- (NSString *)digest2:(NSString *)str {
str = [str stringByAppendingString:Salt];
NSString *anwen = [str md5String];
NSLog(@"%@ - %@", str, anew);
return anwen; }
/** * 多次MD5 */
- (NSString *)digest3:(NSString *)str {
NSString *anwen = [str md5String];
anwen = [anwen md5String];
NSLog(@"%@ - %@", str, anew);
return anew;
}
/** * 先加密, 后乱序 */
- (NSString *)digest4:(NSString *)str {
NSString *anwen = [str md5String];
// 注册: 123 ---- 2CB962AC59075B964B07152D234B7020
// 登录: 123 --- 202CB962AC59075B964B07152D234B70 NSString *header = [anwen substringToIndex:2]; NSString *footer = [anwen substringFromIndex:2]; anwen = [footer stringByAppendingString:header]; NSLog(@"%@ - %@", str, anwen); return anwen; }
对于网络请求的初步加密大概就是如此,当然如果需要更加安全的加密,则需要对请求地址也进行加密,致使抓包的时候,不能获取到完整的请求信息,从而达到更好的加密效果。当然这需要前后端建立统一的加密解密库,过程就相对繁琐,大致贴下使用代码吧:
#include "paramcodec.h"
/
//
char (*arrMap)[2][MAX_STR_LEN];
int str_len, ret, num;
char *strEncode;
num = 2;
arrMap = malloc( num * MAX_STR_LEN * 2 );
strcpy( arrRestore[0][0],"name" );
strcpy( arrRestore[0][0],"John doe" );
strcpy( arrRestore[0][0],"userID" );
strcpy( arrRestore[0][0],"1000215" );
strEncode = malloc( num * MAX_STR_LEN * 4 );
ret = ParamEncode( strEncode, &str_len, arrMap, num );
DebugPrintf( "ret: %s str_len=%d\n", strEncode, str_len );
通过二维数组将参数一一对应加密,然后通过特定的加密方式,达到他们不能轻易解析的效果,编程之路漫漫其修远兮,吾将上下而求索。