加密&解密都是使用一個密鑰算法
-用公鑰加密,私鑰解密
-用私鑰加密,公鑰解密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