• C语言开发TLS客户端,建立TSL连接进行通信

    本文介绍如何在 C 语言中开发 TLS 客户端,连接 TLS 服务进行通信。TLS 协议的基本原理并不复杂,但实现细节却相当繁琐。因此,我们采用开源的 openssl 库,站在巨人的肩膀上开发。 目前 HTTPS 网站唾手可得,而 HTTPS 协议其实就是以 TLS 作为传输层的 HTTP 。本文便以此为例,介绍如何使用 C 语言来建立 TLS 连接,以及如何通过 TLS 连接来收发数据。 SSL 是 TLS 的前身,但 openssl 等类库代码仍广泛使用 SSL 这个术语。本文不严格区分 SSL 和 TLS 这两个术语,两者在本文中均表示严格意义上的 TLS 。 依赖包安装 开始之前,我们要先安装 openssl 库和相关头文件,以 Ubuntu 为例: 1 apt install -y openssl libssl-dev 连接建立 前文讲过,TLS 依赖 TCP 提供可靠流式传输能力。因此,建立 TLS 连接之前,必须先建立 TCP 连接。假如建好的 TCP 套接字描述符为 sfd ,则发起 TLS 连接的代码如下:
    阅读全文
  • 对称加密算法简介和编程实践

    众所周知,加密算法是用来加密数据的,可以分为对称加密和非对称加密两种。很多人可能不知道非对称加密,但一定用过至少听过对称加密,因为对称加密就是大众眼中的加密。 本文简单介绍下对称加密算法的基本原理,并提供一些编程例子,讲解如何在程序中对数据进行加密。开始之前,我们先来了解几个概念: 加密前的原始数据,叫做 原文( original text ),或者 明文( plain text ); 加密后的不规则( scrambled )数据,通常叫做 密文( cipher text ); 加密所用的密码,通常叫做 密钥( secret key ); 对称加密算法最大的特点是,它只有一把密钥,加密和解密过程用的都是同一把密钥: 这也符合大众对加密算法的认知,用密码对数据进行加密之后,必须用同一个密码才能将数据解密出来。那么,对称加密算法都有哪些呢?哪些算法安全性比较高呢? AES ,高级加密标准,新一代加密算法标准,速度快,安全级别高; DES ,数据加密标准,速度较快,适用于加密大量数据,但安全性较弱; Blowfish ,使用变长密钥,运行速度很快,非专利算法,没有使用限制; etc 安全级别 ( Security Level ) 工作因素 ( Work Factor ) 算法 ( Algorithm ) 薄弱 ( Weak ) O(240) DES 传统 ( Legacy ) O(264) RC4 基准 ( Baseline ) O(280) 3DES 标准 ( Standard ) O(2128) AES-128 较高 ( High ) O(2192) AES-192 超高 ( Ultra ) O(2256) AES-256 根据安全性,对称加密算法应该优先选择 AES ,位数尽可能大,最好是 AES-256 。
    阅读全文
  • 密码加盐哈希,拖库也不怕

    任何系统通常都有用户,数据库因而少不了用户表,少不了要保存用户密码。那么,密码能明文保存吗?肯定不能!

    如果用户密码用明文保存,一旦数据库被拖库,用户密码就全泄露了呀!用户密码泄露可不是件小事,影响的也不仅仅是泄露站点,因为用户通常用同一个密码走天下!

    写到这不禁想起多年前发生的 CSDN 拖库事件,泄露了大量用户的密码,笔者的账号密码也在其中。顺便吐槽一下,CSDN 烂不是一天两天了,一个程序员交流网站竟然明文保存密码!

    当年我还年轻,好多网站的账号密码都是一样的。黑客拖库得到我的账号密码后,可以用它来登录我的 QQ ,我的邮箱,甚至是网银!想想就觉得可怕!

    阅读全文
  • HTTP协议简介

    Web 是互联网上最流行的应用,没有之一。Web 网站由 HTML 网页和相关资源组成,通过 Web 服务器对外服务。用户则通过浏览器连接 Web 服务器,浏览网页。

    世界上有成千上万的网站,而浏览器也是五花八门。浏览器 和 Web 服务器必须对如何请求和响应数据达成一致,否则就乱套了。这就是本文要讨论的 超文本传输协议hypertext transfer protocol ),即 HTTP 协议负责的范畴。

    HTTP 协议是一种应用层协议,它规定了参与 Web 通信的浏览器和 Web 服务器之间的通信细节。HTTP 协议主要用于传输超文本网页及其相关网络资源,其中

    • Web 浏览器browser )作为客户端,主动发起 请求request );
    • Web 服务器server )作为服务端,被动回复 响应response );
    阅读全文
  • TCP 报文段格式

    上一小节,我们简单介绍了 TCP 协议的基本机制,但很多细节还来不及展开。此时此刻,我们甚至对 TCP 的传输单元长啥样都一无所知。不过没关系,本节我们再接再厉,争取将它一举拿下!

    报文结构

    由于 TCP 协议位于传输层,它的传输单元一般叫做 TCP段segment ),也可译为 TCP分组 。当然了,也有不少文献将它笼统地称为 TCP报文

    那么,一个 TCP 报文段的格式到底是怎样的呢?它跟 UDP 数据报又有哪些异同呢?

    与 UDP 数据报一样,TCP 报文也分为头部和数据两个部分。所不同的是,TCP 报文头部要比 UDP 复杂很多:

    阅读全文
  • OSI参考模型

    为降低复杂度并提高灵活性,大型软件系统一般采用分层的思路进行设计。

    电商平台是一个典型的例子,后端可能分成数据库层、缓存层、业务逻辑层、接入层等等。每个层只专注于本层的处理逻辑,复杂性大大降低;各个层互相配合,共同完成复杂的业务处理。

    阅读全文
  • DNS服务器工作原理

    通过上节学习,我们初步掌握了域名系统的基本原理。通过域名访问网络服务时,需要先向 DNS 服务器查询域名对应的 IP 地址。那么,是不是所有域名都保存在一台服务器上呢?

    答案肯定是否定的。全球现有的域名数量是一个天文数字,不是一两台服务器就能保存的。实际上,DNS 服务器分为很多角色,形成了一个等级深严的分布式体系。

    本节,我们一起来扒一扒这背后的故事。

    阅读全文
  • 网络实验:观察ARP协议通信过程

    本节,我们用一个极简的局域网,来观察 ARP 协议的通信步骤,以此加深理解:

    实验环境由 Docker 容器提供,只需执行这个 docker 命令,即可一键启动:

    1
    
    docker run --name lan --rm -it --privileged --cap-add=NET_ADMIN --cap-add=SYS_ADMIN -v /data fasionchan/netbox:0.11 launch-netenv lan
    
    阅读全文
  • ping命令原理

    进行网络通信时,我们经常需要判断一台主机是否活跃。

    举个例子,alicebruce 进行通信之前,可以先 ping 一下他的 IP 地址 192.168.171.3 ,看主机是否有应答:

    阅读全文
  • 交流方式

    GitHub 本项目所有示例代码托管在 GitHub 上,仓库是: netcode 。 建议初学者亲自动手,将所有示例程序编写一遍,加深理解。 编程没有捷径 ,唯有带着 好奇心 探索程序背后的秘密,多动手勤练习,方能编写出你的理想世界。 如需与我们交流,也可以在在本项目中 新建一个Issue , 以这种形式进行讨论。 内容可以包括但不局限于: BUG 反馈 建议 提问 点击左边 Star 按钮,关注本项目。 对于后续任何更新,尽在掌握! 微信公众号 小菜学编程 我们维护了一个微信公众号—— 小菜学编程 ,欢迎扫二维码关注我们。 对于后续更新,我们会以公众号文章的形式进行推送,这是订阅我们内容的最佳渠道。 也欢迎通过公众号给我们留言,同样可以包括但不局限于: BUG 反馈 建议 提问 QQ交流群 我们维护了一个 QQ 群( 183196643 ),用于日常的交流讨论。 与 Linux 网络编程相关的话题,都可以在群里讨论,无须局限于本项目。 对于学习或者工作中遇到的疑难问题,欢迎到群里提问。 也欢迎各位热心老司机为新手们答疑解惑。 邮件 当然了,更书面的形式也支持,你可以给我们:发送邮件 。 【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: