加密&解密都是使用一个密钥算法
-用公钥加密,私钥解密
-用私钥加密,公钥解密shell
特色 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