密码学介绍

密码学介绍

密码学分类

  • 密码编码学
  • 密码使用学
  • 密码分析学

网络开发准则

  • 1.在网络开发中不允许传输用户明文隐私数据
  • 2.在本地不允许保存用户的明文隐私数据

加密算法

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

对称加密算法

加密&解密都是使用一个密钥

  • DES 数据加密标准
  • 3DES (使用3个密钥,对相同的数据来加密3次,增强加密强度)
  • AES(高级加密 苹果的钥匙串访问也是用的AES)

非对称加密算法

-用公钥加密,私钥解密
-用私钥加密,公钥解密

  • 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

猜你喜欢

转载自www.cnblogs.com/StevenHuSir/p/10369724.html