通信加密技术
不加密
简单加密(对称加密)
- 必然有一个传递秘钥的过程,此过程不安全
- 如果线下传递秘钥,代价大,不方便
- 如果线上传递秘钥,只要传递秘钥的过程被中间窃取,则后续内容都可以被第三方解密掉
非对称加密
- 技术概念
- 一次生成公私秘钥;公钥的加密内容,无法通过公钥解密;私钥类似;只能一方加密,对方解密
- 自己把消息用私钥加密,发送出去,对方用公钥可以解密–》此过程的网络传输可以被拦截,可以获取对外传输的内容
- 对方把消息用公钥加密,发送过来,自己用私钥可以解密–》网络拦截没法用公钥解密,没法获取内容
- 加解密过程
- 将消息内容转变成 正整数m(字符串取unicode码/ascii码)
- 发送方算法处理,从 正整数m 计算出 正整数c
- 接收方算法处理,将 正整数c 计算出 正整数m
- 将 正整数m 按照编码号,转回成 字符串,即 原消息内容
- RSA算法
- 随机取两个不相等的大质数(p,q)
- n = p * q
- n 转化为二进制的总长度,称为秘钥位数,一般要求该位数达到1024,确保安全(已知被破解的最长是700+位)
- 通过算法计算出两个数e、d
- 封装(n,e)做公钥, 封装 (n,d)做私钥
- RSA 算法补充
- 按照算法:公钥(n,e) 只能加密小于n的整数m
- 解决办法1: 把长消息分段
- 解决办法2: 先对称加密一次,缩短长度
https加密流程
大致流程
- "client hello"消息:客户端通过发送"client hello"消息向服务器发起握手请求,该消息包含了客户端所支持的 TLS 版本和加密方式,以供服务器进行选择,还有一个"client random"随机字符串。
- "server hello"消息:服务器发送"server hello"消息对客户端进行回应,该消息包含了数字证书,服务器选择的加密方式和"server random"随机字符串。
- 验证:客户端对服务器发来的证书进行验证,确保对方的合法身份
- “premaster secret"字符串:客户端生成另一个随机字符串"premaster secret (预主密钥)”,用 公钥加密后发给服务器
- 使用私钥:服务器使用私钥解密"premaster secret"。
- 生成共享密钥:客户端和服务器均使用 client random,server random 和 premaster secret,并通过相同的算法生成相同的共享密钥 KEY。
- 客户端就绪:客户端发送经过共享密钥 KEY加密过的"finished"信号。
- 服务器就绪:服务器发送经过共享密钥 KEY加密过的"finished"信号。
- 达成安全通信:握手完成,双方使用对称加密进行安全通信。
证书验证
- 解密前的证书对象
- 明文证书内容
- ”数字签名“:明文证书内容,先做hash,再用CA机构的私钥做加密
- 客户端本地事先保存了权威CA证书机构的公钥
- 客户端用CA的公钥解密“数字签名”; 用明文里的hash算法,算hash
- 比较 解密后的hash vs 自己计算的hash
- 如果内容被修改,两份hash必然对不上
参考链接 https://img2018.cnblogs.com/blog/1169376/201910/1169376-20191009111543085-161187219.png
证书申请
- 本地生成公钥/私钥
- 提交申请信息: 域名,公钥,申请者信息
- CA 人工审核后,返回证书
证书链
- 目的
- 提升颁证效率
- 隔离开根证书
- 使用方法概述:
- ”每一级证书都有签名值,根证书使用自己的根CA公钥验证自己的签名,也用来验证中间证书的签名值,中间证书的公钥用来验证下一级的服务器实体证书签名值,以此构成一条信任链“
- https://img2020.cnblogs.com/blog/1110857/202104/1110857-20210427234304719-1149954198.png
- 证书链验证过程
- 一次性获得整个证书链
- 用本地的CA公钥,解密“根证书”的签名;再对明文证书内容做hash, 对比解密值与hash值
- 用本地的CA公钥,解密“中间证书”的签名;再对明文证书内容做hash, 对比解密值与hash值
- 取出”中间证书“内容里的公钥,解密“服务器证书”的签名;再对明文证书内容做hash, 对比解密值与hash值
- 取出”服务器证书“内容里的公钥,即 服务器的公钥,流程结束
证书安全
- 还有什么风险
- 私钥泄露
- 主动信任了不可靠的证书
- 重复签发
- 黑客自己生成一份公私钥,用公钥注册一个签名,域名是google
- 当用户请求google时,黑客拦截请求,返回自己申请的证书
- 用户验证证书通过,以为目标是真的google
- 用户与黑客建立SSL连接,发起若干请求;中间人再跟真实的google建立SSL
- 就可以 窃取/篡改 通信内容
- 案例
- 存在证书提供商被黑客攻破的历史记录,黑客拿到网站证书,就可以做截获/篡改双方通信内容
- 法国/美国情报局故意伪造证书窃取数据
- 怎么安全起来
- 证书透明度 计划
- 生成证书时,同时生成一份唯一id;用区块链的方式全网广播
- 全网都可以审计证书签发
- google 基于此,提供了一个查询服务,供浏览器查询某证书是否伪造
SSL 远程登录
结论: 如果首次连接时有中间人,没法保证安全
- 步骤
- 客户端发送登录请求
- 服务端返回公钥
- 客户端用公钥加密 登录的用户名/密码
- 服务端验证,返回私钥加密后的内容
- 客户端用公钥解密
- 说明:
一般在步骤2的时候,会出现如下内容。
The authenticity of host 'host (1.1.1.1.1)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
- 这个内容里的中间一段就是远程机器的公钥,需要人工校验改公钥是否匹配
- 因为这里是会被篡改的,
|