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: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

 

posted @ 2015-10-24 09:51  。低调ヽ继续  阅读(180)  评论(0编辑  收藏  举报