网络安全

对称加密

对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥
,即加密密钥也可以用作解密密钥,这种方法在密码学中叫做对称加密算法,对称加密算法使用起来简单快捷,密钥较短,且破译困难,除了数据加密标准(DES),另一个对称密钥加密系统是国际数据加密算法(IDEA),它比DES的加密性好,而且对计算机功能要求也没有那么高。IDEA加密标准由PGP(Pretty Good Privacy)系统使用。
对称加密算法在电子商务交易过程中存在几个问题:
1、要求提供一条安全的渠道使通讯双方在首次通讯时协商一个共同的密钥。直接的面对面协商可能是不现实而且难于实施的,所以双方可能需要借助于邮件和电话等其它相对不够安全的手段来进行协商;
2、密钥的数目难于管理。因为对于每一个合作者都需要使用不同的密钥,很难适应开放社会中大量的信息交流;
3、对称加密算法一般不能提供信息完整性的鉴别。它无法验证发送者和接受者的身份;
4、对称密钥的管理和分发工作是一件具有潜在危险的和烦琐的过程。对称加密是基于共同保守秘密来实现的,采用对称加密技术的贸易双方必须保证采用的是相同的密钥,保证彼此密钥的交换是安全可靠的,同时还要设定防止密钥泄密和更改密钥的程序。
假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥,密钥的生成和分发将成为企业信息部门的恶梦。
常见的对称加密算法有DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES

非对称加密

1976年,美国学者Dime和Henman为解决信息公开传送和密钥管理问题,提出一种新的密钥交换协议,允许在不安全的媒体上的通讯双方交换信息,安全地达成一致的密钥,这就是“公开密钥系统”。相对于“对称加密算法”这种方法也叫做“非对称加密算法”。
与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥
(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。
非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要,但加密和解密花费时间长、速度慢,它不适合于对文件加密而只适用于对少量数据进行加密。
如果企业中有n个用户,企业需要生成n对密钥,并分发n个公钥。由于公钥是可以公开的,用户只要保管好自己的私钥即可(企业分发后一般保存的是私钥,用户拿的是公钥),因此加密密钥的分发将变得十分简单。同时,由于每个用户的私钥是唯一的,其他用户除了可以可以通过信息发送者的公钥来验证信息的来源是否真实,还可以确保发送者无法否认曾发送过该信息。非对称加密的缺点是加解密速度要远远慢于对称加密,在某些极端情况下,甚至能比非对称加密慢上1000倍。 非对称加密的典型应用是数字签名。
常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
Hash算法(摘要算法)
Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。
常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA

加密算法的效能通常可以按照算法本身的复杂程度、密钥长度(密钥越长越安全)、加解密速度等来衡量。上述的算法中,除了DES密钥长度不够、MD2速度较慢已逐渐被淘汰外,其他算法仍在目前的加密系统产品中使用。

总结:
1: 哈希算法是一种摘要算法,主要作用是用来检验是不是原文件.严格意义上来说不属于加密算法(因为没有解密过程)
2: 获取字符串的MD5比较简单,其他对象可以先转化为NSData对象再进行操作
3: 可以根据路径直接获取本地数据,也可以将对象写入文件后获取为NSData对象
4: ios同样支持SHA1, base64, AES, 钥匙串, 等方式加密数据.

下面我们通过代码来看看iOS中对MD5的具体使用

首先,在新键的工程中,打开控制器的.m文件
然后进行引入MD5的框架

 // #import 

pragma mark - 字符串加密

// 1.准备加密的字符串
NSString *string = @"hello word"; `
// 因为MD5是用c写的和数据库sqlite一样,所以要编码
const char *fooData = string.utf8String;`
// 3: 创建一个字符串数组,接收MD5的值
unsigned char result[CC_MD5_DIGEST_LENGTH];
//4: 计算MD5的值 
//参数 1: 表示要加密的字符串
//参数 2: 获取要加密字符串的长度
//参数 3: 接收结果的数组

CC_MD5(fooData, (CC_LONG)strlen(fooData), result); 
NSMutableString *resultString = [NSMutableString string];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[resultString appendFormat:@"%02X",result[i]];  }
NSLog(@"resultString --> %@",resultString);

pragma mark - 其他对象加密(先转化成NSData)

// NSArray *array = @[@"1",@"2"]; 
 NSString *documentsPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]; 
