前言
要问数据传输什么最重要,安全性 必然排在第一位.那么如何保证数据的安全性呢,加密 又必然是首要选择。加密分为对称加密 和非对称加密
对称加密
简单来说就是,非对称加密就是加密和解密用的是同一个密钥。大概流程像下面这样
至于怎么加密的,现在有很多种算法去支持加密。什么AES,DES,RC5,RC6都是很常见的加密算法。 对于对称加密有什么优缺点呢,我们可以来看下:
优点: 计算量小,加密速度快,效率高
缺点: 密钥的分发,也就是在建立传输通道之前,怎么可以安全的把密钥分享给接收方,一旦密钥被第三方劫持,会对数据传输造成巨大的风险 既然,对称加密有密钥被偷窃的风险,有没有好的解决方案呢,有,那就是非对称加密
非对称加密
非对称加密是由一对密钥组成,一个公钥(PublicKey), 一个私钥(PrivateKey). 具体用法就是我们可以用私钥加密,用公钥解密。或者用公钥加密,用私钥解密。 非对称加密的通信双方都有自己的密钥对,一般自己会保存私钥,而把公钥分享给接收方。
- 通信双方用户 A 、B 都会生成一对 公钥-私钥 并且把自己的公钥交给对方。
- A 用户给 B 用户发信息并且用 B 公钥进行加密(只有B的私钥才能解密,B的私钥只在他自己手里)。
- B 用户收到消息后用自己本地的 B 私钥 进行解密(同上)。
由于 公钥 加密的数据只有 与其配对的私钥 才能解开,所以只要用户 A、B 牢牢的把自己私钥保存好就可以啦。这就解决了 对称加密 在网络安全不可靠情况下的密钥传递及加密通信。
非对称加密也有它自己的算法: 常见的有RSA,DH算法。其中RSA是最常用到的算法
优点: 安全性高
缺点: 速度相对较慢,不适合大量数据的加密\
值得一提的是,在实际应用中,对称加密和非对称加密往往结合使用。例如,非对称加密可以用于安全地交换对称加密 的密钥,一旦密钥交换完成,数据传输则使用对称加密进行,这样既保证了密钥交换的安全性,又能利 用对称加密处理数据的高效性。这种方法在许多现代加密协议 和通信标准中被广泛采用,如HTTPS、 SSL/TLS等。
身份认证
虽然非对称加密安全性比较高,但其实这其中还有一个隐藏的风险,就是如何验证信息来源的准确性,假设现在A发送的信息被C劫持,而C也拿到了B的公钥,C就可以伪装成A,篡改信息发送给B。B根据B的私钥可以正常解密C发送过来的信息就会以为是A发送过来的。这就存在信息被篡改的风险。
那如何解决验证信息的完整性和发送者的身份?
这里常常用到的是数字签名技术。在我们介绍数字签名之前,我们先介绍一个概念--摘要
摘要
摘要就是把一段信息或者一个文件通过哈希算法得到一个固定的字符串。不同的信息计算出的摘要是不同的(也有可能相同,但是可能性非常非常低,根据算法的不同这个概率有所不一样)。 下面使用一个js库crypto
来看下如何生成摘要的。例子中我们用的是sha256
算法
ini
const crypto = require("crypto");
const hash_sha256 = crypto.createHash("sha256");
hash_sha256.update("加密内容1234");
const sha256 = hash_sha256.digest("hex");
console.log("sha256加密后结果: %s", sha256);
//sha256加密后结果 26f740c7b8865c5987524148ed84fb2b00610705ac6d95999a213cba48d42804
摘要算法(散列函数 Hash Function):
- MD5: 128位散列值 (要被淘汰了)
- SHA-1: 160位散列值
- SHA-256: 产出256位的散列值
特点:
- 确定性: 固定的的数据总会生成相同的摘要
- 高效性: 计算快
- 不可逆: 不能从摘要反推输入数据
- 冲突抵抗: 不同的输入产生不同的输出
数字签名--防止篡改
数字签名是用来解决身份认证和验证信息完整性的重要技术,那么它是如何实现的呢,下面我们一起来看一下。A是信息发送方,B是信息接收方
1.使用私钥生成签名
发送方A用一个固定的信息进行散列处理,得到一个摘要
。然后再用A的私钥把刚才的摘要
进行加密得到一个签名signature
,最后发送给接收方B
我们称这个固定的信息为签名串,一般收发双方会约定好这个签名串包含哪些内容。 我们拿微信支付举例,它也规定了构造签名串的具体信息。微信要求发送方的签名串包含以下5个信息: HTTP请求方法 、 URL 、 请求时间戳 、 请求随机串 、 请求报文主体
2. 使用公钥验证签名
这时候接收方B是有A的公钥的,B可以用A的公钥解密来自A发送的签名signature
,现在得到步骤1的摘要
。我们称之为Hash
。B再根据双方规定的构造签名串的方法按照1的步骤生成一个新的摘要,我们称之为Hash1
。然后比较这两个哈希值是否一样,如果一样则证明数据没有被篡改(签名串包含了请求体,请求体改了则摘要会变).
在实际应用中,,非对称加密经常被用于同时实现加密信息 和身份认证。例如,在发送一个加密电子邮件时,发送方可以使用接收方的公钥对信息进行加密(保护机密性),同时使用自己的私钥生成数字签名 (保证身份认证)。接收方则使用自己的私钥解密信息,并使用发送方的公钥验证数字签名。 这种综合应用提供了一个既安全又有效的方式来保护信息内容,同时验证通信双方的身份,是现代数字 通信和网络安全的重要组成部分。
数字证书--防止伪装
但是如果现在有个用户C,它也有自己的一对公钥和私钥,C也可以把公钥分发给A让它去验证解密,一样可以通过,那么A如何知道信息确实来源于B而不是C呢
数字证书是一种用于验证实体(如个人、服务器、客户端或组织)身份的电子文档。它使用公钥基础设施(PKI)技术,通过将公钥与身份信息相结合,提供了一种安全验证方式。数字证书类似于现实世界中 的身份证或护照。那数字证书又是如何验证身份的可靠性的呢?大概是这样的一个过程:
-
用户B生成自己的公钥,私钥对
-
用户B把个人信息和公钥发送给证书颁发机构(CA: Certification Authority)
-
CA证书机构颁发一个证书,这个证书包含了B的公钥和个人信息。下面是颁发证书过程
- 生成密钥对:证书申请者首先生成一对密钥(公钥和私钥)。
- 提交证书签名请求(CSR):随后,申请者创建CSR,其中包括公钥和身份信息。
- CA处理请求:证书颁发机构验证申请者的身份信息,然后使用CA的私钥对包含申请者公钥的证书 进行签名。
- 颁发证书:一旦验证完成,CA将签名的数字证书发放给申请者。
-
B把证书发放到服务器上,供使用者下载使用
证书的信息一般包含:
- 证书持有者的身份信息:如名称、电子邮件地址、组织信息等。
- 证书持有者的公钥: 用于非对称加密和数字签名验证。
- 颁发机构(CA)的信息: 证书是由谁颁发的,比如VeriSign、Let's Encrypt等。
- 有效期限: 证书的有效开始和结束日期。
- 证书序列号: 唯一标识证书的编号。
- 数字签名: 证书颁发机构(CA)使用自己的私钥对证书进行的签名,以确保证书的真实性。
- 使用签名哈希算法计算证书颁发者信息、证书持有者信息、证书有效期、证书持有者公钥等信息并生成证书摘要(即
HashA
,一串散列值); - 颁发者生成一对私钥和公钥,使用私钥对摘要加密,加密后的数据就是颁发者的数字签名
C1
; - 将数字签名
C1
"附加"到数字证书上,变成一个签过名的数字证书; - 颁发者将签过名的数字证书和公钥一起给到证书持有者。
- 使用签名哈希算法计算证书颁发者信息、证书持有者信息、证书有效期、证书持有者公钥等信息并生成证书摘要(即
那为什么这样一来就可以验证B的可靠性了呢?
证书包含了证书机构给证书申请者的数字签名,我们下载好证书后可以从证书中提取出公钥,然后对签名验签.
如何验签:
- 使用者通过某种途径(如浏览器访问)拿到签过名的数字证书,解析后可以获得数字签名和数字证书;
- 使用者使用数字证书中的摘要算法计算一遍数字证书相关内容,生成一个摘要
HashA
; - 同时使用通过某些方式拿到的颁发者的公钥解密数字签名,拿到解密后的摘要
HashB
; - 对比两个摘要
HashA
和HashB
,如果相同,表明证书合法,可以信任并使用该证书中的信息(如持有者的公钥)。
那如何保证证书机构是值得信任的呢?
证书链+根证书
证书一个一层套一层的链式关系,上层证书给下层证书颁发证书和数字签名,下层证书找上层证书认证。最后认证到根证书,最高层的根证书是自签的(自己给自己颁发证书)。所以根证书一定是可信的。一般微软等公司会根据一些权威安全机构的评估选取一些信誉很好并且通过一定的安全认证的证书发布机构,把这些证书发布机构的证书默认就安装在操作系统里面了。
结语
我们都知道在网络中传输数据,存在三大安全风险:窃听、篡改和伪装
-
窃听 :http使用明文传输,一旦请求被截获,数据就会泄露,而现在有很多抓包工具可以截获网络请求,如wireshark。现在普遍通过加密解决窃听风险,这样即使请求被截获,也无法获取数据真实含义。
-
篡改:攻击者会篡改请求和响应,让服务器和客户端之间的通信看起来仍是正常的,但实际已经被控制,可使用数字签名防篡改。
-
伪装:http不验证身份,发送方和接收方无法确认对方的身份,中间人可能伪装成合法的身份和双方通信。可使用数字证书验证身份。
你可以在自己电脑上查看已安装的信任证书windows电脑:win+R -> 输入certmgr.msc. 每个证书都包含了以上文章中提到的信息
春节码字,实属不易,欢迎收藏点赞