数据安全及各种加密算法对比
常用加密方式:
- Base64编码(基础)
单项散列函数 MD5、SHA1、SHA256、SHA512等
消息认证码 HMAC-MD5、HMAC-SHA1
对称加密 DES|3DES|AES(高级加密标准)
非对称加密 RSA
数字签名
证书
Base64编码
base64编码:
// 要编码的字符串
NSString *str = @"haha";
// 转换成二进制文件
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
// 进行base64编码
NSString *dataStr = [data base64EncodedStringWithOptions:kNilOptions];
NSLog(@"%@", dataStr);
base64解码:
// 先对数据进行解码
NSData *encData = [[NSData alloc]initWithBase64EncodedString:dataStr options:kNilOptions];
// 将二进制数据转换成字符串
NSString *encStr = [[NSString alloc]initWithData:encData encoding:NSUTF8StringEncoding];
NSLog(@"%@", encStr);
原理:
将所有字符串转换成ASCII码。
将ASCII码转换成8位二进制。
将二进制三位归成一组(不足三位在后边补0),再按每组6位,拆成若干组。
统一在6位二进制后不足8位的补0。
将补0后的二进制转换成十进制。
从Base64编码表取出十进制对应的Base64编码。
若原数据长度不是3的倍数时且剩下1个输入数据,则在编码结果后加2个=;若剩下2个输入数据,则在编码结果后加1个=
特点:
可以将任意的二进制数据进行Base64编码。
所有的数据都能被编码为并只用65个字符就能表示的文本文件。
编码后的65个字符包括AZ,az,0~9,+,/,=。
对文件或字符串进行Base64编码后将比原始大小增加33%。
能够逆运算。
不够安全,但却被很多加密算法作为编码方式。
单项散列函数
单向散列函数也称为消息摘要函数、哈希函数或者杂凑函数。
单向散列函数输出的散列值又称为消息摘要或者指纹
特点:
对任意长度的消息散列得到散列值是定长的。
散列计算速度快,非常高效。
消息不同,则散列值一定不同。
消息相同,则散列值一定相同。
具备单向性,无法逆推计算。
经典算法:
MD4、MD5、SHA1、SHA256、SHA512等。
安全性:
md5解密网站:http://www.cmd5.com
MD5的强抗碰撞性已经被证实攻破,即对于重要数据不应该再继续使用MD5加密
疑问一:单项散列函数为什么不可逆??
原来好多同学知识知道md5加密是不可逆的,却不知道是为什么,其实散列函数可以将任意长度的输入经过变化得到不同的输出,如果存在两个不同的输入得到了相同的散列值,我们称之为这是一个碰撞,因为使用的hash算法,在计算过程中原文的部分信息是丢失了的,一个MD5理论上可以对应多个原文,因为MD5是有限多个,而原文是无限多个的。
一个形象的例子:2 + 5 = 7,但是根据 7 的结果,却并不能推算出是由 2 + 5计算得来的。
疑问二:为什么有些网站可以解密MD5后的数据??
MD5解密网站,并不是对加密后的数据进行解密,而是数据库中存在大量的加密后的数据,对用户输入的数据进行匹配(也叫暴力碰撞),匹配到与之对应的数据就会输出,并没有对应的解密算法。
MD5改进
由以上信息可以知道,MD5加密后的数据也并不是特别安全的,其实并没有绝对的安全策略,我们可以对MD5进行改进,加大破解的难度,典型的加大解密难度的方式有一下几种:
加盐(Salt):在明文的固定位置插入随机串,然后再进行MD5
先加密,后乱序:先对明文进行MD5,然后对加密得到的MD5串的字符进行乱序
先乱序,后加密:先对明文字符串进行乱序处理,然后对得到的串进行加密
先乱序,再加盐,再MD5等
HMac消息认证码
也可以进行多次的md5运算,总之就是要加大破解的难度。
Hmac消息认证码(对MD5的改进)
原理:
消息的发送者和接收者有一个共享密钥
发送者使用共享密钥对消息加密计算得到MAC值(消息认证码)
消息接收者使用共享密钥对消息加密计算得到MAC值
比较两个MAC值是否一致
使用:
客户端需要在发送的时候把(消息)+(消息·HMAC)一起发送给服务器
服务器接收到数据后,对拿到的消息用共享的KEY进行HMAC,比较是否一致,如果一致则信任
对称加密算法
对称加密的特点:
加密/解密使用相同的密钥
是可逆的
经典算法:
DES 数据加密标准
3DES 使用3个密钥,对消息进行(密钥1·加密)+(密钥2·解密)+(密钥3·加密)
AES 高级加密标准
密码算法可以分为分组密码和流密码两种:
分组密码:每次只能处理特定长度的一zu数据的一类密码算法。一个分组的比特数量就称之为分组长度。
流密码:对数据流进行连续处理的一类算法。流密码中一般以1比特、8比特或者是32比特等作为单位俩进行加密和解密。
分组模式:主要有两种
ECB模式(又称电子密码本模式)
使用ECB模式加密的时候,相同的明文分组会被转换为相同的密文分组。
类似于一个巨大的明文分组 -> 密文分组的对照表。
某一块分组被修改,不影响后面的加密结果
CBC模式(又称电子密码链条)
在CBC模式中,首先将明文分组与前一个密文分组进行XOR(异或)运算,然后再进行加密。
每一个分组的加密结果依赖需要与前一个进行异或运算,由于第一个分组没有前一个分组,所以需要提供一个初始向量iv
某一块分组被修改,影响后面的加密结果
非对称加密
鉴于对称加密存在的风险,非对称加密应运而生
特点:
使用公钥加密,使用私钥解密
公钥是公开的,私钥保密
加密处理安全,但是性能极差
非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥,但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快
经典算法:
- RSA
非对称加密存在的安全问题
原理上看非对称加密非常安全,客户端用公钥进行加密,服务端用私钥进行解密,数据传输的只是公钥,原则上看,就算公钥被人截获,也没有什么用,因为公钥只是用来加密的,那还存在什么问题呢??那就是经典的
中间人攻击
数字证书
数字证书包含:
公钥
认证机构的数字签名(权威机构CA)