IOS中的用户安全

用户安全:

  原则:在网络传输过程中,关于用户的密码是不能传递明文的,需要通过加密之后进行传递,

    一般采用的加密技术是:

      (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: 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: error:NULL]; NSLog(@"%@",result);
// 跟服务端进行沟通
if ([result[@"userId"] intValue] > ) {
#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 > ) {
NSString *pwd = [SSKeychain passwordForService:kLoginServiceName account:self.nameText.text];
self.pwdText.text = pwd;
}
}
/**
* 解码
*
* @param str
*
* @return
*/
- (NSString *)base64decode:(NSString *)str
{
if (str.length>&&str!=NULL){
// 1.先把base64编码过后的字符串转换成二进制数据,
NSData *data = [[NSData alloc]initWithBase64EncodedString:str options:]; 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:];
} @end
上一篇:iOS开发 iOS10推送必看(基础篇)-转


下一篇:ios如何实现推送通知