常用加密/解密/签名/认证算法学习笔记
本文目录:
1. 加密/解密/签名/证书概念说明
2. 举例说明使用场景
3. HTTP/SSL/TLS/HTTPS概念和流程
4. 生成证书/公私钥的方法
-----------------------------------------------------------------------------------------------
一、加密/解密/签名/认证概念说明
常见加密类型:有对称加密/非对称加密/不可逆加密
1.对称加密:
1) 概念:一把密钥,加解密使用同一把密钥,双方都必须保管好;
2) 算法: DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES等
------------------------------------------------------------------------------------------------------------------
2.非对称加密:
1)概念:两把密钥,公钥和私钥。
--公钥:公开的密钥,提供给别人;
--私钥:自己保存好,不能泄露。
两者均可用来加密数据和解密数据,成对使用。
2)常用算法 : RSA、ECC、Diffie-Hellman、El Gamal、DSA
3)用途:
---使用公钥加密,私钥解密:常用于数据的非对称加解密,安全性高;
---使用私钥加密,公钥解密:常用于数字签名,用于检验数据的完整性,有没有被人篡改;
加解密的单位通常为bit,这也是为什么很多编程语言(如Java)加解密API的输入输出为字节。如果需要用字符串表示,可以使用Base64或Hex编码(Hex从字节到字符串的转换速度快但体积大,Base64相对较慢但体积小)
------------------------------------------------------------------------------------------------------------------
3.不可逆加密:
1) 概念:无密钥,只能从明文转换为密文,无法通过密文获取明文(单向加密),用于确认文件和数据是否被篡改;
2) 算法:
a. 报文摘要算法 MD:
信息摘要算法(Message-Digest Algorithm)。最常用的是 MD5 (Message-Digest Algorithm 5),是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),常用于确保信息传输完整一致
b. 安全散列算法 SHA:
安全散列算法(Secure Hash Algorithm)是一种不可逆的信息安全算法,经过量化运算和转换,可以把任意长度的数据生成不可逆的、固定长度的字符串,这个固定长度的字符串就是对相应的原始输入字符串的散列(也称为摘要),可以作为信息的指纹。
SHA-224,SHA-256,SHA-384,SHA-512 统称为 SHA-2,而 SHA-1 算法已经不够安全,不建议继续使用。
c. 消息认证码算法 MAC:
消息认证码算法(Message Authentication Code)是含有加密密钥的散列算法,它在 MD 和 SHA 算法特性的基础上加入了加密密钥,通过特别的计算方式来构造消息认证码(MAC)的方法。因 MAC 算法融合了密钥散列函数,通常也称为 HMAC 算法(Hash-based Message Authentication Code,散列消息认证码)。
常见的有:HMAC-SHA224、HMAC-SHA256、HMAC-SHA384、HMAC-SHA512
3) 作用:主要用于摘要算法。
------------------------------------------------------------------------------------------------------------------
3. 摘要:
1) 什么是消息摘要?
对一份数据,进行一个单向的 Hash 函数,生成一个固定长度的 Hash 值,这个值就是这份数据的摘要,也称为指纹。
2)摘要算法
常见的摘要算法有 MD5、SHA-1、SHA-256 等。
3)特点:
---对于同一个摘要算法,无论输入的数据是什么,输出都是相同长度的值。
例如 MD5,无论数据有多大,输出总是128位的散列值。
---摘要算法是单向的,只能根据原始数据计算出它的摘要值,但是不能根据摘要值反算出原始数据。
---越优秀的摘要算法越难找到Hash碰撞。
虽然长内容生成短摘要是必定会产生碰撞的,但一个优秀的摘要算法很难主动构造出两条数据,使得他们的摘要值相同。
4)消息摘要的用途:可以用于校验数据的完整性。相比加密算法,摘要算法速度都相对较快
------------------------------------------------------------------------------------------------------------------
4.签名
1) 原理:数字签名是一种用于验证数字信息完整性和真实性的技术。它在确保通信安全、数据完整性和身份验证方面起着重要作用. 比较高效的数字签名方案: 将摘要算法和非对称加密结合使用。
2) 步骤:
a. 对需要发送的报文originData使用md5、sha256等算法先计算摘要特征值 signBlock;
b. 再使用私钥 privateKey 对 signBlock 加密获得数字签名 signatureData。
c. 将signatureData 与 originData 打包发一起送给对方
d. 消息接收者收到后,用公钥对密文signatureData进行解密,得到一份hash的明文数据;
e. 再通过使用同样的算法(md5或sha256)计算摘要值,与上述解密得到的明文数据进行对比。
f. 签名验证. 如果两者相同,签名验证成功,确认消息未被篡改且确实来自发送者。如果两者不同,签名验证失败,表明消息可能被篡改或签名不合法。
------------------------------------------------------------------------------------------------------------------
5.数字证书:
1) 概念:数字证书是电子文档的一种,用于证明公钥的所有者身份,并确保信息在互联网上的安全传输。它是数字签名技术的应用之一,广泛用于网络安全和身份验证。
2) 作用:
a. 身份验证:数字证书可以验证持有者的身份,确保通信的另一方是声称的身份。通过验证 CA 的签名,用户可以确认证书的有效性和持有者的身份。
b. 数据加密:数字证书中的公钥可用于加密数据,确保在传输过程中只有持有相应私钥的接收者能够解密和读取数据。
c. 数据完整性:数字证书可以确保数据在传输过程中未被篡改。结合数字签名技术,接收者可以验证数据的完整性。
d.不可否认性:使用数字证书签署的数据可以防止发送者否认其发送过该数据,因为只有持有私钥的人才能生成有效的数字签名。
e.建立安全连接:在 HTTPS(HTTP Secure)协议中,数字证书用于建立 SSL/TLS 加密连接,确保用户与服务器之间的安全通信。
3). 应用场景
数字证书在许多安全通信和身份验证的场景中发挥着重要作用,包括:
a. Web 服务器:为网站提供 SSL/TLS 证书,确保用户与网站之间的安全通信
b. 电子邮件:用于 S/MIME 电子邮件加密和签名,保护电子邮件内容的安全。
c. 代码签名:确保软件和应用程序的来源和完整性,防止恶意软件的传播。
d. 虚拟专用网络(VPN):确保远程连接的安全性。
4) 包括内容:
数字证书是由可信的第三方(称为证书颁发机构,CA)签发的电子文件,包含以下信息:
a. 公钥:与证书持有者相关联的公钥。
b. 持有者信息:证书持有者的身份信息,例如姓名、电子邮件地址、组织名称等。
c. 证书颁发机构信息:签发证书的 CA 的信息。
d. 有效期:证书的有效起始日期和到期日期。
e. 序列号:唯一标识该证书的序列号。
f. 签名:CA 使用其私钥对证书内容进行数字签名,以保证证书的真实性和完整性
是预装在操作系统中的。
5) CA根证书的生成和使用:
流程步骤如下:
用根证书的公钥,可以验证其他证书的签名是否正确。如果签名正确,则证书是可信的、没有被篡改的。后续就可以使用这个被信任证书中包含的公钥,去验证收到的消息是否可信了。
用CA证书去证明另外一个证书是否可信,我们可以称之为 证书的递归验证。类似地,我们也可以用一个受信任的证书,去验证其他证书是否可信。
------------------------------------------------------------------------------------------------------------------
二、举例说明使用场景
图文解说如下:
1. 小明有两把钥匙,一把是公钥,另一把是私钥。
2. 小明把公钥送给他的朋友们----小刚、小强、小红----每人一把。
3. 小红要给小明写一封保密的信。她写完后用小明提供的公钥加密,就可以达到保密的效果
4. 小明收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要小明的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
5. 小明接下来给小红写回信,决定采用** "数字签名"**。他写完信后先用Hash函数,生成信件的摘要(digest)
6. 然后小明使用私钥,对这个摘要加密,生成"数字签名"(signature)。
7. 小明将这个签名,附在信件下面,一起发给小红。
8. 小红收信后,取下数字签名,用小明的公钥解密,得到信件的摘要。由此证明,这封信确实是小明发出的。
9. 小红再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。
10. 接下来讨论下意外复杂的情况。
如果小刚想欺骗小红,他偷偷使用了小红的电脑,用自己的公钥换走了小明提供的公钥。此时,小红实际拥有的是小刚的公钥,但是还以为这是小明的公钥。因此,小刚就可以冒充小明,用自己的私钥做成"数字签名",写信给小红,让小红用假的小明公钥进行解密。
11. 后来,小红感觉不对劲,发现自己无法确定公钥是否真的属于小明。她想到了一个办法,要求小明去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对小明的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。
13. 小明拿到数字证书以后,就可以放心了。以后再给小红写信,只要在签名的同时,再附上数字证书就行了。
14. 小红收信后,用CA的公钥解开数字证书,就可以拿到小明真实的公钥了,然后就能证明"数字签名"是否真的是小明签的。
----------------------------------------------------------------------------------------------
三、HTTP/SSL/TLS/HTTPS概念和流程
1.概念:
1)HTTP: 是一种无状态的超文本传输协议,数据以明文形式传输。
2) SSL: SSL 使用加密技术保护数据的机密性,确保只有通信的双方能够读取数据。另外通过数字证书验证通信双方的身份,防止中间人攻击。SSL 的安全性已被质疑,现已被 TLS(传输层安全性)取代。
3) TLS: 是 SSL 的后续版本,提供了比 SSL 更强的加密和身份验证机制。TLS 是用于在网络上加密和保护数据传输的标准协议。TLS 有多个版本(如 TLS 1.0、1.1、1.2、1.3),每个版本都对加密算法和协议进行了改进。
4) HTTPS: 是 HTTP 的安全版本。它通过使用 SSL/TLS 协议在 HTTP 的基础上提供加密和安全性。HTTPS 通常使用端口 443,而 HTTP 使用端口 80。
特点:
a. HTTPS期望建立安全连接后,通信双方均使用【对称加密】;建立安全连接的任务就是让浏览器-服务器协商出本次连接使用的【对称加密的算法和密钥】;
b. 协商过程中会使用到【非对称加密】和数字证书。特别注意的是:协商的密钥必须是不容易猜到(足够随机的)。
5) X.509标准:
a.定义: X.509 是由国际电信联盟(ITU-T)制定的标准,属于 X.500 系列标准的一部分。它专门用于定义数字证书和证书撤销列表(CRL)的格式。
b.功能:通过定义证书的格式和使用方法,X.509 支持身份验证和加密,确保通信安全。它是许多安全协议(如 SSL/TLS、IPsec)的基础
c.x509与数字证书的关系:
X.509 是定义数字证书的标准和规范,规定了如何创建、使用和管理数字证书;而数字证书是这一规范的具体实现,根据X.509 标准创建的,用于在各种安全应用中验证身份和加密数据。
----------------------------------------------------------------------------------------------
2.HTTPS连接的基本流程
https通信分单向认证和双向认证两种方式。
1)单向认证
Https在建立Socket连接之前,需要进行握手,具体过程如下:
1、客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息。
2、服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书
3、客户端使用服务端返回的信息验证服务器的合法性,包括:
--证书是否过期
--发型服务器证书的CA是否可靠
--返回的公钥是否能正确解开返回证书中的数字签名
--服务器证书上的域名是否和服务器的实际域名相匹配
--验证通过后,将继续进行通信,否则,终止通信
4、客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择
5、服务器端在客户端提供的加密方案中选择加密程度最高的加密方式。
6、服务器将选择好的加密方案通过明文方式返回给客户端
7、客户端接收到服务端返回的加密方式后,使用该加密方式生成产生随机码,用作通信过程中对称加密的密钥,使用服务端返回的公钥进行加密,将加密后的随机码发送至服务器
8、服务器收到客户端返回的加密信息后,使用自己的私钥进行解密,获取对称加密密钥。 在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全。
---------------------------------------------------------------------------------------------
2)双向认证
双向认证和单向认证原理基本差不多,只是除了客户端需要认证服务端以外,增加了服务端对客户端的认证,具体过程如下:
(1) 客户端发起HTTPS请求,将SSL协议版本的信息发送给服务端。
(2) 服务端去CA机构申请来一份CA证书,在前面提过,证书里面有服务端公钥和签名,将CA证书发送给客户端;
(3) 客户端读取CA证书的明文信息,采用相同的hash散列函数计算得到信息摘要(hash目的:验证防止内容被修改),然后用操作系统带的CA的公钥去解密签名(因为签名是用CA的私钥加密的),对比证书中的信息摘要。如果一致,则证明证书是可信的,然后取出了服务端公钥;
(4) 客户端发送自己的客户端证书给服务端,证书里面有客户端的公钥:C_公钥;同时客户端发送支持的对称加密方案给服务端,供其选择;
(5)服务端先验证客户端的证书,通过验证后,会获得客户端的公钥;
(6) 服务端选择完加密方案后,用刚才得到的C_公钥去加密选好的加密方案;
(7) 客户端用自己的C_私钥去解密选好的加密方案,客户端生成一个随机数(密钥F),用刚才等到的服务端B_公钥去加密这个随机数形成密文,发送给服务端。
(8) 服务端和客户端在后续通讯过程中就使用这个密钥F进行通信了。和之前的非对称加密不同,这里开始就是一种对称加密的方式;
3) HTTPS基本思路总结
HTTPS在保证数据安全传输上使用对称加密和非对称加密相结合的方式来进行的,简单来说就是通过一次非对称加密算法进行了最终通信密钥的生成、确认和交换,然后在后续的通信过程中使用最终通信密钥进行对称加密通信。之所以不是全程非对称加密,是因为非对称加密的计算量大,影响通信效率。
---------------------------------------------------------------------------------------------
三、公私钥\证书创建方法
创建公私钥对和数字证书(通常是 X.509 格式的证书)是网络安全中的常见需求,特别是在需要实现 SSL/TLS 安全通信、代码签名、电子邮件安全等场景中,一般的是使用 OpenSSL 工具创建公私钥对和数字证书。
1. OpenSSL定义:
OpenSSL 是一个基于 C语言 的加密库,它实现了多种标准加密算法、加密协议(如 TLS/SSL)以及用于管理数字证书的功能。OpenSSL支持各种加密算法,如对称加密(AES、DES)、非对称加密(RSA、ECC)以及散列算法(SHA、MD5)。它可以用于加密和解密数据,保护敏感信息在存储或传输中的安全性。
2.常见功能
1)生成私钥和公钥:使用 OpenSSL 可以方便地生成 RSA 或 ECC 密钥对。
openssl genpkey -algorithm RSA -out private_key.pem
openssl rsa -pubout -in private_key.pem -out public_key.pem
2) 创建证书签名请求(CSR):
CSR 用于请求 CA(证书颁发机构)签发证书。
openssl req -new -key private_key.pem -out csr.pem
3) 自签名证书:
对于开发或测试环境,可以使用 OpenSSL 生成自签名证书。
openssl req -new -x509 -key private_key.pem -out certificate.pem
##自签署,就是不通过CA认证中心自行进行证书签名,这里用是x509
openssl x509 -req -in cert.csr -out public.der -outform der -signkey private.pem -days 3650 //10年有效
4) 证书验证:
验证证书的有效性和完整性。
openssl verify certificate.pem
5) 加密和解密文件:
使用对称加密算法(如 AES)加密文件。
openssl enc -aes-256-cbc -salt -in plaintext.txt -out encrypted.dat
openssl enc -d -aes-256-cbc -in encrypted.dat -out decrypted.txt
6) 转换证书格式:
OpenSSL 支持多种证书格式的转换(如 PEM、DER、PFX 等)。
openssl x509 -in certificate.pem -outform DER -out certificate.der
##用CA证书给自己颁发一个证书
openssl x509 -req -days 3650 -in server.csr \
-CA ca.crt -CAkey server.key \
-CAcreateserial -out server.crt