【密码学】一文读懂TLS(一)

admin 2022年6月25日01:15:05评论58 views字数 2961阅读9分52秒阅读模式

【密码学】"一"文读懂TLS(一)

【密码学】一文读懂TLS(一)

本文来聊一下TLS的相关知识,由于我网络知识学的实在是匮乏,因此呢,文章当中不会涉及到有关网络层面的知识,仅仅聊聊TLS当中用到的密码学的相关算法,** 由于本人水平有限, 如果您发现错误, 欢迎指出, 在这里先感谢各位读者了**,手动狗头,逃~~

「本文所涉及到的所有代码,均未经过严格的测试,仅供学习使用,请勿直接用于生产环境」

因为TLS所涉及到的内容比较多,因此呢一篇文章是写不完的(才不是因为我想多水几篇文章),所以呢这个会拆成多篇文章来讲,溜了溜了。

什么是TLS

「传输层安全协议(TLS)」是一种安全协议,其目的是为网络通信提供安全以及完整性保障。

【密码学】一文读懂TLS(一)

TLS发展历史

  • SSL1.0由网景公司(Netspace)提出(1994), 但未公开过,因为存在严重的安全漏洞。
  • SSL2.0版本在1995年2月发布,2011年,RFC6176弃用了SSL2.0
  • SSL3.0版本在1996年发布,2015年,RFC7568弃用了SSL3.0
  • 1999年IETF对SSL进行了标准化,即RFC2246,称其为TLS1.0
  • TLS1.1版本在2006年4月发表,2021年3月,RFC8996启用了TLS1.0和TLS1.1
  • TLS1.2版本在2008年8月发表(RFC5246),至今(2022)依然安全
  • TLS1.3版本在2018年8月发表(RFC8446),至今(2022)依然安全

TLS的运用场景

这里有请密码学当中出镜率最高的两个人物Alice和Bob,发现自己好像好久没有写代码了,这里咱们用代码来模拟一下网络中Alice和Bob的通信。后文代码将采用UDP协议模拟一下Alice和Bob在网络当中的通信。

【密码学】一文读懂TLS(一)

这里为了回顾一下我之前学习的语言的知识,依然采用两种语言,对于Alice作为发送端,这里采用Go来实现一下吧,然后Bob是接收端,这里还是用Rust来实现了。

Alice发送UDP数据给Bob

package main

import (
  "fmt"
  "net"
)

func main() {
  c, err := net.DialUDP("udp"nil, &net.UDPAddr{
    IP:   net.IPv4(127001),
    Port: 8080,
  })
  if err != nil {
    fmt.Printf("dial dail,err:%vn", err)
    return
  }
  defer func(c *net.UDPConn) {
    err := c.Close()
    if err != nil {

    }
  }(c)
  _, err = c.Write([]byte("Hello, I am Alice."))
  if err != nil {
    fmt.Printf("send data failed, err:%vn", err)
    return
  }

  var buf [1024]byte
  n, addr, err := c.ReadFromUDP(buf[:])
  if err != nil {
    fmt.Printf("recv data failed, err:%vn", err)
    return
  }
  fmt.Printf("size: %v, src: %v, data: %vn", n, addr, string(buf[:n]))
}

Bob接收到Alice发送的消息并回复Alice

use std::net::UdpSocket;
use std::str;

fn main() {
    let listener = UdpSocket::bind("0.0.0.0:8080").expect("bind address failed");

    let mut buf = [0128];
    loop {
        let (size, src) = listener.recv_from(&mut buf).expect("recv data failed");
        println!(
            "size: {}, src: {}, data: {}",
            size,
            src,
            str::from_utf8(&buf[..size]).expect("convert byte failed")
        );

        listener
            .send_to("Hello, I am Bob.".as_bytes(), src)
            .expect("send data failed");
    }
}

那么这么发送会有什么问题呢?我们来抓包看一下,这里采用tcpdump工具来抓包

sudo tcpdump -i lo0 udp port 8080 -w ./tcpdump.cap

这条命令是抓取本机的8080端口的udp报文并保存到 tcpdump.cap文件下。

然后我们用wireshark工具打开抓取的报文。

【密码学】一文读懂TLS(一)

我们可以发现Alice发送给Bob的明文数据,当然Bob回复给Alice的数据同样的也可以看到。那么这样Alice和Bob所有的通信过程都可以被监听到,这对于Alice和Bob显然是无法忍受的,那么Alice和Bob应该如何处理呢?欲知后事如何,且听下回分解。

参考资料

  • 图解密码技术 第三版(结城浩)
  • https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/
  • https://en.wikipedia.org/wiki/Transport_Layer_Security
  • https://hpbn.co/transport-layer-security-tls/
  • https://www.cloudflare.com/learning/ssl/transport-layer-security-tls/
  • https://www.internetsociety.org/deploy360/tls/basics/
  • https://www.biaodianfu.com/https-ssl-tls.html
  • https://datatracker.ietf.org/doc/html/rfc8446
  • https://datatracker.ietf.org/doc/html/rfc6176
  • https://datatracker.ietf.org/doc/html/rfc7568
  • https://datatracker.ietf.org/doc/html/rfc2246
  • https://datatracker.ietf.org/doc/html/rfc5246
  • https://datatracker.ietf.org/doc/html/rfc8996


原文始发于微信公众号(Coder小Q):【密码学】一文读懂TLS(一)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月25日01:15:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【密码学】一文读懂TLS(一)https://cn-sec.com/archives/1142154.html

发表评论

匿名网友 填写信息