密碼學介紹

密碼學介紹

密碼學分類

  • 密碼編碼學
  • 密碼使用學
  • 密碼分析學

網絡開發準則

  • 1.在網絡開發中不容許傳輸用戶明文隱私數據
  • 2.在本地不容許保存用戶的明文隱私數據

加密算法

  • 哈希(散列)函數
  • MD5
  • SHA1
  • SHA256/512

對稱加密算法

加密&解密都是使用一個密鑰算法

  • DES 數據加密標準
  • 3DES (使用3個密鑰,對相同的數據來加密3次,加強加密強度)
  • AES(高級加密 蘋果的鑰匙串訪問也是用的AES)

非對稱加密算法

-用公鑰加密,私鑰解密
-用私鑰加密,公鑰解密shell

  • RSA
特色
1.算法公開 
2.對於相同的數據加密,獲得的結果是同樣的
3.獲得的結果都是定長的32位

MD5用途:

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值是否同樣

SSKeyChain使用

- (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;
    }
    
}

小結:

對稱加密算法

加密/解密使用相同的祕鑰; 祕鑰的保管十分重要函數

  • ECB:電子密碼本,每一個塊都是獨立加密的
加密:$ 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
  • CBC:密碼塊鏈,使用一個密鑰和一個初始化向量對數據執行加密轉換,能夠有效地保證密文的完整性
加密:$ 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

非對稱加密算法:RSA

OpenSSL生成祕鑰
RSA算法有兩個做用一個是加密一個是數字簽名。編碼

生成祕鑰:$ openssl genrsa -out ca.key 1024
相關文章
相關標籤/搜索