序言:咱们都知道http协议采用的是明文传输,这种传输协议可能会致使数据泄露、数据篡改、流量劫持、钓鱼攻击等安全问题。http协议没法加密数据,全部通讯数据都在网络传输中“裸奔”。反观https协议,是在http上创建SSL加密层,并对传输数据进行加密,是http协议的安全版,比http协议多了如下几个优点:一、数据隐私性:内容经过对称加密,每一个链接生成一个惟一的加密密钥;二、数据完整性:内容传输通过完整性校验;三、身份认证:第三方没法伪造客户端身份。说了这么多https协议的优点,是否是以为AES、RSA以及AES+RSA加密技术排不上用场呢?不要急,接下来让我细细道来...
首先明确一点,咱们常说的SSL/TLS加密是发生在传输层的,若是SSL/TLS加密服务与服务器位于一台物理服务器上,那么SSL/TLS是能够提供端到端(end-to-end)的安全传输服务。可是事与愿违,现实每每不是以上部署方式,如今高并发的场景不少,不少都采用代理服务器做为中间介转发请求,也就是咱们说的负载均衡(Load Balance)。这种状况下代理服务器会先终结客户端SSL/TLS会话,而后再与服务器采用明文传输,即便这一段传输处于内部安全域,可是依然是一个重大的安全隐患。算法
幸运的是如今已经存在有不少效果比较好的加密算法能够帮助咱们解决上述问题。这些加密算法又是如何解决上述安全隐患的呢?下文将着重介绍AES、RSA以及AES+RSA加密技术方案。安全
美国国家标准和技术研究所(NIST)通过三轮候选算法筛选,从众多的分组密码中选中Rijndael算法做为高级加密标准(AES)。Rijndael密码是一个迭代型分组密码,分组长度和密码长度都是可变的,分组长度和密码长度能够独立的指定为128比特,192比特或者256比特。AES的加密算法的数据处理单位是字节,128位的比特信息被分红16个字节,按顺序复制到一个4*4的矩阵中,称为状态(state),AES的全部变换都是基于状态矩阵的变换。服务器
用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表一所示)。在轮函数的每一轮迭代中,包括四步变换,分别是字节代换运算(ByteSub())、行变换(ShiftRows())、列混合(MixColumns())以及轮密钥的添加变换AddRoundKey(),其做用就是经过重复简单的非线形变换、混合函数变换,将字节代换运算产生的非线性扩散,达到充分的混合,在每轮迭代中引入不一样的密钥,从而实现加密的有效性。网络
表一是三种不一样类型的AES加密密钥分组大小与相应的加密轮数的对照表。加密开始时,输入分组的各字节按
表二的方式装入矩阵state中。如输入ABCDEFGHIJKLMNOP,则输入块影射到如表2的状态矩阵中。并发
表一:负载均衡
|AES类型| 密钥长度 | 分组长度 | 加密轮数| |AES-128| 4字 | 4字 | 10 | |AES-192| 6字 | 4字 | 12 | |AES-256| 8字 | 4字 | 14 |
表二:函数
| A | E | I | M | | B | F | J | N | | C | G | K | O | | D | H | L | P |
字节代换运算(ByteSub())
字节代换运算是一个可逆的非线形字节代换操做,对分组中的每一个字节进行,对字节的操做遵循一个代换表,即S盒。S盒由有限域 GF(28)上的乘法取逆和GF(2)上的仿射变换两步组成。
行变换ShiftRows()
行变换是一种线性变换,其目的就是使密码信息达到充分的混乱,提升非线形度。行变换对状态的每行以字节为单位进行循环右移,移动字节数根据行数来肯定,第0行不发生偏移,第一行循环右移一个字节,第二行移两个,依次类推。
列混合变换MixColumns()
列变换就是从状态中取出一列,表示成多项式的形式后,用它乘以一个固定的多项式a(x),而后将所得结果进行取模运算,模值为 x4+1。其中a(x)={03}x3+{02}x2+{01}x+{02},
这个多项式与x4+1互质,所以是可逆的。列混合变换的算术表达式为:s’(x)= a(x) s(x),其中, s(x)表示状态的列多项式。
轮密钥的添加变换AddRoundKey()
在这个操做中,轮密钥被简单地异或到状态中,轮密钥根据密钥表得到,其长度等于数据块的长度Nb。高并发
首先,客户端建立一个AES密钥,而后把这个密钥经过网络传送给服务端,这样客户端和服务端都拥有了相同的密钥。接着,客户端用AES密钥加密明文获得密文,而后将密文传输给服务端,服务端使用相同的AES密钥对密文进行解密,获得明文。性能
RSA是在1977年发明RSA密码系统的三我的的名字的首字母的缩写,他们是:Ron Rivest、Adi Shamir和Leonard Adleman。它是第一个公钥加密算法,在不少密码协议中都有应用,如SSL和S/MIME。RSA算法是基于大质数的因数分解的公匙体系。简单的讲,就是两个很大的质数,一个做为公钥,另外一个做为私钥,如用其中一个加密,则用另外一个解密。密钥长度从40到2048位可变,密钥越长,加密效果越好,但加密解密的开销也大。RSA算法可简单描述以下:大数据
公开密钥:n=pq,(p,q为两个不一样的很大的质数,p和q必须保密) 将(p-1)和(q-1)相乘获得φ(n) 选择一个整数e (1<e<φ(n))与φ(n)互质 秘密密钥:d=e-1modφ(n),即计算一个数字d,使得它知足公式 de=1 modφ(n) 加密:c=mc(mod n) 解密:m=cd(mod n),m为明文,c为密文。
首先,服务端建立RSA密钥对,就是一个公钥和一个私钥,公钥经过网络传送给客户端,这样客户端有了本身的公钥,服务端有了本身的私钥。接着,客户端使用公钥加密明文获得密文,将密文经过网络传输给服务端,服务端使用私钥解密密文获得明文。
RSA算法是公开密钥系统的表明,其安全性创建在具备大素数因子的合数,其因子分解困难这一法则之上的。Rijndael算法做为新一代的高级加密标准,运行时不须要计算机有很是高的处理能力和大的内存,操做能够很容易的抵御时间和空间的攻击,在不一样的运行环境下始终能保持良好的性能。这使AES将安全,高效,性能,方便,灵活性集于一体,理应成为网络数据加密的首选。相比较,由于AES密钥的长度最长只有256比特,能够利用软件和硬件实现高速处理,而RSA算法须要进行大整数的乘幂和求模等多倍字长处理,处理速度明显慢于AES;因此AES算法加解密处理效率明显高于RSA算法。在密钥管理方面,由于AES算法要求在通讯前对密钥进行秘密分配,解密的私钥必须经过网络传送至加密数据接收方,而RSA采用公钥加密,私钥解密(或私钥加密,公钥解密),加解密过程当中没必要网络传输保密的密钥;因此RSA算法密钥管理要明显优于AES算法。
从上面比较得知,因为RSA加解密速度慢,不适合大量数据文件加密,所以在网络中彻底用公开密码体制传输机密信息是没有必要,也是不太现实的。AES加密速度很快,可是在网络传输过程当中如何安全管理AES密钥是保证AES加密安全的重要环节。这样在传送机密信息的双方,若是使用AES对称密码体制对传输数据加密,同时使用RSA不对称密码体制来传送AES的密钥,就能够综合发挥AES和RSA的优势同时避免它们缺点来实现一种新的数据加密方案。
基于以上表述能够总结两点缘由:
首先,服务端建立RSA密钥对,将公钥传输给客户端,同时客户端建立AES密钥,使用AES密钥加密明文获得密文,接着使用公钥加密AES密钥,最后将加密后的AES密钥和密文传输到服务端。服务端使用本身的私钥解密加密后的AES密钥获得AES密钥,接着使用AES密钥解密密文获得明文。
这一部分有时间再补充,很抱歉~