用户安全:
原则:在网络传输过程中,关于用户的密码是不能传递明文的,需要通过加密之后进行传递,
一般采用的加密技术是:
(1)md5+盐
(2)hmac+md5
(3)hmac+md5+时间戳 这里的时间戳每次加密的密码结果不一样,密码有效时间是1分钟。它更加安全。
md5:同样的数据,每次进行加密的结果都是采用32位的字符串
它是不可逆的,常用的密码,可以在cmd5.com查询到。
生成数据的特征码,成为信息的指纹,信息摘要
base64:是可逆的。
// // ViewController.m // post-login(登陆) // // Created by jerry on 15/10/14. // Copyright (c) 2015年 jerry. All rights reserved. // #import "ViewController.h" #import "NSString+Hash.h" #import "SSKeychain.h" /** * 安全隐患: 尽管发送数据的过程中,密码进行了“二进制”转化,但是实际上密码还是一个明文,(密文) 解决办法:base64编码(base加密) base64是网络上使用最为广泛的一种编码格式。 作用:可以将二进制数据转换成字符串。 有时候网络请求,希望只传递字符串: 1.url中的参数,直接带上图片传输。 2.银联的网银接口把整个消费的凭据生成一个数据的格式然后进行base64的编码,编码完成后,再传给服务器。 base64特点: 编码过后的结果,只有64个字符。a~z A~Z 0~9 / + 再加上一个辅助字符 = */ @interface ViewController () @property (weak, nonatomic) IBOutlet UITextField *nameText; @property (weak, nonatomic) IBOutlet UITextField *pwdText; @end @implementation ViewController - (IBAction)loginClick { // 加密 NSString *username = self.nameText.text; // NSString *pwd = [self base64encode:self.pwdText.text ]; // 简单的md5加密 // NSString *pwd = self.pwdText.text.md5String; // 加盐 NSString *salt = @"@##$#@SDS!@#WD!$!"; NSString *pwd = [[self.pwdText.text stringByAppendingString:salt] md5String]; NSLog(@"%@",pwd); // 1.url NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/login.php"]; // 2.request NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:2.0f]; request.HTTPMethod = @"POST"; NSString *bodyStr = [NSString stringWithFormat:@"username=%@&password=%@",username,pwd]; request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding]; // 3.connection [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { // 反序列化 id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; NSLog(@"%@",result); // 跟服务端进行沟通 if ([result[@"userId"] intValue] > 0) { #define kLoginUserNameKey @"kLoginUserNameKey" #define kLoginUserPwdKey @"kLoginUserPwdKey" // 登录成功 记录用户信息,记录到偏好设置里 [[NSUserDefaults standardUserDefaults] setObject:username forKey:kLoginUserNameKey]; // [[NSUserDefaults standardUserDefaults] setObject:pwd forKey:kLoginUserPwdKey]; //为了及时保存,需要同步 [[NSUserDefaults standardUserDefaults] synchronize]; #define kLoginServiceName @"kLoginServiceName" /** * 参数 setPassword:用户密码的明文 forService:登录的服务名 account:用户的用户名 */ [SSKeychain setPassword:self.pwdText.text forService:kLoginServiceName account:self.nameText.text]; } }]; } -(void)viewDidLoad { [super viewDidLoad]; // NSLog(@"%@",[self base64encode:@"A"]); // NSLog(@"%@",[self base64encode:@"Man"]); // // 取出用户信息 self.nameText.text = [[NSUserDefaults standardUserDefaults] stringForKey:kLoginUserNameKey]; // NSString *pwd = [[NSUserDefaults standardUserDefaults] stringForKey:kLoginUserPwdKey]; // // if (pwd) { // self.pwdText.text = pwd; // } // 打印出来存储的所有的钥匙串的服务信息。密码是打印不出来的。 NSLog(@"%@",[SSKeychain allAccounts]); // 显示出来,取出钥匙串里面的信息。 if (self.nameText.text.length > 0) { NSString *pwd = [SSKeychain passwordForService:kLoginServiceName account:self.nameText.text]; self.pwdText.text = pwd; } } /** * 解码 * * @param str * * @return */ - (NSString *)base64decode:(NSString *)str { if (str.length>0&&str!=NULL){ // 1.先把base64编码过后的字符串转换成二进制数据, NSData *data = [[NSData alloc]initWithBase64EncodedString:str options:0]; return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; }else{ return @""; } } /** * BASE64转换。 j加密 * * @param str * * @return */ - (NSString *)base64encode:(NSString*)str { // 1.把字符串转换成二进制数据 NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; return [data base64EncodedStringWithOptions:0]; } @end