加密&解密都是使用一个密钥
-用公钥加密,私钥解密
-用私钥加密,公钥解密
特点
1.算法公开
2.对于相同的数据加密,得到的结果是一样的
3.得到的结果都是定长的32位
1.密码:(服务器不需要知道用户的真实密码,数据库保存的是加密密码)
2.搜索:
iOS 进阶 执行终端命令:md5 -s "iOS"
iOS :MD5 ("iOS") = 1bdf605991920db11cbdf8508204c4eb
进阶:MD5 ("进阶") = fa11f8c07c1629d5f0ab1cfecdf1f686
3.版权:
MD5 ("123.png") = 812749e1a307f38fd0a88b54bea55ff2
MD5 ("456.png") = 9ef5055324e69f335d69b27ea40d2202
4.文件完整性校验
A:下载文件校验:下载前服务端给你MD5和下载后你自己进行加密的MD5值进行校验,如果一样就是完整的;否则文件有可能不可用
B: 上传:(断点续传)上传MD5和文件上传完生成的MD5值是否一样
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//加载用户信息:
[self loadUserInfo];
}
- (void)loadUserInfo {
//加载账号
self.userTF.text = [[NSUserDefaults standardUserDefaults] stringForKey:@"CCLoginUserName"];
NSLog(@"%@",[SSKeychain allAccounts]);
self.pwdTF.text = [SSKeychain passwordForService:CCLoginServiceName account:self.userTF.text];
}
- (IBAction)login:(id)sender {
NSLog(@"登录点击了");
//1发送请求给服务器一一认证
NSString * userId = self.userTF.text;
NSString * pwd = self.pwdTF.text;
//1.MD5加密
//pwd = pwd.md5String;//202cb962ac59075b964b07152d234b70
//2.MD5 加盐
//固定的盐有人知道
//pwd = [pwd stringByAppendingString:salt].md5String;//561dc6ca5c2dfba14477f2114eaf62bc
//3.--HMAC---
//在实际开发中,秘钥来自于服务器,注册的时候
NSString * key = nil;
if (key==nil) {
//1.发送网络请求获取秘钥
key = [self getKeyWithAccount:userId];
//2.展示小菊花
//3.展示你等待授权页面
//获取成功-》登录
//立刻保存在本地--- 钥匙串
if (key.length>0 ) {
[SSKeychain setPassword:key forService:CCKeyServiceName account:userId];
}
}
pwd = [pwd hmacMD5StringWithKey:key];
NSLog(@"现在的密码是:%@",pwd);
if ([self isLoginWithUserId:userId Password:pwd]) {
[self savePwdWithAccount:userId pwd:self.pwdTF.text];
NSLog(@"登录成功!");
}else {
NSLog(@"登录失败!");
}
}
- (void)savePwdWithAccount:(NSString*)account pwd:(NSString*)pwd {
//1.保存账号
[[NSUserDefaults standardUserDefaults] setObject:account forKey:@"CCLoginUserName"];
//2.同步--立马马上给我同步
[[NSUserDefaults standardUserDefaults] synchronize];
//保存密码
if (account.length > 0 && pwd.length > 0) {
[SSKeychain setPassword:pwd forService:CCLoginServiceName account:account];
}
}
- (NSString*)getKeyWithAccount:(NSString*)count {
//1.需要授权
//2.直接返回秘钥
NSString * key = [SSKeychain passwordForService:CCKeyServiceName account:self.userTF.text];
NSLog(@"key===>%@",key);
if (key == NULL) {
return @"小cc";//正式应该重新向服务端请求
}else {
return key;
}
}
- (BOOL)isLoginWithUserId:(NSString*)userId Password:(NSString*)pwd {
if ([userId isEqualToString:@"CC"] && [pwd isEqualToString:@"59016b26db85306b00a413fb0d4e2209"]) {
return YES;
}else {
return NO;
}
}
加密/解密使用相同的秘钥; 秘钥的保管十分重要
加密:$ openssl enc -des-ecb -K 616263 -nosalt -in msg1.txt -out msg1.bin
解密:$ openssl enc -des-ecb -K 616263 -nosalt -in msg1.bin -out msg1.txt -d
查看加密后的二进制文件:$ xxd msg1.bin
加密:$ openssl enc -des-cbc -K 616263 -iv 0000000000000000 -nosalt -in a.txt -out msg1.bin
解密:$ openssl enc -des-cbc -K 616263 -iv 0000000000000000 -nosalt -in msg1.bin -out msg4.txt -d
查看加密后的二进制文件:$ xxd msg1.bin
OpenSSL生成秘钥
RSA算法有两个作用一个是加密一个是数字签名。
生成秘钥:$ openssl genrsa -out ca.key 1024
原文:https://www.cnblogs.com/StevenHuSir/p/10369724.html