NSString *path = [documentsPathStr stringByAppendingPathComponent:@"array.plist"];
[array writeToFile:path atomically:YES];
NSData *data = [NSData dataWithContentsOfFile:path];
`
// 1. 创建MD5对象
`CC_MD5_CTX md5;`
// 2. 初始化MD5对象
`CC_MD5_init(&md5);`
// 3. 准备MD5的加密
`CC_MD5_Update(&md5, data.bytes, (CC_LONG)data.length);`
// 4. 准备一个字符串数组,存储MD5加密之后的数据
`unsigned char result[CC_MD5_DIGEST_LENGTH];`
// 5. 结束MD5的加密
`CC_MD5_Final(result, &md5);
NSMutableString *resultString = [NSMutableString string];    for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) 
{ [resultString appendFormat:@"%02X",result[i]];
}    NSLog(@"%@", resultString);
}`

钥匙串加密
钥匙串(Keychain):是苹果公司Mac OS中的密码管理系统.一个钥匙串可以包含多种类型的数据: 密码(包含网站,FTP服务器,SSH账户, 无线网络, 群组软件, 加密磁盘镜像等), 私钥,电子证书和加密笔记.

苹果iOS和Mac OS X系统自带了一套敏感信息保存方案: “钥匙串(Keychain)"

钥匙串中的条目成为Secltem, 但它是存储在CFDictionary中的. SecltemRef类型并不存在.Secltem有五类: 通用密码, 互联网密码, 证书, 密钥和身份. 在大多数情况下, 我们用得到的都是通用密码

钥匙串的使用和字典非常的相似

用原生的Security.framework 就可以实现钥匙串的访问,读写. 但是只能在真机上进行. 通常我们使用KeychainItemWrapper来完成钥匙串的加密.

不同页面使用相同的 唯一标识符 也能解析到 数据

过程:
1、拷贝钥匙串类到工程(引入并且在Build Phases-Compile Soirces 中给KeychainItemWrapper改成arc和mrc混编即添加-info-objc-arc)
2、引入头文件
3、生成钥匙串对象
4、存储加密的数据
5、获取钥匙串对象
6、获取加密的数据

// 1.创建钥匙对象
//参数1:表示这个钥匙串对象的标识符
//参数2:分组一般为nil
`KeychainItemWrapper*wrapper = [[KeychainItemWrapperalloc]initWithIdentifier:@"MyItemWrapper"accessGroup:nil];`
//钥匙串是类似于字典存储的,在存储的时候必须使用系统的两个key值,其他的存不进去
`idkUserName = (__bridgeid)kSecAttrAccount;
idkPassWord = (__bridgeid)kSecValueData;`

//存入到钥匙串里面
`[wrappersetObject:@"123"forKey:kUserName]
[wrappersetObject:@"abc"forKey:kPassWord];`
//这里已经保存完成了
#pragma mark获取钥匙串的数据
`KeychainItemWrapper*newWrapper = [[KeychainItemWrapperalloc]initWithIdentifier:@"MyItemWrapper"accessGroup:nil]; 
NSString*userName = [newWrapperobjectForKey:kUserName];
NSString*passWord = [newWrapperobjectForKey:kPassWord]; 
NSLog(@"%@ %@",userName,passWord);`

RSA公钥加密
//公钥和私钥都是使用证书生成的, 并非我们自定义字符串就可以.我们使用的是生成好的公钥和私钥
//其中-----BEGIN PUBLIC KEY----- 开头结尾之类不属于密钥部分
//公钥,用于加密数据. 用于公开, 一般存放在数据提供方, 例如iOS客户端.
NSString *pubkey = @"公钥";
/私钥,用于解密数据. 必须保密, 私钥泄露会造成安全问题.
NSString *privkey = @"私钥";
NSString *string = @"James"; 
NSString *encPubKey;//公钥加密结果
NSString *decPriKey;//私钥解密结果
//使用RSA加密(RSA加密之后得到的结果每一次都不一样,但都可以通过同一个私钥进行解密)
//参数 1: 要加密的数据
//参数 2: 公钥
`encPubKey = [RSA encryptString:string publicKey:pubkey];
NSLog(@"encPubKey --> %@",encPubKey);
decPriKey = [RSA decryptString:encPubKey privateKey:privkey]; 
NSLog(@"decPriKey --> %@",decPriKey);

你可能感兴趣的:(网络安全)