常用加密算法介绍及https加密原理
对称加密
特点:加密、解密采用同一密钥。
优点:加密速度快
缺点:因用同一密钥加解密,在密文传输过程中需要把密钥也进行传输,这样增加了密钥的泄漏风险。
代表:DES、AES
-
DES
DES,中文为“数据加密标准”。是一种分组加密算法,密钥长度为56位,该算法每次处理固定长度的数据段,称之为分组。DES分组的大小是64位,如果加密的数据长度不是64位的倍数,可以按照某种具体的规则来填充位。 -
AES
AES中文名为“高级加密标准”。是一种区块加密标准,这个标准用来替代原先的DES。原因就在于其使用56位密钥,比较容易被破解。而AES可以使用128、192、256位密钥,并且用128位分组加密和解密数据,相对来说安全很多。完善的加密算法在理论上是无法破解的,除非使用穷尽法。据说,即使使用目前世界上运算速度最快的计算机,穷尽128位密钥也要花上几十亿年的时间。
非对称加密算法
特点:非对称加密又可称为公私钥加密,即用公钥加密只能用对应的私钥解密,私钥加密只能用对应的公钥解密。
优点:安全,公钥可以公开,只需保证私钥不被泄露即可。
缺点:加密速度慢
代表:RSA、ECC
-
RSA
RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。一般用于加密数据或者数字签名,因加密速度慢,一般只用于小数据加密。 -
ECC
ECC 算法的单位安全强度高于RSA算法,也就是说,要达到同样的安全强度,ECC算法所需的密钥长度远比RSA算法低。在私钥的加密解密速度上ECC算法比RSA速度更快。
hash算法
hash算法不是严格意义上的加密算法。一般来说加密算法是可逆的,即:能加密必能解密。而hash算法是有损加密,是不可逆的。hash算法加密后位数固定。因加密后的字符串是不变的。所以一般用于密码、信息等完整性校验。
缺点:可能存在hash碰撞(不同的明文可能会有相同的hash密文),但概率极低。
代表:SHA、md5
混合加密
由于对称加密的密钥容易泄漏,非对称加密的加解密速度较慢,而hash算法不可逆,各自有各自的优缺点。所以一般情况下,我们会把几种算法结合使用。如:
-
AES+RSA
用RSA加密AES的密钥,AES算法加密正文。把用RSA加密后的AES密钥,与AES加密后的密文进行传输。接收方再用RSA算法解出AES的密钥,然后再用AES的密钥解密正文。
AES+RSA是平常最常用的加密方式之一,它综合了两种算法的优点,并有效避免了两种算法各自的缺点。这样既保证了加解密的速度,又保证了密钥的安全性 -
数字签名(非对称+Hash算法)
数字签名是利用Hash算法的加密后字符串不变的特点进行验证的。其流程如下:
1.将明文进行用hash算法加密形成摘要,然后用“非对称加密算法私钥”加密形成签名。然后将签名和明文一起发送给接收方。
2.接收方接到之后用本地的“非对称加密算法公钥”解密签名获取摘要
3.把接收到的明文用同样的hash算法进行加密与第二步获得的摘要进行对比。
但是问题来了:数字签名的公钥容易被篡改,无法保证是合法的。所以我们引入了证书颁发机构颁发数字证书。
- 数字证书验证流程
1.向第三方CA机构提交公钥、组织信息、域名等信息申请证书
2.CA机构验证提交信息的真实性后,用hash算法把申请者信息进行加密生成摘要,然后用CA私钥把摘要进行加密形成签名,此签名和服务器公钥、申请者信息、签发机构信息、有效时间等一同保存在证书中,并签发给申请方。
3.客户端向服务器请求,服务器返回证书。客户端验证证书相关域名、有效时间等信息是否与本地证书信息对应。(客户端一般会内置被信任的证书信息,包含证书公钥)
4.客户端读取证书中的明文信息,并用相同的hash算法加密得到摘要。
5.客户端从本地取出证书的公钥对签名解密,并与上一步得到的摘要对比,如果一致,则可以确认证书的合法性。那么对应的服务器公钥也是值得信赖的
关注公众号【一个老码农】,更多优质技术文章等你来
- https
https是身披SSL/TLS外壳的http。https是一种通过计算机网络进行安全通信的传输协议,经由http进行通信,利用建立全信道,加密数据包。
而SSL/TLS正是混合了对称、非对称、hash三种算法所形成的。其包含了上面所说的“数字证书验证流程”和”AES+RSA混合加密”。
所以也可以说:https是由对称加密、非对称加密、hash算法三种算法共同实现的。
https的大致工作流程如下:
1.客户端发起https请求。
2.服务端把申请好的公钥证书返回给客户端。
3.客户端通过上面的“数字证书验证流程”验证证书的合法性,如果通过则继续第4步,不通过则显示警告信息。
4.客户端生成一个“对称加密”所使用的密钥,然后用证书中的服务器公钥加密这个密钥,发送给服务端
5.服务端用自己的私钥解密,得到“对称加密”密钥。
6.服务端用得到的“对称加密”密钥加密一段明文,发送给客户端。客户端使用对称密钥解密得到的明文
7.客户端发起请求,使用对称密钥加密一段明文,服务端收到后用对称密钥进行解密,得到明文。
最后附一张https流程图:
本文首发于公众号【一个老码农】