⌛️ 基础概念
1️⃣公钥密码体制
- 分为三个部分: 公钥、私钥、加密解密算法,加密解密过程如下:
- 加密:通过加密算法和公钥对内容进行加密,得到密文。
- 解密:通过解密算法和私钥对密文进行解密,得到明文。由公钥加密的内容,只能由私钥进行解密。
- 公钥和算法都是公开的,只有私钥是保密的。大家都以使用公钥进行加密,但是只有私钥的持有者才能解密。
- 实际使用中,会生成一对公钥和私钥,把公钥发布出去给别人使用,自己保留私钥。
2️⃣ 对称加密算法
-
加密和解密都是使用的同一个密钥。要保证安全性的话,就必须要保证密钥保密,这个和公钥密码体制有所不同,公钥密码体制中加密是用公钥,解密使用私钥,而对称加密算法中,加密和解密都是使用同一个密钥,不区分公钥和私钥。
-
优点:速度快,对称性加密通常在消息发送方需要加密大量数据时使用,算法公开、计算量小、加密速度快、加密效率高。
-
缺点:在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。
3️⃣ 非对称加密算法
- 加密使用的密钥和解密使用的密钥是不相同的。公钥密码体制就是一种非对称加密算法,他的公钥和是私钥是不能相同的。
- 安全但是加密速度慢。
- 对称加密算法的效率要高得多。但是缺陷在于对于秘钥的管理上,以及在非安全信道中通讯时,密钥交换的安全性不能保障。所以在实际的网络环境中,会将对称和非对称加密混合使用。
- 服务端计算出一对秘钥pub/pri。私钥保密,公钥公开。
- 客户端请求服务端时,拿到服务端的公钥pub。
- 客户端通过AES算法计算出一个对称加密的秘钥X。 然后使用pub将X进行加密。
- 客户端将加密后的密文发送给服务端。服务端通过pri解密获得X。
- 然后两边的通讯内容就通过对称密钥X以对称加密算法来加解密。
4️⃣ RSA技术
- RSA密码体制是一种公钥密码体制,公钥公开,私钥保密,它的加密解密算法是公开的。 由公钥加密的内容可以并且只能由私钥进行解密,并且由私钥加密的内容可以并且只能由公钥进行解密。也就是说,RSA的这一对公钥、私钥都可以用来加密和解密,并且一方加密的内容可以由并且只能由对方进行解密
5️⃣ 签名
- 签名:在信息的后面再加上一段内容,可以证明信息没有被修改过。
- 对信息做一个hash计算得到一个hash值,并且无法通过hash值得出原来的信息内容。在把信息发送出去时,把这个hash值加密后做为一个签名和信息一起发出去。
- 接收方收到信息后,会重新计算信息的hash值,并和信息所附带的hash值(解密后)进行对比,如果一致,就说明信息的内容没有被修改过,因为这里hash计算可以保证不同的内容一定会得到不同的hash值,只要内容一被修改,根据信息内容计算的hash值就会变化。
- 信息窃取也可以修改信息内容的同时也修改hash值,从而让它们可以相匹配,为了防止这种情况,hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。
- 如何让别人可以解密这个签名,这个过程就要涉及到数字证书了。
📞 加密通信
- 服务器对外发布公钥,自己留着私钥,客户通过某些途径拿到了服务器发布的公钥,此时客户并不知道私钥。现在客户要和服务器进行通信。
- 客户请求服务器的数据,服务器返回数据,客户在接到响应后,并不能肯定这个消息就是由服务器发出的,因为黑客也可以冒充服务器发出这个消息。那么如何确定信息是由服务器发过来的呢?因为只有服务器有私钥,所以如果只要能够确认对方有私钥,那么对方就是服务器。
- 为了向客户证明自己是服务器,服务器把信息用自己的私钥加密为密文,把明文和加密后的密文一起发给客户。收到信息后,她用自己持有的公钥解密密文,和明文进行对比,如果一致,说明信息的确是由服务器发过来的。
🎥 数字签名
- 信息摘要是由单向散列函数对明文计算出来的一个值,通过正文算出摘要,但是不能通过摘要解密正文。这就是这段信息的特征值,一旦这个信息变了,这个特征值也会跟着变。
- 数字签名技术简单理解就是防抵赖技术,用公钥和私钥对摘要进行加密解密操作。它是信息摘要技术和非对称加密技术的结合使用。
- 发送者在信息上签上自己的名字,接受者就知道是谁发的,而且发送者无法抵赖。
- 根据明文用哈希函数计算出信息摘要,然后再用服务器的私钥对信息摘要加密,得到数字签名。
- 服务端将数字签名和明文一起发送给客户端。
- 客户端收到后,先用相同的哈希函数对明文进行计算得出摘要,再用服务器的公钥对数字签名进行解密得到摘要,对比这两个摘要是否相同,如果相同,则说明是服务器本人发过来的。
数字证书
- 怎么去分发证书呢?,黑客也可以在中间截取,然后生成一个密钥对,在把公钥给客户端啊
- 为了解决公钥分发这个问题,有了数字证书这个东西。它是用来验证这个公钥到底是不是服务器给出来的。
- 服务器颁发给客户端证书表明自己的身份,而不是直接给自己的公钥,客户端能校验这个证书的所有者是不是服务器。从而就知道了这个证书中的公钥是不是服务器的。
- 接下来的过程就和上面说到的:服务端将信息摘要用私钥加密成的数字签名和明文发给客户端,客户端采用相同的哈希算法对明文加密得到摘要,用公钥解密数字签名得到摘要,这两者相同,就代表着这个服务器的公钥是安全的。
- CA证书有商业证书机构颁发,也可以使用自签名CA证书。
- 自签名CA证书的作用就是生成本机的用户信息以及CA签名。 对公钥签名就是在后面加上本机的用户信息以及CA签名,再将公钥交给供其他客户端做信息的解密使用。
3. 生产服务器证书私钥
openssl genrsa -aes256 -out private/server-key.pem 1024
4. 生产服务器证书签名请求
openssl req -new -key private/server-key.pem -out private/server.csr -subj “/C=CN/ST=gd/L=sz/O=bank/OU=bank/CN=bank”
5. 生产服务器证书
openssl x509 -req -days 10000 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/cakey.pem -CAcreateserial -in private/server.csr -out certs/server.cer