之前我们说过了iOS中相对比较安全的存储用户数据方式KeyChain但是实际上,如果在将数据存入KeyChain中时,如果使用加密后的密文存储,会比直接明文存储更加安全。但是加密的方式都有哪些?又要怎么样来选择加密的算法呢?这篇文章先简单介绍一下常用的加密算法都有哪些。
常见的加密算法可以分成三种:
- 对称加密算法;
- 非对称加密算法;
- Hash算法;
接下来我们就来看看这些算法。
对称加密算法
对称加密算法,如其名,就是使用同一个秘钥进行加密和解密。
优点是速度较快,适合对数据量比较大的数据进行加密。
缺点是密钥的保存方式需要保证,一旦加密或者解密的哪一方泄漏了密钥,都会导致信息的泄漏。
常用的对称加密算法有:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6、AES。
DES
DES加密算法是一种分组加密算法,以64位为分组对数据进行加密,他的密钥长度为56位,速度较快,适合用于大量数据加密的场合。
3DES
基于DES加密,对一块数据使用三个不同的密钥进行加密三次,强度更高。
AES
高级加密标准,是新一代加密算法标准,取代DES,速度快,安全级别高。密钥长度最少支持128、192、256,分租长度128位。
非对称加密
与对称加密相对的,非对称加密需要两个密钥,一个公开密钥(Public Key),一个私有密钥(Private Key)。公钥和私钥是一对,如果使用公钥进行加密的数据,只有对应的私钥才能解密。相对的,如果是使用私钥加密的数据,只有对应的公钥才能解密。
优点是公钥可以被任何人知道,而公钥的泄漏也不会导致信息泄漏,但是一旦私钥泄漏了就会导致信息泄漏。
常用的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)。
RSA
RSA加密算法是目前最有影响力的公钥加密算法,并且被普遍任务是最优秀的公钥方案之一。RSA是第一个能同时加密和数字签名的算法,它能够抵抗到目前为止已知的所有密码攻击。
RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是如果想要对其进行因式分解却极其困难,因此可以将乘积公开作为密钥。
ECC
ECC使用的是椭圆曲线编码学,相对于RSA,ECC的抗攻击性更强,并且计算量小,处理速度快,存储空间占用小,所以适用于移动设备使用。
Hash算法
Hash算法(哈希散列算法)特别之处在于它是一种单向算法,即不可逆,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,但是却不能通过这个Hash值重新获得目标信息。
因为此特点,Hash算法通常用在存储不可还原的密码存储,信息完整校验等地方。
常用的Hash算法有:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1。
MD5
MD5加密算法可以简单的分析为以512位分组来处理输入的信息,且每一个分组又被划分为16个32位的子分组,经过一系列的处理之后,算法的输出由4个32位分组组成,将这4个32位分组级联后就会生成一个128位散列值。
MD5大多被用于软件的密码认证和钥匙识别上。
SHA1
SHA1和MD5一样是流行的信息摘要算法。对于长度小于2’64位的消息,SHA1会生成一个160位的信息摘要,当接收到消息的时候,这个消息摘要可以用来验证数据的完整性,在传输的过程中,数据很可能发生变化,那么这时候就会生成不同的信息摘要。SHA1不可以从消息摘要中复原信息,而两个不同的消息不会产生同样的信息摘要。这样,SHA1就可以用来验证数据的完整性。
算法对比
名称 | 密钥长度 | 运算速度 | 安全性 | 资源消耗 | 加密类型 |
---|---|---|---|---|---|
DES | 56位 | 较快 | 低 | 中 | 对称加密 |
3DES | 168位 | 慢 | 中 | 高 | 对称加密 |
IDEA | 128位 | 较慢 | 中 | 高 | 对称加密 |
AES | 128、192、256位 | 快 | 高 | 低 | 对称加密 |
RSA | 1024、2048、3072、4096位 | 慢 | 高 | 高 | 非对称加密 |
DSA | 1024、2048、3072、4096位 | 慢 | 高 | 低 | 非对称加密 |
ECC | 256 | 快 | 高 | 低 | 非对称加密 |
SHA-1 | 慢 | 高 | 低 | Hash加密 | |
MD5 | 快 | 中 | 低 | Hash加密 |
算法选择
对称加密的算法相较于非对称加密算法会快很多,如果需要对大量的数据进行加密时,建议采用对称加密算法,加快加密解密速度。
而对于需要签名的情况,只能使用非对称加密。
当数据量很小,而密钥的管理用来决定数据安全时,最好使用非对称加密。
在选定了算法之后,选择多少位的密钥也是一个难题,一般情况下,密钥越长,运行的速度越慢,所以我们要根据实际需要选择加密的位数,一般来说,RSA采用1024位,ECC采用160位,AES采用128位。