数据加密通篇都是为了防止第三方的劫持伪造,保证连接安全,

毫无遮掩的明文传输只有民风淳朴的时候才是安全的。

先是一些基础的内容:

对称加密

最开始为了对数据进行加密,使用的是对称加密算法,即双方协商好一个密钥,传输的时候使用这个密钥对数据进行加密和解密,但是这个密钥当然不能使用网络传输,不然同样被第三方劫持就没有意义了,所以只能私下协商交换密钥。

最开始的DES(Data Encryption Standard)对称加密算法使用的是56bit的密钥,这个密钥稍微有点短,在后来完全可以暴力破解加密信息,对于56位的密码,只需要2的56次方就可以暴力穷举。

然后又有了新的算法,triple—DES也交3DES,三重加密算法,最高168位密钥,还有AES,以前搭梯子的时候经常能见到,最高256bit密钥,安全性和速度都很出色。

但是,和谁通信都私下传密钥明显不现实,于是就有了

非对称加密

各自有个私钥,使用公钥传输,全程只暴露公钥,具体过程:

A先用自己的私钥加密数据,然后传递公钥和密文给B,B可以用自己的私钥解密

(在一篇文章中提到,使用私钥加密的是hash值,而数据本身是明文的,因为使用密钥加密任意的数据内容存在风险,比如可以刻意的上传一些特定的数据在下载下来,从而破解得到密钥(如RSA),对数据只是payload,所以文章中的逻辑是这样的:A用自己的私钥加密hash,用B的公钥加密加入了其他信息的数据,然后给B,B用A的公钥解得数据,再用私钥解得hash,然后用hash验证完整性。但是目前还不清楚,看了很多,在原理类文章中也并未提及是对什么类型的数据加密,大体逻辑是括号前的,至少rsa是这样)

但如果仅仅是上面这样就没有意义了,因为中间人仍然可以拦截AB的公钥,然后把自己的公钥给他们,AB还以为是对方的公钥,这样中间人就可以在中间对数据为所欲为了。

这时候

CA证书

就出现了,我们可以向CA申请数字证书,而证书中包含我们的公钥和用户信息,有效时间,机构签字等等,而客户端择装有机构的根证书,这个根证书有机构的公钥,用于确认机构所发的证书,

为了分CA和TLS/SSL两节,脑子有点乱,不知道怎么写了,用问题的形式自我理一理:

  • 中间人拦截服务器发出的证书并将自己伪造的证书发给客户端?

不可能,因为证书无法伪造,CA所发的公钥只能对证书进行校验,而不能生产证书,私钥在CA手上,如果中间人把自己的申请到的证书发给客户端,则证书的身份和客户端所要访问的服务器的身份对不上。

  • 中间人拦截后向客户端发送伪造的CA证书?

CA证书即根证书,一般安装在客户端中,并不是用网络进行传输的,除非被恶意程序改了,所以破解什么的风险之一就在这里,万一他把你的根证书改成了他伪造的,只能说完蛋。

但是服务器的私钥泄漏了的话,就要需要吊销证书了,

所以对于没到期但是撤销了的证书又有了CRL证书吊销列表,后来还有了OCSP在线证书状态协议,需要和第三方连接来验证证书状态,信息量较少,响应要比CRL块很多,可以减轻网络和客户端的负担,但是balabala可以看wiki:传送门

有关免费证书申请可以看我的这篇文章

TLS/SSL

终于到这了,TLS(Transport Layer Security)传输层安全性协议,SSL(Secure Sockets Layer)安全套接层

SSL是TLS的前身,SSL标准化之后就是TLS,TLS处在最高层应用层也就是最接近用户的layer之下,与应用层无耦合,http,ftp,ssh生么的都能运行在TLS之上。

用wireshark抓一下我博客的包,可以看到TLS1.2中需要两个RTT(round-trip time)来完成握手,

(这里TCP segment of a reassembled PDU是指tcp对过大的数据分包发送,wireshark用此来标记同一个包,我把其他隐藏了方便看)

过程:

客户端向服务器发出请求,提过支持的密码算法列表,

服务器收到后决定加密和散列函数,发送CA证书给客户端,

客户端收到后,验证证书,不通过over,通过就随机生成一个密钥(这个密钥用作对称加密),用服务器的公钥(在证书里)加密,用相应的算法计算hash,然后再用随机的密钥对hash加密,发给服务器,

然后服务器用自己的私钥解密获得对称密钥,通过hash验证数据的是否完整

之后的连接都是基于对称加密的,安全且更为高效。

session 重用

在TLS1.2之后支持了sessionid重用,对连接的速度进行了优化,

再次访问我的博客抓包,可以看到客户端把之前服务器传来的Session id发给服务器 ,而在服务器中存有对应的sessio id,服务器查到对应纪录后可以直接使用之前的加密信息,之后只需要一个RTT即可完成握手

但是呢,我这用的还是TLS1.2,在1.3中又进一步对握手过程进行了优化,

对于第一次连接,TLS1.2需要2个RTT,1.3只用1个RTT

而对于session重用之后,1.2只用1个RTT,而1.3是0个。

而对于分布式,session ID就不起作用了,在以前似乎是通过radis来跨服务器缓存什么的,

现在提供了session Ticket,它是用对称密钥加密过的,保留在客户端,如果服务器能解密就能加快完成握手,

在1.2session Ticket没有时间限制,1.3中加了过期时间

同时还废弃了一些算法

