zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    PCB设计流程
    第一次PCB画板实战MiniDVPart1/3
    程序人生
    MCU死掉了
    一花一世界,一码一人生,谓之程序人生
    神船·神舟
    程序猿的选择
    android得到strings.xml文件中的内容
    Android特效 五种Toast详解
    Java字符串转换为日期和时间比较大小
  • 原文地址:https://www.cnblogs.com/pengpengzhang/p/4906256.html
Copyright © 2011-2022 走看看