其他参考资料: 各种加密算法写在表格中,清晰对比
https://blog.csdn.net/david_pfw/article/details/82918698原文链接: https://blog.csdn.net/gulang03/article/details/81176593
数据传输过程中的加密是程序开发中避不开的一个问题。如何更科学更合理的使用加密算法也就成了一个开发人员必须了解的知识点,本文就该问题做简单的介绍。
注意:这些算法的详细知识不属于本文的范围。本文主要是根据其特点,说明如何在开发中合理使用这些算法。
加密算法有很多,这里只列出开发中常用的几种。
代表:
MD5、SHA(128、256)系列
简介:
严格来讲这不算是一种加密算法,应该叫做 信息摘要算法 。也是目前开发中应用非常广的算法。
散列函数(英语:Hash function)又称 散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做 散列值(hash values,hash codes,hash sums,或 hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现 散列冲突 。在 散列表 和 数据处理 中,不抑制冲突来区别数据,会使得 数据库记录 更难找到。
单向散列函数以下几个特点,决定了其有很高的使用价值。
单向散列函数是一种不可逆的信息摘要算法,无法通过密文还原成明文(注意:是算法上不能实现),对于简单的 MD5 加密(这里的简单是指:明文长度短,且字符单一,并且进行 HASH 操作的时候没有进行加盐处理),是可以通过一些在线工具网站解密出来,实则是利用了彩虹表的技术,大家可以自行 Google Search 一下。
目前在开发中 单向散列函数 主要可以用在下面这些情况:
用于生成信息的摘要,校验数据的完整性:
比如要比两个数据对象的是不是完全一样,我们可以先对两个数据对象进行 hash 操作,然后对比两个数据对象的 hash 值,如果相同,则认为这两个数据对象是一样。这种作用实际上很常用,如下图:
基于该特性,还可以在文件上传存储中为避免文件重名问题,使用该算法为每一个文件生成一个唯一的 ID(当然还可以使用 UUID)。更多场景大家可以自行脑补。
用于密码存储
密码存储是一个开发中很常见的问题,正式的应用项目数据库中密码的存储一定不会是明文存储的。既然要密文存储,那么可选的加密方法又会有很多种,到底是选对称的加密算法、还是非对称的加密算法、还是使用单向散列函数,还是使用多种组合?
这个肯定要结合 实际应用场景 和 系统对安全性的要求 等因素来考虑。考不过无论是使用 对称还是非对称,这个都需要考虑秘钥的存储管理,如果管理不合理,秘钥泄露,那么密码就无异于裸奔。同时考虑到系统管理员是带有主观因素的人,虑到这些情况,其实在一般的应用系统中,我们是可以使用 单向散列函数 来解决这个问题,这里最主要是利用了单向散列函数的单向性,这个单向性排除了人的因素,一旦使用了 单向散列函数 那么即使管理员能够看到加密之后的内容,但是他也难以得到明文,因为单向散列函数是理论上不可逆的。
但是去查资料可以知道,其实 MD5、SHA256 等已经不在安全,特别是直接使用 MD5、SHA256等单向散列函数是很不推荐的,最好的方式是在使用 单向散列函数处理之前对明文进行 “加盐处理”,这样再限定一下密码长度跟复杂度,就极大地提供了密码的安全性。所以使用 单向散列函数 配合 加盐、密码强渡校验 等措施后完全可以满足我们普通项目的需求:简单、实用、合理的安全性保障。
代表:
常见的对称加密算法有 DES、3DES、AES、Blowfish、IDEA、RC5、RC6。
特性:
简单来说就是加密与解密用的都是同一个秘钥。
优点:
通常情况下,在通用计算机中,相比非对称加密算法,对称加密算法效率会明显比较高。这个自己做过尝试,效果还是很明显的。
使用场景:
由于算法效率较高,一般用于对效率有要求的实时数据加密通信。比如在使用 VPN 或者代理进行 加密通信时,既要保证数据的保密性,又要保证不能有高的延迟,所以通常会使用对称加密算法。
代表:
RSA、ElGamal、背包算法、Rabin(RSA的特例)、迪菲-赫尔曼密钥交换协议中的公钥加密算法、椭圆曲线加密算法(英语:Elliptic Curve Cryptography, ECC)。使用最广泛的是RSA算法(由发明者Rivest、Shmir和Adleman姓氏首字母缩写而来)是著名的公开秘钥加密算法,ElGamal是另一种常用的非对称加密算法。
特性:
它需要两个密钥,一个是公钥,另一个是私钥,一个用于加密,另一个用于解密。如果其中一个密钥用于加密明文,则原始明文只能用对应的另一个密钥解密;即使最初用于加密明文的密钥也不能用作解密。因为加密和解密需要两个不同的密钥,所以称为非对称加密。
PS:通常情况下,公钥的长度一般比较短,所以我们会将公钥对外公开,让别人使用公钥来加密数据。而我则使用私钥解密数据,但是切记基于非对称的特性,我们也是可以使用公开私钥加密,而使用公钥解密。之所以不这样做仅仅是因为私钥通常比公钥要长,传输起来比较费资源而已。
优点:
参考特性。
主要应用场景:
主要用于秘钥交换,证书等场景。
基于公钥密码学的特点,它还提供了数字签名的功能(如左图),使电子文档能够在纸质文档上获得亲自签名的效果。
公钥基础设施(PKI)通过信任数字证书颁发机构的根证书并使用公钥加密来发布数字签名,从而形成信任链体系结构。它已经在 TLS 中实现,并在万维网的 HTTPS 和电子邮件的 SMTP 的 STARTTLS 中引入。
另一方面,信任网络采用分权的概念,而不是依赖数字证书认证机构的公钥基础设施,因为每个电子证书在信任链中只有一个根证书授权,信任网络的公钥可以累积多个用户的信任。PGP 就是一个例子。
对称与非对称的比较:
分析这两种算法的特点可以知道,单纯的使用 对称加密(如:AES) 的来加密两者传输中的数据的时候首先要让双方要知道秘钥是什么,可问题就是这个秘钥的传输是一个问题,直接通过网络传输是极其不安全的。因为网络一旦被监听,这个秘钥就没有存在的意义了,而监听一个网络,难度并不是很大,所以我们不能直接使用 AES 。
再来看非对称加密算法(如:RSA),由于RSA是非对称的加密算法,私钥用来解密,公钥用来加密,公钥之所以带“公”,也是因为其本身就是就需要对外公开的,并不需要保密。这样对于通信双方来说,建立链接之后的第一件事就是双方分发自己的公钥给对方,一端数据传输给对方的时候,先使用接收方发过来的公钥对数据进行加密后再发送,之后接收方会使用自己的私钥解密数据得到明文,然后再使用对方的公钥加密敏感的响应数据,之后再发送给对方,对方拿自己的私钥解密。这样就完成了数据的加密传输通信。我们分析这个过程可以知道,整个传输过程中,只是对外暴露了公钥,这时即使黑客拿到了公钥,但是也无法解密传输过程中的数据,因为只有私钥才能解密数据。这样看起来就完美的解决了双方的加密通信问题。但是有这种加密算法相比 AES 比较耗资源,对于一个访问量比较大的web服务来说,是不推荐的。
通过上面的分析,我们结合两者的优点,创建新的使用模式。先来张图做一个简单介绍
从上图可以看出,当客户端要与服务器端通信的时候,客户端先使用 RSA 算法生成自己的公钥和私钥,然后把公钥以明文的方式发送给服务器,服务器拿到公钥,并使用从客户端接收到的公钥对 AES 的秘钥进行加密然后返回给客户端。客户端接收到加密后的 AES 秘钥后就可以直接使用自己的私钥解密 AES 的秘钥,从而得到 AES 秘钥明文。之后两者的通信就可以使用 AES来实现敏感信息的加密了。这个操作就即解决了 AES 秘钥的传输问题,又解决了 RSA 算法效率不高的问题。