一、简介
iOS加密相关算法框架:CommonCrypto
明文: 明文指的是未被加密过的原始数据。
密文:明文被某种加密算法加密之后,会变成密文,从而确保原始数据的安全。密文也可以被解密,得到原始的明文。
密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥,分别应用在对称加密和非对称加密上。
二、iOS的加密方法
1、对称加密 -----AES
、DES
、DES
对称加密又叫做私钥加密,即信息的发送方和接收方使用同一个密钥去加密和解密数据。
对称加密的特点是算法公开、计算量少、加密和解密速度快效率高,适合于对大数据量进行加密;
缺点是双方使用相同的密钥、密钥传输的过程不安全、易被破解、因此为了保密其密钥需要经常更换
常见的对称加密算法有AES、DES、3DES、TDEA、Blowfish、RC5和IDEA。【不过DES被认为是不安全的】
加密过程:明文 + 加密算法 + 私钥 => 密文
解密过程: 密文 + 解密算法 + 私钥 => 明文
对称加密中用到的密钥叫做私钥,私钥表示个人私有的密钥,即该密钥不能被泄露。
其加密过程中的私钥与解密过程中用到的私钥是同一个密钥,这也是称加密之所以称之为“对称”的原因。由于对称加密的算法是公开的,所以一旦私钥被泄露,那么密文就很容易被破解,所以对称加密的缺点是密钥安全管理困难。
1.1、对称加密------AES
- AES:AES又称高级加密标准,下一代的加密算法标准,支持128(16)192(24)、256(32)位密钥的加密,加密和解密的密钥是同一个。iOS一般使用ECB模式,16字节的128位密钥。
- AES算法主要包括三个方面:轮变化、圈数和密钥扩展。
- 优点:高性能、高效率、灵活易用、安全级别高。
- 缺点:加密与解密的密钥相同,所以前后端利用AES进行加密的话,如何保存密钥成了一个问题
1.2、对称加密------DES
-
DES:数据加密标准,DES算法的入口参数有三个:Key、Data、Mode。
其中Key为7字节共56位,是DES算法的工作密钥;Data为8好字节的64位,是要被加密或解密的数据;Mode的工作方式:加密或解密; - 缺点:与AES相比,安全性较低
1.3、对称加密------3DES
3DES是DES加密算法的一种模式,它使用3条64位的密钥对数据进行三次加密。是DES像AES过渡的加密算法,是DES的一个更安全的变形,它以DES为基本模块,通过组合分组方法设计出分组加密算法。
2、非对称加密---- RSA加密
非对称加密也叫做公钥加密。非对称加密与对称加密相比,其安全性更好。对称加密的通信双方使用相同的密钥,如果一方的密钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对密钥,即公钥和私钥,且二者成对出现。私钥被自己保存,不能对外泄露。公钥指的是公共的密钥,任何人都可以获得该密钥。用公钥或私钥中的任何一个进行加密,用另一个进行解密。两种使用方法:
-
使用一:公钥加密私钥解密,过程如下:
明文 + 加密算法 + 公钥 => 密文, 密文 + 解密算法 + 私钥 => 明文 -
使用二:私钥做数字签名公钥验证,过程如下:
明文 + 加密算法 + 私钥 => 密文, 密文 + 解密算法 + 公钥 => 明文
由于加密和解密使用了两个不同的密钥,这就是非对称加密“非对称”的原因。
非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。 -
特点:
- 1)对信息保密、防止中间人攻击:将明文通过接收人的公钥加密、传输给接收人,因为只有接收人拥有对应的私钥,别人不可能拥有或者不可能通过公钥推算出私钥,所以传输过程中无法被中间人截获。只有拥有私钥的接收人才能阅读。此方法通常用于交换对称密钥。
- 2)身份验证和防止篡改:权限狗用自己的私钥加密一段授权明文,并将授权明文和加密后的密文,以及公钥一并发送出来,接收方只需要通过公钥将密文解密后与授权明文对比是否一致,就可以判断明文在中途是否被攥改过。此方法用于数字签名。
- 优点:加密强度小,加密时间长、常用于数字签名和加密密钥、安全性非常高,解决了对称加密保存密钥的安全问题
-
缺点:加密解密速度远慢于对称加密,不适合大批量数据加密。
在非对称加密中使用的主要算法有:RSA、Elgamal、Rabin、D-H、ECC(椭圆曲线加密算法)等。
2.1、非对称加密------RSA
- RSA算法是最流行的公钥密码算法,使用长度可以变化的密钥。
- RSA是第一个既能用于数据加密也能用于数字签名的算法
- RSA的安全性依赖于大数分解,小于1024位的N已经被证明是不安全的,而且由于RSA算法进行的都是大数计算,使得RSA最快的情况也比DES满上倍数,这是RSA最大的缺陷,因此通常只能用于加密少量数据或者加密密钥,但RSA仍然不失一种高强度的算法
- RSA是一种常用的非对称加密,对长度又限制,1024位key的最多只能加密127位数据,否则就会报错。RSA 算法规定:待加密的字节数不能超过密钥的长度值除以 8 再减去 11(即:KeySize / 8 - 11),而加密后得到密文的字节数,正好是密钥的长度值除以 8(即:KeySize / 8)
- android系统的RSA实现是"RSA/None/NoPadding",而标准JDK实现是"RSA/None/PKCS1Padding",所以会导致客户端机密服务器端解不了密。故要注意,需要两端同样,在获取Cipher时指定标准:Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding");
3、哈希算法---- MD5加密、SHA加密、HMAC加密
哈希算法加密是通过哈希算法对数据加密、加密后的结果不可逆,即加密后不能在解密。
- 特点:不可逆、算法公开、相同数据加密结果是一致的。
- 作用:信息摘要,信息“指纹”,用来做数据识别的。如用户密码加密、文件校验、数字签名、鉴权协议。
3.1、哈希算法------MD5加密
- 项目中无论是密码的存储或者说判断文件是否是同一文件,都会用到MD5算法。
- MD5英文全称“Message-Digest Algorithm 5”,翻译过来是“消息摘要算法5”,由MD2、MD3、MD4演变过来的。
- MD5一种单向加密算法,是不可逆的一种的加密方式
- MD5加密有哪些特点
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的
- 容易计算:从原数据计算出MD5值很容易
- 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别
- 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的
- MD5应用场景
- 一致性验证(密码校验)
- 数字签名
- 安全访问认证
- 大多数的登陆功能像后台提交密码时都会用到这种算法
- MD5加密区分大小写
- 和后台约定好,MD5加密的位数是16位还是32位(大多数是32位),16位的可以通过32位转换得到
- 虽然说MD5不可逆,但是网上破解MD5解密的网站很多,破解机制采用穷举法,也就是把所有可能结果进行一个一个检验。那么需要我们增加MD5破解的难度了,增加难度方式有如下方案
- 对字符串多次MD5加密
- MD5加盐【盐足够长足够乱得到的MD5码就很难】
- string+key(盐值key)然后进行MD5加密
- 用string明文的hashcode作为盐,然后进行MD5加密
- 随机生成一串字符串作为盐,然后进行MD5加密
3.2、哈希算法------SHA加密
SHA加密,安全哈希算法,主要适用于数字签名签名标准(DSS
)里面定义的数字签名算法(DSA
)。对于长度小于2^64
位的消息,SHA1
会产生一个160位的消息摘要。当接收消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。当然除了SHA1
还有SHA256
以及SHA512
等。
3.3、哈希算法------HMAC加密
HMAC加密,给定一个密钥,对明文加密,做两次“散列”,得到的结果还是32位字符串。
- hmac包实现了U.S.FederalInformation Processing Standards Publication 198规定的HMAC(加密哈希信息认证码)
- HMAC是使用key标记信息的加密hash。接收者使用相同的key逆运算来认证hash
- hmac主要用在身份验证中,它的使用方法是这样的
- 客户端发出登陆请求(假设是浏览器的GET请求)
- 服务器返回一个随机值,并在会话中记录这个随机值
- 客户端将该随机值作为密钥,和用户密码进行hmac运算,然后提交给服务器
- 服务器读取用户数据库中的用户密码和步骤2中发送的随机值做与客户端一样的hmac运算,然后与用户发送的结果比较,如果一致则验证用户合法
4、Base64加密
- 是一种编码方式,严格意义上来说不算加密算法。其作用就是将二进制数据编码成文本数据的方案,方便网络传输。
- 用base64编码之后,数据长度会变大,增加了大约1/3,但是好处是编码后的数据可以直接在邮件和网页中显示。
- 标准Base64编码解码无需额外信息即完全可逆,非常不安全。即使你自己自定义字符集设计一种类Base64的编码方式用于数据加密,在多数场景下也较容易破解。
- 标准Base64只有64个字符(英文大小写、数字和+、/)以及用作后缀等号;
- Base64是把3个字节变成4个可打印字符,所以Base64编码后的字符串一定能被4整除(不算用作后缀的等号);
-
等号
=
一定用作后缀,且数目一定是0个、1个或2个。这是因为如果原文长度不能被3整除,Base64要在后面添加\0凑齐3n位。为了正确还原,添加了几个\0就加上几个等号。显然添加等号的数目只能是0、1或2;
- Base64编码一般用于url的处理,UTF8编码
- 原理:
* 将所有字符转化为ASCII码
* 将ASCII转化为8位二进制
* 将二进制三位一组不足补0,共24位,在拆分成6位一组共四组
* 统一在6位二进制前补两个0到八位
* 将补0后的二进制转位十进制
* 最后从base64编码表获取十进制对应的base64编码
4、流加密
就是或、与、异或、或者加上某个数据
特点:可逆、原始数据和加密数据长度保持一致
网友评论