iOS SDK MD5加密算法,下面贴上代码:
#import <Foundation/Foundation.h>
@interface NSString (MD5)
//MD5加密
- (NSString *)MD5;
@end
#import "NSString+MD5.h"
#import <CommonCrypto/CommonDigest.h>
@implementation NSString (MD5)
- (NSString *)MD5
{
const char *str = [self UTF8String];
unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, (unsigned int)strlen(str), md5Buffer);
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH *2];
for (int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x",md5Buffer[i]];
}
return output;
}
@end
实际使用时可以自由打乱,变成一个唯一的密钥,如下:
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *password = @"password";
NSMutableString *str = [NSMutableString string];
NSString *md5 = [password MD5];
NSString *qian = [self suijiWithLength:2];
NSString *hou = [self suijiWithLength:3];
NSString *user = [[[str stringByAppendingString:qian] stringByAppendingString:md5] stringByAppendingString:hou];
//user...
}
- (NSString *)suijiWithLength:(NSInteger)integer
{
char data[integer];
for (int x = 0; x < integer; data[x++] = (char)('A' + (arc4random_uniform(26))));
return [[NSString alloc] initWithBytes:data length:integer encoding:NSUTF8StringEncoding];
}
简述一下开发中,前后端加密思路:
例子一,密码保护,假设用户登录需要手机账号及一段密码,登陆时我们将密码进行拼接(可用数据库的id或者手机号等用户唯一的标识),比如用户手机号为170 5555 6789,可以取前三位 170 + 用户输入的密码 + 后四位 6789拼接后再进行MD5加密处理发送给后台服务器,后台只需要保存MD5加密后的字符串即可,以后用户登录时也是比较这个MD5加密后的字符串。由于MD5的不可逆性,就算被拦截到也只会得到MD5加密的字符串,不会得到用户的密码。如图23-1。
列子二:资源保护,假设是一个仅会员可以访问的页面,连接中添加两个参数,设定为a、b。假设用户id:365,倒序字符串为563,随机生成4个数字插入,假设6789,插入后的结果即为a:6576839。将id号365进行MD5加密后前面拼接两位随机字符,假设af,后面拼接三位随机字符假设qwe,结果即为b:[af [365 MD5] qwe],传到后台服务器后,后台将a剔除插入数字,再倒序得到用户id号365,进行MD5加密,与b剔除前两位与后三位的字符进行比较,一致则可以访问,并可以根据id设置相关访问信息。如图23-2。
列子三:登录及资源保护,简单的加密处理很容易被暴力破解。可以在登录时除账号密码外再添加两个字段,如date和token两个字段,date为当前时间,token是类似于列子一中的公司秘钥,举个列子token = [[key + date] MD5],其中key为前端和服务器提前商议好的一个字符串, 这样服务器在拿到数据时进行同样加密处理后比对,一致则进行下一步验证账号密码,登录成功后再返回一个由服务器生成的秘钥,客户端收到后本地保存秘钥,之后所有请求客服端都将这个秘钥传回给服务器,由服务器比对,成功在返回数据。
写博客是希望大家共同交流成长,博主水平有限难免有偏颇不足之处,欢迎批评指正。