#import "ViewController.h"
#import "NSString+Hash.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self demo6];
}
// 时间戳密码:动态密码! U盾/将军令/手机令牌 密码一致在改变!
-(void)demo6{
// 原始密码:
NSString *password = @"zhang";
// hmacKey
NSString *hmacKey = @"8a627a4578ace384017c997f12d68b23";
// 获得当前时间:
NSDate *date = [NSDate date];
NSLog(@"%@",date);
// 设定当前时间的格式
NSDateFormatter *fommatter = [[NSDateFormatter alloc] init];
[fommatter setDateFormat:@"yyyy-MM-dd HH:mm"];
// 获得当前时间的字符串
NSString *time = [fommatter stringFromDate:date];
NSLog(@"当前时间time:%@",time);
// 第一次 hmac 运算(原始密码 + hmacKey)
password = [password hmacMD5StringWithKey:hmacKey];
// 拼接字符串(第一次 hmac 运算之后的结果 + 当前时间)
password = [password stringByAppendingString:time];
// 第二次 hmac 运算(之前拼接后的字符串 + hmacKey) 得到的密码就是动态密码了!
password = [password hmacMD5StringWithKey:hmacKey];
NSLog(@"动态密码: %@",password);
}
// hmac 加密算法,目前在国内渐渐流行!
-(void)demo5{
// 因为要在 Block 中修改这个值! 所以 添加 __block
__block NSString *password = @"hello";
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/httpLogin/hmackey.php"];
// 发送网络请求
[[[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
// NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
// JSON --> OC
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
NSString *hmacKey = dict[@"hmacKey"];
NSLog(@"hmacKey: %@",hmacKey);
// 用从服务器得到的 hmacKey 对密码进行 hmac 运算.
password = [password hmacMD5StringWithKey:hmacKey];
NSLog(@"%@",password);
}] resume];
}
// MD5加密:现在一般用作身份验证/校验!
-(void)demo4{
NSString *str = @"hello";
// 对字符串进行 MD5 加密/运算
// 如果用作加密/ 服务器和客户端采用相同的加密算法计算!
str = str.md5String;
NSLog(@"str: %@",str);
NSString *strM = @"helloh";
strM = strM.md5String;
NSLog(@"strM:%@",strM);
// 市面上所谓的解密,其实不是反向解密!是在数据库中查询记录!
NSString *str1 = @"heshiqiufengbeihuashan521";
str1 = str1.md5String;
NSLog(@"%@",str1);
// MD5 加密,针对简单的密码,可以通过一些网站查出来! //http://www.cmd5.com
// 人为的增加密码难度! MD5 加盐(盐加的多一点)
// (用户密码 + 盐值) MD5 运算!
NSString *password = @"123456";
// 盐值 (服务器和客户端的盐值是一样的就OK) 越咸(长/复杂)越好
NSString *salt = @"!@#$%^&*()_wertyuiop[1234567890-=";
// 给密码添加盐值
password = [password stringByAppendingString:salt];
// MD5 运算
password = password.md5String;
// md5 加盐,是一种比较高级的加密算法!
NSLog(@"%@",password);
}
// base64 解密
-(void)demo3{
// 1.拿到加密之后的base64二进制数据
NSData *base64Data = [NSData dataWithContentsOfFile:@"/Users/liaojianguo/zlf/私密图片"];
// 将 base64加密之后的二进制数据,转换成普通的二进制数据
NSData *data = [[NSData alloc] initWithBase64EncodedData:base64Data options:0];
[data writeToFile:@"/Users/liaojianguo/zlf/解密之后的图片" atomically:YES];
// base64 缺点: 1.加密之后的数据中有 = 号!很容易解密!
// 2.容易解密! 加密之后的数据,比原来的数据变大((8-6)/6) 1/3!
}
// base64 加密文件
-(void)demo2{
// 1.需要得到文件的二进制数据!
NSData *data = [NSData dataWithContentsOfFile:@"/Users/liaojianguo/zlf/images/png image/apple.png"];
// 2.将得到的文件二进制数据,进行base64加密
NSData *base64Data = [data base64EncodedDataWithOptions:0];
// 3.将加密之后的数据,存储
[base64Data writeToFile:@"/Users/liaojianguo/zlf/私密图片" atomically:YES];
}
// base64 加密字符串!
-(void)demo1{
// 普通的 8bit 二进制数据!
NSString *str = @"hello world";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
// 将字符串进行 base64 加密
// base64加密之后的二进制数据
NSData *base64Data = [data base64EncodedDataWithOptions:0];
// base64加密之后的字符串
NSString *base64String = [data base64EncodedStringWithOptions:0];
NSLog(@"data : %@",data);
NSLog(@"base64Data : %@",base64Data);
NSLog(@"base64String : %@",base64String);
}