1、DES(Data Encryption Standard):对称算法,数据加密标准,速度较快,适用于加密大量数据的场合;
2、3DES(Triple DES):是基于DES的对称算法,对一块数据用三个不同的密钥进行三次加密,强度更高;
3、RC2和RC4:对称算法,用变长密钥对大量数据进行加密,比 DES 快;
4、IDEA(International Data Encryption Algorithm)国际数据加密算法,使用 128 位密钥提供非常强的安全性;
5、RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的,非对称算法;
6、DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准),严格来说不算加密算法;
7、AES(Advanced Encryption Standard):高级加密标准,对称算法,是下一代的加密算法标准,速度快,安全级别高,在21世纪AES 标准的一个实现是 Rijndael 算法;
8、BLOWFISH,它使用变长的密钥,长度可达448位,运行速度很快;
9、MD5:严格来说不算加密算法,只能说是摘要算法;
10、PKCS:The Public-Key Cryptography Standards (PKCS)是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。
11、SSF33,SSF28,SCB2(SM1):国家密码局的隐蔽不公开的商用算法,在国内民用和商用的,除这些都不容许使用外,其他的都可以使用;
12、ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。
13、TEA(Tiny Encryption Algorithm)简单高效的加密算法,加密解密速度快,实现简单。但安全性不如DES,QQ一直用tea加密
加密算法 | 优点 | 缺点 | 破解方式 | 使用场景 | 安全性 |
---|---|---|---|---|---|
DES | 算法公开、计算量小、加密速度快、效率高; | 1,如果双方都持有秘钥,安全无法保证;2,秘钥安全保护成本高,管理困难; | 暴力破解、穷举 | 普通数据加密 | 低 |
3DES | 算法公开、计算量小、加密速度快、效率高; | 1,如果双方都持有秘钥,安全无法保证;2,秘钥安全保护成本高,管理困难; | 难度大 | 普通数据加密 | 较高 |
AES | 分组模式选择多,加密安全; | 同DES类似,密码管理都是问题; | 暴漏过线性密码攻击、查封密码攻击,难度大 | 普通数据加密 | 较高 |
MD5 | 简单、伪造难 | 潜在的冲突 | 有破解的案例 | 1,登录密码保护;2,文件防止篡改;3,HTTP传输内容加密防篡改;4,数字签名; | 较高 |
RSA | 原理简单; | 产生密钥麻烦,受到素数产生技术的限制,因此难做到一次一密;分组长度太大,不利于数据格式标准化; | 难度大 | 1,数字签名;2,公钥加密;3,防止数据篡改;4,通讯领域较多; | 高 |
MD5、SHA(128、256)系列
简介:
严格来讲这不算是一种加密算法,应该叫做 信息摘要算法 。也是目前开发中应用非常广的算法。
散列函数(英语:Hash function)又称 散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做 散列值(hash values,hash codes,hash sums,或 hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现 散列冲突 。在 散列表 和 数据处理 中,不抑制冲突来区别数据,会使得 数据库记录 更难找到。
单向散列函数以下几个特点,决定了其有很高的使用价值。
1、固定输入得到固定输出,且出现不同输入得到相同输出的概率极低。
2、单向性,就是根据算法,理论上不能从计算之后的散列值逆推出原始明文。
3、无论输入数据的长度是多少,得到的输出值是固定的。MD5(散列值进行 十六进制编码之后长度为32,SHA256 则为 64)
目前在开发中 单向散列函数 主要可以用在下面这些情况:
用于生成信息的摘要,校验数据的完整性:
比如要比两个数据对象的是不是完全一样,我们可以先对两个数据对象进行 hash 操作,然后对比两个数据对象的 hash 值,如果相同,则认为这两个数据对象是一样。这种作用实际上很常用,如下图:
密码存储是一个开发中很常见的问题,正式的应用项目数据库中密码的存储一定不会是明文存储的。既然要密文存储,那么可选的加密方法又会有很多种,到底是选对称的加密算法、还是非对称的加密算法、还是使用单向散列函数,还是使用多种组合?
这个肯定要结合 实际应用场景 和 系统对安全性的要求 等因素来考虑。不过无论是使用 对称还是非对称,这个都需要考虑秘钥的存储管理,如果管理不合理,秘钥泄露,那么密码就无异于裸奔。同时考虑到系统管理员是带有主观因素的人,虑到这些情况,其实在一般的应用系统中,我们是可以使用 单向散列函数 来解决这个问题,这里最主要是利用了单向散列函数的单向性,这个单向性排除了人的因素,一旦使用了 单向散列函数 那么即使管理员能够看到加密之后的内容,但是他也难以得到明文,因为单向散列函数是理论上不可逆的。
但是去查资料可以知道,其实 MD5、SHA256 等已经不在安全,特别是直接使用 MD5、SHA256等单向散列函数是很不推荐的,最好的方式是在使用 单向散列函数处理之前对明文进行 “加盐处理”,这样再限定一下密码长度跟复杂度,就极大地提供了密码的安全性。所以使用 单向散列函数 配合 加盐、密码强渡校验 等措施后完全可以满足我们普通项目的需求:简单、实用、合理的安全性保障。
代表:
常见的对称加密算法有 DES、3DES、AES、Blowfish、IDEA、RC5、RC6。
特性:
简单来说就是加密与解密用的都是同一个秘钥。
优点:
通常情况下,在通用计算机中,相比非对称加密算法,对称加密算法效率会明显比较高。
使用场景:
由于算法效率较高,**一般用于对效率有要求的实时数据加密通信。比如在使用 VPN 或者代理进行 加密通信时,**既要保证数据的保密性,又要保证不能有高的延迟,所以通常会使用对称加密算法。
代表:
RSA、Rabin(RSA的特例)、椭圆曲线加密算法(英语:Elliptic Curve Cryptography, ECC)。使用最广泛的是RSA算法(由发明者Rivest、Shmir和Adleman姓氏首字母缩写而来)是著名的公开秘钥加密算法,ElGamal是另一种常用的非对称加密算法。
特性:
它需要两个密钥,一个是公钥,另一个是私钥,一个用于加密,另一个用于解密。如果其中一个密钥用于加密明文,则原始明文只能用对应的另一个密钥解密;即使最初用于加密明文的密钥也不能用作解密。因为加密和解密需要两个不同的密钥,所以称为非对称加密。
PS:通常情况下,公钥的长度一般比较短,所以我们会将公钥对外公开,让别人使用公钥来加密数据。而我则使用私钥解密数据,但是切记基于非对称的特性,我们也是可以使用公开私钥加密,而使用公钥解密。不这样做的原因是因为私钥通常比公钥要长,传输起来比较费资源。
主要应用场景:
主要用于秘钥交换,证书等场景。
分析这两种算法的特点可以知道,单纯的使用 对称加密(如:AES) 的来加密两者传输中的数据的时候首先要让双方要知道秘钥是什么,可问题就是这个秘钥的传输是一个问题,直接通过网络传输是极其不安全的。因为网络一旦被监听,这个秘钥就没有存在的意义了,而监听一个网络,难度并不是很大,所以我们不能直接使用 AES 。
再来看非对称加密算法(如:RSA),由于RSA是非对称的加密算法,私钥用来解密,公钥用来加密,公钥之所以带“公”,也是因为其本身就是就需要对外公开的,并不需要保密。这样对于通信双方来说,建立链接之后的第一件事就是双方分发自己的公钥给对方,一端数据传输给对方的时候,先使用接收方发过来的公钥对数据进行加密后再发送,之后接收方会使用自己的私钥解密数据得到明文,然后再使用对方的公钥加密敏感的响应数据,之后再发送给对方,对方拿自己的私钥解密。这样就完成了数据的加密传输通信。我们分析这个过程可以知道,整个传输过程中,只是对外暴露了公钥,这时即使黑客拿到了公钥,但是也无法解密传输过程中的数据,因为只有私钥才能解密数据。这样看起来就完美的解决了双方的加密通信问题。但是有这种加密算法相比 AES 比较耗资源,对于一个访问量比较大的web服务来说,是不推荐的。
通过上面的分析,我们结合两者的优点,创建新的使用模式。先来张图做一个简单介绍
从上图可以看出,当客户端要与服务器端通信的时候,客户端先使用 RSA 算法生成自己的公钥和私钥,然后把公钥以明文的方式发送给服务器,服务器拿到公钥,并使用从客户端接收到的公钥对 AES 的秘钥进行加密然后返回给客户端。客户端接收到加密后的 AES 秘钥后就可以直接使用自己的私钥解密 AES 的秘钥,从而得到 AES 秘钥明文。之后两者的通信就可以使用 AES来实现敏感信息的加密了。这个操作就即解决了 AES 秘钥的传输问题,又解决了 RSA 算法效率不高的问题。