【网络安全之易混淆概念-加密/签名/摘要/证书】

背景

我们开发人员一般都很少对网络安全技术有深入的研究,但是鉴于日常系统开发中会遇到的各种安全相关的问题,熟悉和了解这些安全技术的基本原理和使用场景还是非常必要的。本文主要针对加密、数字摘要、数字签名、数字证书等安全领域内的技术进行一番简要的介绍。

常用安全技术及其之间的关联, 同时参考下图可以便于更深理解

  1. 认证用户和服务器,确保数据发送到正确的客户机和服务器
  2. 加密数据以防止数据中途被窃取
  3. 维护数据的完整性,确保数据在传输过程中不被改变
    在这里插入图片描述

消息摘要(Digest)

消息摘要对一份数据,进行一个单向的 Hash 函数,生成一个固定长度的 Hash 值,这个值就是这份数据的摘要,也称为指纹。

常见的摘要算法有 MD5、SHA-1、SHA-256 ,共有特性:

  1. 对于同一个摘要算法,无论输入的数据是什么,输出都是相同长度的值。例如 MD5,无论数据有多大,输出总是128位的散列值。
  2. 摘要算法是单向的,只能根据原始数据计算出它的摘要值,但是不能根据摘要值反算出原始数据。
  3. 越优秀的摘要算法越难找到Hash碰撞。虽然长内容生成短摘要是必定会产生碰撞的,但一个优秀的摘要算法很难主动构造出两条数据,使得他们的摘要值相同。
  4. 相比加密算法,摘要算法速度都相对较快。

消息摘要的用途:
可以用于校验数据的完整性。例如我们在下载文件时,数据源会提供一个文件的MD5。文件下载好之后,我们本地计算出文件的MD5,和数据源提供的MD5做对比,如果相同则文件是完整的。但独立使用消息摘要时,无法确保数据没有被篡改,因为无法保证从数据源获取的MD5有没有被中途篡改。

加密算法(对称与非对称)

加密技术可以分为对称与非对称两种。

  1. 对称加密
    解密即加密与解密用的是同一把秘钥,常用的对称加密技术有DES(Data Encrypt Standard)、AES(Advanced Encrypt Standard)等, 对称加密是指对于加密串只有一个钥匙,同一个钥匙用来加密和解密,目前主流使用AES对称加密,它是一种分组加密算法,一般要求要添加盐值(salt)
    并且要确保salt要安全随机,java中使用的AlgorithmParameterSpec接口及其IvParameterSpec实现类作为盐值实例。下期再讲讲AES加密原理。
  2. 非对称加密RAS,为什么需要非对称加密?
    非对称技术的加密与解密用的是不同的秘钥,常用的非对称加密技术有RSA等。
    假设这样一种场景A要发送一段消息给B,但是又不想以明文发送,所以就需要对消息进行加密。如果采用对称加密技术,那么加密与解密用的是同一把秘钥,除非B事先就知道A的秘钥,并且保存好,这样才可以解密A发来的消息。由于对称技术只有一把秘钥,所以秘钥的管理是一个很麻烦的问题,而非对称技术的诞生就解决了这个问题,非对称加密与解密使用的是不同的秘钥,并且秘钥对是一一对应的,即用A的私钥加密的密文只有用A的公钥才能解密。
    这样的话,每个人都有两把秘钥,私钥和公钥,私钥是只有自己才知道的,不能告诉别人,而公钥是公开的,大家都可以知道。这样,当A想要发送消息给B的时候,只需要用B的公钥对消息进行加密就可以了,由于B的私钥只有B才拥有,所以A用B的公钥加密的消息只有B才能解开。而B想更换自己的秘要时也很方便,只须把公钥告诉大家就可以了。
    那么,既然非对称加密如此之好,对称加密就没有存在的必要了吗,其实不然,由于非对称加密算法的开销很大,所以如果直接以非对称技术来加密发送的消息效率会很差。那么怎么办呢?解决的办法也很简单,就是把对称加密技术与非对称加密技术结合起来使用,在最后我会以图形结合的方式对整个非对称加密流程做详解。

数字签名(Signature)

公开密钥密码体系:
基于大整数的因数分解可以生成一对公钥(PublicKey)和私钥(PrivateKey)。公钥和私钥是一一对应关系,一把私钥有着和它唯一对应的公钥,反之亦然。用公钥加密的数据,只能用和它对应的私钥解密,用私钥加密也只能同与之对应的公钥解密,密钥对的生成很快速,但根据公钥反推私钥是极其困难的事。
根据公开密钥密码体系,我们有了非对称加密。常见的非对称加密是 RSA 加密。

如果用「公钥」对数据加密,用「私钥」去解密,这是「加密」;
反之用「私钥」对数据加密,用「公钥」去解密,这是「签名」。

简单地看,似乎没有区别,只是换了个名字。但实际上,两者的用途完全不一样。由于所有人都持有公钥,所以「签名」并不能保证数据的安全性,因为所有人都可以用公钥去解密。但「签名」却能用于保证消息的准确性和不可否认性。因为公钥和私钥是一一对应的,所以当一个公钥能解密某个密文时,说明这个密文一定来自于私钥持有者。

更高效的数字签名方案:

将摘要算法和非对称加密结合使用。
如何签名:先用摘要算法计算明文数据的摘要值,再对这个摘要值用私钥加密。这样就能较快速地得到了原始信息的签名;
如何验证:先用相同的摘要算法计算原始信息的摘要值,再用公钥对签名解密,得到收到的摘要值,最后对比这两个摘要值判断是否相等。如果不相等说明数据不可信。

数字签名方案的问题:

数据接收者如何获取正确的公钥呢?如果公钥本身都被篡改了,这个签名方案就不正确了。所以需要有某种方式确保公钥的正确性,这就是数字证书。

数字证书(Certificate)

数字证书的作用就是确保数据接收者的公钥是没有被篡改过的。
通常包含以下内容:
(1) 证书所有人的公钥;
(2) 证书发行者对证书的数字签名;
(3) 证书所用的签名算法;
(4) 证书发布机构、有效期、所有者的信息等其他信息。

数字签名和证书的关系流程实例

原理

  1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥。
    在这里插入图片描述

  2. 鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。
    在这里插入图片描述

  3. 苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。
    在这里插入图片描述

  4. 鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
    在这里插入图片描述

  5. 鲍勃给苏珊回信,决定采用“数字签名”。他写完后先用Hash函数,生成信件的摘要(digest)。
    在这里插入图片描述

  6. 然后,鲍勃使用私钥,对这个摘要加密,生成数字签名signature。
    在这里插入图片描述

  7. 鲍勃将这个签名,附在信件下面,一起发给苏珊。
    在这里插入图片描述

  8. 苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。
    在这里插入图片描述

  9. 苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。
    在这里插入图片描述

  10. 复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成“数字签名”,写信给苏珊,让苏珊用假的鲍勃公钥进行解密。
    在这里插入图片描述

  11. 后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找“证书中心”(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成“数字证书”(Digital Certificate)。
    在这里插入图片描述

  12. 鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。
    在这里插入图片描述

  13. 苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明“数字签名”是否真的是鲍勃签的。
    在这里插入图片描述

下面,我们看一个应用"数字证书"的实例:https协议。这个协议主要用于网页加密。
13. 首先,客户端向服务器发出加密请求。
14. 服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端
15. 客户端(浏览器)的“证书管理器”,有“受信任的根证书颁发机构”列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。
在这里插入图片描述
16. 如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
在这里插入图片描述
17. 如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。
在这里插入图片描述
6. 如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值