更多详细的内容可以看 wiki wiki wiki

使用1.3也很简单,nginx中只需要在server块给ssl_protocols加上TLSv1.3即可,需要 OpenSSL 1.1.1库,

我这里用的ubuntu18.04,似乎自带的1.1.1,可以openssl version -a看一下。

HTTPS

HTTP over SSL,顾名思义了,通过TLS/SSL加密http,默认443端口,

现在浏览器都会验证是否是https,不是就给你打上警告,是就给你加小锁锁,证明你们的连接是安全的,可以开心的网上冲浪了,当然连接是安全的,网站本身不一定是安全的。

来自我的博客:Opticor

TLS/SSL 梳理的更多相关文章

  1. 使用sslsplit嗅探tls/ssl连接

    首先发一个从youtube弄到的sslsplit的使用教程 http://v.qq.com/page/x/k/s/x019634j4ks.html 我最近演示了如何使用mitmproxty执行中间人攻 ...

  2. SSH/HTTPS安全的本质都依赖于TLS/SSL

    1.SSH/HTTPS的安全本质是TLS/SSL. 2.1990年互联网上的网页主要是静态内容,作为信息发布,使用HTTP明文传输是可以的.不过,后来很多公司开始使用网页进行金融交易,例如:股票,于是 ...

  3. Node.js TLS/SSL

    Stability: 3 - Stable 可以使用 require('tls') 来访问这个模块. tls 模块 使用 OpenSSL 来提供传输层(Transport Layer)安全性和(或)安 ...

  4. TLS / SSL密码强化的建议

    TLS / SSL密码强化的建议 传输层安全性(TLS)及其前身安全套接字层(SSL)是广泛使用的协议,旨在通过身份验证,加密和完整性来保护客户端和服务器之间的数据传输安全. 与常见假设相反,TLS ...

  5. Android : 关于HTTPS、TLS/SSL认证以及客户端证书导入方法

    一.HTTPS 简介 HTTPS 全称 HTTP over TLS/SSL(TLS就是SSL的新版本3.1).TLS/SSL是在传输层上层的协议,应用层的下层,作为一个安全层而存在,翻译过来一般叫做传 ...

  6. python3.7.2 pip 出现locations that require TLS/SSL异常处理方法

    centos7安装python3.7.2后,运行 pip3 install tornado 会报错 [root@localhost ~]# pip3 install tornado pip is co ...

  7. TLS协议工作过程;如何应用TLS/SSL协议为WEB流量提供安全

      SSL/TLS协议的基本过程是这样的: 客户端向服务器端索要并验证公钥. 双方协商生成"对话密钥". 双方采用"对话密钥"进行加密通信.   上面过程的前两 ...

  8. php实现https(tls/ssl)双向认证

    php实现https(tls/ssl)双向认证 通常情况下,在部署https的时候,是基于ssl单向认证的,也就是说只要客户端认证服务器,而服务器不需要认证客户端. 但在一些安全性较高的场景,如银行, ...

  9. Secure gRPC with TLS/SSL

    摘自:http://bbengfort.github.io/programmer/2017/03/03/secure-grpc.html Secure gRPC with TLS/SSL 03 Mar ...

随机推荐

  1. 从程序到系统:建立一个更智能的世界——记Joseph Sifakis“21世纪的计算”大会主题演讲

    Sifakis"21世纪的计算"大会主题演讲" title="从程序到系统:建立一个更智能的世界--记Joseph Sifakis"21世纪的计算&q ...

  2. FPGA模N计数器的实现

    module ModuloN_Cntr(Clock, Clear, Q, QBAR); , UPTO = ;//计数器位数以及模数 input Clock, Clear; :]Q, QBAR; :]C ...

  3. [LC] 56. Merge Intervals

    Given a collection of intervals, merge all overlapping intervals. Example 1: Input: [[1,3],[2,6],[8, ...

  4. 关闭”xx程序已停止工作”提示窗口

    运行注册表编辑器,依次定位到HKEY_CURRENT_USER\Software\Microsoft\Windows\WindowsError Reporting,在右侧窗口中找到并双击打开Donts ...

  5. JAVA线程笔记。

    继承thread类 并覆写thread类中的run()方法. class 类名称 extents Thread{public void run(){}}实现Runble接口的run方法 线程的star ...

  6. 用JSON报的一个错误java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeExcep

    以前在做项目的时候就曾接触过JSON的技术,但那个时候是项目经理把所有该配制的都配了,工具类也提供了,如何使用也跟我们说了,那个时候只是觉得很好用,倒没有研究过. 今天自己写了一个JSON的例子,可以 ...

  7. OpenWrt编译后生成的bin文件:jffs2与squashfs、factory与sysupgrade

    OpenWrt编译后会生成多个bin文件,比如 openwrt-ar71xx-generic-tl-wr841nd-jffs2-factory.bin 8126464 openwrt-ar71xx-g ...

  8. 基于Dockerfile制作tomcat镜像

    Docker 概述:   在前面的例子中,我们从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低.所以就需要一种文件或脚本,我们把想执行的操 ...

  9. Python---12函数式编程------12.1高阶函数

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

  10. 如何使用隐式转换扩展DataFrame和RDD以及其他的对象

    目的 DataFrame可以点出来很多方法,都是DF内置的. 比如说:df.withColumn(),df.printSchema(). 但是如果你想打印df中的分区位置信息,以及每个key有多少记录 ...