美文网首页iOS基础扩展iOS加密算法iOS 密码学
iOS加密4——动态密码(时间戳密码)

iOS加密4——动态密码(时间戳密码)

作者: 艳晓 | 来源:发表于2016-04-25 15:32 被阅读1062次

    一、动态密码:

    我们在登录一个手机app时,每次输入的账户密码都是固定的。但是这样呢如果通过网络请求发送时,容易被拦截获取到账号密码。其中有一种加密的方式,就是使用动态的密码进行登录。这样保密性会高很多。动态密码,实际上是先将普通密码加密再加上一段会变化的数据(比如时间)再进行一次加密。这样我们每次获得的密码部分都是不同的。这就是动态密码的大概含义——理解の。

    动态密码: 相同的密码明文,每次发送到服务器,密码都不同. ---时间戳密码!
    时间间隔越小,密码安全性越高! 一分钟/将军令/U盾

    二、时间戳密码的约定

    动态密码,我们需要事先和后台约定好对数据的加密方式。

    1. 服务器和客户端必须以相同的加密方式加密。
    2. 服务器时间和客户端的时间必须一致。
    3. 因为我们发送网络请求时,需要一点时间。可能会造成我们发送请求的时间与服务器接收到的时间发生时间差的情况。所以一段服务器端会计算两次(当前时间和一分钟后时间)这样我们调用接口时,会和他们进行判断,有一个正确,就认为账号密码正确——登录成功。

    三、实例代码步骤

    1. 对密码进行加密(调用到我们写的加密方法),创建字符串对象password接收。
    2. 创建网络请求字符串urlString,使用账号和经过加密后的密码password(步骤1)
    3. 创建url
    4. 创建网络请求对象request
    5. 发送网络请求

    调用到我们写的加密方法

    1、创建字符串对象存放服务器拿到的私钥。
    2、对密码和私钥进行第一次加密
    3、获取当前的时间,并对时间按照一定的格式进行处理
    4、将第一次加密后的密码和经过处理的时间进行拼接
    5、拼接后再进行一次加密,然后可以返回当前得到的字符串。

    • 其中:
      私钥
      第一次加密方式,
      时间格式处理,
      时间和密码拼接方式,
      第二次加密方式

      以上,客户端和服务器必须是一致的。这样我们才能获得相同的结果。完成登录注册验证。
    `- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
     {
         NSString *password = [self md5hmacWithPassword:@"zhangsan"];
         NSString *urlString = [NSString stringWithFormat:@"http://localhost/login/loginhmac.php?username=%@&password=%@",@"zhangsan",password];
         NSURL *url = [NSURL URLWithString:urlString];
         NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
         [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
     NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
         }];
     }`
    

    从参数中获取原始密码 password ,返回加密后的.

     - (NSString *)md5hmacWithPassword:(NSString *)password
     {
         // 1、私钥
         NSString *hmacKey = @"8a627a4578ace384017c997f12d68b23";
    
         // 2、对密码和私钥进行第一次加密
         password =  [password hmacMD5StringWithKey:hmacKey];
    
         // 3、取出当前的时间,将当前时间拼接在第一次机密的密码后面
         NSDate *date = [NSDate date];
    
         // 对当前时间做格式化处理.
         NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
         [formatter setDateFormat:@"yyyy-MM-dd HH:mm"];
         NSString *timer = [formatter stringFromDate:date];
    
         //4、 第一次加密之后的密码拼接当前时间
         password = [password stringByAppendingString:timer];
    
         //5、 对增加了时间戳的字符串进行 hmac 运算.
         password = [password hmacMD5StringWithKey:hmacKey];
         return password;
     }

    相关文章

      网友评论

      • 系统盘:加密有个问题,网络请求是不确定时间的,时间戳是秒计量的吧,这样服务器得计算至少60个匹配才能确定是不是?
        系统盘:@张艳晓 这样就说得通了
        艳晓:@我旁边坐了一个胖子 在设置时间时候的格式用的[formatter setDateFormat:@"yyyy-MM-dd HH:mm"];只取到分钟。

      本文标题:iOS加密4——动态密码(时间戳密码)

      本文链接:https://www.haomeiwen.com/subject/qsfqrttx.html