密码学基本认知
为什么需要加密算法,如果不加密可能导致哪些问题?
如果对传输的数据不使用加密算法,所有的数据在传输过程中都是明文传输的,那么会出现以下三种问题:
1)泄露问题:如果在网络中进行数据传输,数据以明文方式传输的话,通信双方传输的数据都是肉眼可见的,随意一个抓包软件就可以获取到通信双方传递的所有数据,造成数据泄露。
泄露问题举例:
- 在线购物:用户在未加密的网站上输入信用卡信息进行支付。黑客可以拦截这些数据,获取信用卡号、有效期和安全码,从而盗刷信用卡。
- 电子邮件:未加密的电子邮件在传输过程中可能被第三方截取,邮件中的个人信息、商业机密或敏感内容可能被他人获取。
2)篡改问题:如果不采取一些防篡改机制,那么如果有一个中间人拦截了通信双方传输的信息,并且在中间进行了修改,然后将修改过后的数据再传输给接收端,但是接收端对此数据是否被修改是无感应的,也就是说中间人对数据的修改接收方和发送方均感应不到
篡改问题举例:
- 金融交易:股票交易指令在网络中传输时未加密,攻击者可以篡改交易金额或股票代码,导致投资者遭受重大经济损失。
- 软件更新:软件的更新包在下载过程中未加密,黑客可以修改更新内容,植入恶意代码,从而控制用户设备或窃取数据。
3)冒充问题:通信双方如果不采取某些认证机制,那么网络上的任何人都可以相互冒充,并且利用你对某些身份的信任去让你执行一些不正当的操作
冒充问题举例:
- 网络登录:用户登录网站的认证信息未加密传输,攻击者可以窃取并冒充用户身份登录,进行非法操作。
- 通信应用:即时通讯工具中的消息未加密,攻击者可以冒充一方发送虚假消息,误导另一方做出错误决策。
本文主要介绍解决上述三种问题的常用机制:
- 信息加密:用于解决泄露问题
- 校验机制:用于解决篡改问题
- 身份证书:用于解决冒充问题
常见的加密算法
对称加密算法:
- AES(Advanced Encryption Standard):是目前最常用、最安全的对称加密算法之一。适用于大量数据的加密和解密,如文件加密、数据库加密、网络通信加密等。
- DES(Data Encryption Standard):相对较旧,安全性不如 AES,但在一些旧系统中仍可能使用。适用于对安全性要求不是特别高的场景。
- 3DES(Triple DES):是 DES 的改进版本,安全性有所提高。可用于对旧的 DES 系统进行升级。
对称加密算法适用于需要快速加密大量数据,并且通信双方可以安全地共享密钥的场景。
非对称加密算法:
- RSA:应用广泛,可以用于数字签名、密钥交换和数据加密。常用于网络通信中的身份验证和密钥协商。
- DSA(Digital Signature Algorithm):主要用于数字签名。
- ECC(Elliptic Curve Cryptography):在相同安全性下,密钥长度更短,计算效率更高。适用于资源受限的设备,如移动设备。
非对称加密算法适用于密钥交换、数字签名、身份验证等场景。
单向加密算法(哈希算法):
- MD5(Message Digest Algorithm 5):但由于安全性问题,现在不建议用于重要数据。
- SHA-1:也因安全性逐渐不被推荐。
- SHA-2(包括 SHA-256、SHA-384、SHA-512 等):安全性较高,常用于数据完整性校验、密码存储等。
单向加密算法适用于验证数据的完整性、生成消息摘要、密码存储的哈希处理等。
对称加密
为什么对称加密算法适用于需要快速加密大量数据
- 计算效率高:对称加密算法在加密和解密过程中使用相同的密钥,其**加密和解密的计算过程相对简单,速度快。**相比之下,非对称加密算法的计算复杂度通常较高。
- 密钥长度相对较短:在提供相同安全级别的情况下,对称加密算法所需的密钥长度通常比非对称加密算法短。较短的密钥意味着加密和解密操作所需的计算量减少,从而提高了处理大量数据时的速度。
- 硬件支持:许多现代硬件设备(如 CPU、加密芯片等)对常见的对称加密算法有专门的优化和指令集支持,进一步提高了加密和解密的速度。
- 流加密模式:对称加密算法可以采用流加密模式,能够实时处理数据流,无需对整个数据块进行缓冲,特别适合对连续的大量数据进行加密。
非对称加密
什么是密钥交换,为什么非对称加密算法适合做密钥交换,过程是怎么样的?
密钥交换是指在通信双方之间安全地共享用于后续加密通信的密钥的过程。
非对称加密算法适合做密钥交换的原因主要有:
- 解决对称加密中密钥配送的难题:在对称加密中,双方需要共享相同的密钥,如果直接传输密钥可能被窃取。非对称加密可以在不安全的信道上安全地交换密钥信息。
- 安全性高:基于数学难题,私钥的保密性强,难以从公钥推导出私钥,保证了密钥交换的安全性。
以下是以 RSA 算法为例的非对称加密密钥交换过程:
- 通信双方 A 和 B 分别生成自己的 RSA 密钥对,包括公钥和私钥。A 的公钥为
PU_A
,私钥为PR_A
;B 的公钥为PU_B
,私钥为PR_B
。 - A 想要与 B 进行安全通信,A 首先获取 B 的公钥
PU_B
。 - A 生成一个随机的对称密钥
K
(也称为会话密钥),这个密钥将用于后续的通信数据加密。 - A 使用 B 的公钥
PU_B
对对称密钥K
进行加密,得到加密后的密钥EK
。 - A 将加密后的密钥
EK
发送给 B。 - B 接收到
EK
后,使用自己的私钥PR_B
对其进行解密,得到对称密钥K
。 - 此时,A 和 B 都拥有了相同的对称密钥
K
,后续的通信就可以使用这个对称密钥进行加密和解密数据。
什么是数字签名,为什么非对称加密算法适合做数字签名,过程是怎么样的?
数字签名是一种用于验证消息来源和完整性的机制。**(防止篡改)**它类似于传统手写签名在数字世界中的等效形式,用于证明消息是由特定的发送方创建,并且在传输过程中未被篡改。
非对称加密算法适合做数字签名的原因包括:
- 不可否认性:只有拥有私钥的发送方能够生成有效的数字签名,从而无法否认发送过该消息。
- 验证来源:接收方可以使用发送方的公钥验证签名,确定消息确实来自声称的发送方。
- 完整性保障:签名与原始消息紧密相关,如果消息被篡改,签名验证将会失败。
数字签名的过程通常如下:
- 发送方生成消息。
- 发送方使用特定的哈希算法(如 SHA-256)对消息进行处理,生成消息摘要(一个固定长度的哈希值)。
- 发送方使用自己的私钥对消息摘要进行加密,得到的加密结果就是数字签名。
- 发送方将原始消息和数字签名一起发送给接收方。
- 接收方收到消息和数字签名后:
- 使用与发送方相同的哈希算法对原始消息进行计算,得到一个新的消息摘要。
- 使用发送方的公钥对数字签名进行解密,得到另一个消息摘要。
- 接收方比较这两个消息摘要。如果相同,则表明消息在传输过程中未被篡改,且确实来自声称的发送方。
什么是身份验证,为什么非对称加密算法适合做身份验证,过程是怎么样的?
身份验证是确认声称的身份是否真实有效的过程,目的是确保用户或实体是他们所声称的那个人或那个实体。(防止冒充)
非对称加密算法适合做身份验证的原因包括:
- 私钥的唯一性:每个实体的私钥是唯一且保密的,只有拥有正确私钥的实体才能成功完成身份验证过程。
- 不可伪造性:由于难以从公钥推导出私钥,攻击者难以伪造合法实体的身份验证信息。
以下是使用非对称加密算法进行身份验证的一般过程:
- 实体(如用户、服务器等)生成非对称密钥对,包括私钥和公钥。
- 实体将其公钥公开或注册到可信的认证机构或服务中。
- 当进行身份验证时,实体向验证方提供身份信息和使用其私钥对特定数据(如随机挑战值、时间戳等)进行签名。
- 验证方获取该实体的公钥。
- 验证方使用获取到的公钥对收到的签名进行验证。
- 如果验证成功,即签名与使用公钥验证的数据匹配,表明该实体拥有对应的私钥,从而确认其身份合法;否则,身份验证失败。
例如,在客户端与服务器的通信中,服务器向客户端发送一个随机挑战值,客户端使用其私钥对挑战值进行签名并返回给服务器,服务器使用客户端的公钥验证签名来确认客户端的身份。
单向加密
为什么单向加密算法适用于验证数据的完整性,过程是怎么样的
单向加密算法适用于验证数据完整性的原因主要有以下几点:
- 唯一性:相同的输入数据始终会产生相同的摘要。只要数据内容不变,摘要就不变。
- 敏感性:数据的微小变化会导致摘要的显著不同,能敏锐察觉数据的任何改动。
- 不可逆性:无法通过摘要反推出原始数据,增加了安全性。
以下是使用单向加密算法验证数据完整性的过程:
- 发送方:
- 对待发送的数据使用单向加密算法(如 SHA-256)进行计算,得到数据的摘要值。
- 将原始数据和摘要值一起发送给接收方。
- 接收方:
- 接收到数据后,使用与发送方相同的单向加密算法对收到的原始数据进行计算,得到新的摘要值。
- 将新计算得到的摘要值与接收到的原始摘要值进行对比。
- 如果两个摘要值相同,说明数据在传输过程中没有被篡改,完整性得到了保证;如果不同,则表明数据的完整性遭到了破坏。
例如,使用 SHA-256 算法计算 “Hello World” 的摘要值。发送方计算出摘要值并与数据一同发送。接收方收到后重新计算数据的摘要值并与收到的摘要值比较,以此判断数据完整性。
为什么单向加密算法适用于密码存储的哈希处理,过程是怎么样的
单向加密算法适用于密码存储的哈希处理,主要原因如下:
- 安全性:单向加密算法的不可逆性使得即使数据库被攻击者获取,也无法直接从哈希值还原出原始密码。这大大降低了密码泄露的风险。
- 效率:计算哈希值的速度通常很快,适合在用户注册或登录时快速处理密码。
- 存储节省:哈希值通常比原始密码占用更少的存储空间。
过程通常如下:
- 用户注册时:
- 用户输入密码。
- 系统使用单向加密算法(如 bcrypt、scrypt 或 PBKDF2 结合 SHA-256 等)对密码进行处理,生成哈希值。
- 系统将生成的哈希值存储在数据库中,而不是存储原始密码。
- 用户登录时:
- 用户输入密码。
- 系统使用相同的单向加密算法对输入的密码进行处理,生成新的哈希值。
- 系统将新生成的哈希值与数据库中存储的哈希值进行比较。
- 如果两个哈希值匹配,登录成功;否则,登录失败。
通过这种方式,即使数据库被攻破,攻击者获得的也只是密码的哈希值,而不是明文密码,从而增加了密码的安全性。