ios客户端密码安全处理

目前了解到的几种官方支持的有MD5,SHA(1,256,512),和HMAC,使用时请导入
#import <CommonCrypto/CommonCrypto.h>
然后通常的做法是使用MD5
//请在NSString中实现
- (NSString *)md5String {
    const char *str = self.UTF8String;
    unsigned char buffer[CC_MD5_DIGEST_LENGTH];
    
    CC_MD5(str, (CC_LONG)strlen(str), buffer);
    
    return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}
但是MD5现在暴力破解横行,所以可以考虑加盐,
static NSString *salt = @"尽量长且复杂的字符串,且服务器需要知道你加了什么";

- (NSString *)md5String:(NSString *)string{
    NSString *str = [string stringByAppendingString:salt];//加盐位置取决于你想要的效果和你跟服务器交流的结果
    return [str md5String];
}
但是这样也可能被拦截破解(万一运气不好呢,生成的直接在人家散列库里面),然后你就可以选择在加上HMAC+MD5,生成方法如下,
- (NSString *)hmacMD5StringWithKey:(NSString *)key {
    const char *keyData = key.UTF8String;
    const char *strData = self.UTF8String;
    unsigned char buffer[CC_MD5_DIGEST_LENGTH];
    
    CCHmac(kCCHmacAlgMD5, keyData, strlen(keyData), strData, strlen(strData), buffer);
    
    return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}

按照教程上说基本这样就差不多了,但是某些可能要求高的可能觉得还是不太安全,然后就引入了时间戳,

教程上写的是现将密码传给服务器,然后双方共同在密码后面加上时间戳,再以HMAC+MD5生成码是否相同来验证!

但是问题是,服务器还是获得了你的明文密码,而且中途如果拦截了就没我们什么事了!

所以我觉得可以在注册时发送给服务器以密码+HMAC+MD5,然后登陆的时候验证双方在这个MD5生成码后加时间戳再HMAC+MD5!

然后就产生了一个注意点,服务器需要验证的是这一分钟和上一分钟的密码,因为客户端到服务器有可能有延迟!

//请在NSString类别中实现
- (NSString *)hmacMd5String:(NSString *)string{
    string = [[string stringByAppendingString:salt]hmacMD5StringWithKey:@"will"];
    NSDate *date = [NSDate date];
    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    formatter.timeZone = [NSTimeZone systemTimeZone];
    formatter.dateFormat = @"yyyy-MM-dd_HH:mm";
    NSString *dateString = [formatter stringFromDate:date];
    NSString *dateStringLast = [formatter stringFromDate:[date dateByAddingTimeInterval:-60]];
    NSString *serverString = [[string stringByAppendingString:dateString] hmacMD5StringWithKey:@"will"];
    NSString *serverStringLastMin = [[string stringByAppendingString:dateStringLast]hmacMD5StringWithKey:@"will"];//服务器除了需要验证上一个字符串,还需要验证上一分钟的字符串
    return serverString;
}

整个过程大体是:首先客户端先进性注册,然后客户端将注册好的密码加盐加hmac加MD5(假设生成码为key)发给服务器端,然后服务器端保存的也就是MD5生成码

然后在登录的时候客户端发送的是key+时间+hmac+MD5,服务器验证的也是将MD5key+(时间or时间-1分钟)+hmac+MD5!

当然最重要的是实现按时间换密码的功能需要服务器与客户端共同实现!

过程中可以考虑加入其它加密技术,密码加密利用的是其不可逆,只要生成过程够复杂,加上时间戳,基本能满足普通用户要求!

而现实中现在用到的有手机验证,二维码验证之类的,也可以加入考虑!

事实上客户端的安全还包括了文件安全,所以可以考虑将一些重要文件也进行加密!

 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值