CS 教程 · 第 13 章

网络安全基础

加密 / 防火墙 / 攻防入门

学习目标: 理解网络安全的核心原则,了解常见攻击手段及防御思路,建立安全开发和安全使用的基本意识。

13.1 网络安全的CIA三元组

网络安全领域有一个经典模型叫CIA三元组,它概括了信息安全的三个核心目标:

机密性(Confidentiality)

机密性确保信息只被授权的人看到。

你给朋友发了一条微信消息,只有你和朋友能看到,这就是机密性。如果消息在传输过程中被第三方截获并阅读,机密性就被破坏了。

实现手段:

一个日常例子: HTTPS协议中的"小锁"图标,就是机密性的体现——浏览器和服务器之间传输的数据是加密的,星巴克的WiFi管理员看不到你的银行密码。

完整性(Integrity)

完整性确保信息在传输和存储过程中没有被篡改。

你下载了一个Linux发行版的ISO镜像,你怎么知道文件在下载过程中没有被中间人替换成带后门的版本?这就是完整性问题。

实现手段:

# 检查下载文件的完整性
$ sha256sum ubuntu-24.04.iso
# 将输出与官方公布的哈希值对比,一致则文件完整

可用性(Availability)

可用性确保需要的时候能正常访问。

双十一那天淘宝没挂、健康码在高峰期能刷出来——这些都是可用性的胜利。反之,DDoS攻击就是想破坏可用性。

实现手段:


13.2 常见攻击类型与防御

SQL注入(SQL Injection)

原理: 攻击者在输入框中注入恶意SQL代码,操纵数据库执行非预期操作。

-- 正常查询:验证用户名密码
SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码';

-- 如果攻击者输入用户名: admin' --
-- 实际执行的SQL变成:
SELECT * FROM users WHERE username = 'admin' -- ' AND password = '随便什么';

-- -- 是SQL注释,后面的密码检查被跳过了!攻击者无需密码直接登录。

更可怕的例子:

-- 输入: '; DROP TABLE users; --
-- 结果是整张用户表被删除

防御方法:

# 危险写法(绝不要用!)
cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")

# 安全写法:参数化查询
cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))

XSS(跨站脚本攻击)

原理: 攻击者在网页中注入恶意JavaScript,当其他用户访问时脚本在用户浏览器中执行。

三种类型:

类型 说明 例子
反射型XSS 恶意脚本通过URL参数传递,立即反射执行 `search?q=`
存储型XSS 恶意脚本被存储到数据库(如评论),每个访问者都中招 在评论区提交``
DOM型XSS 纯粹前端的漏洞,JavaScript处理用户输入不当 `element.innerHTML = location.hash`

防御方法:

CSRF(跨站请求伪造)

原理: 攻击者诱使用户在已登录某网站的情况下,点击恶意链接发起非本意的请求。

你登录了银行网站,Cookie还在。然后点开了钓鱼邮件里的链接,那个链接向银行网站发起转账请求,浏览器自动带上了你的Cookie,转账就成功了。

防御方法:

钓鱼攻击(Phishing)

原理: 伪装成合法机构(银行、邮箱、公司IT部门),诱导用户泄露凭据。

常见形式:

识别方法:


13.3 加密技术基础

对称加密(Symmetric Encryption)

一句话: 加密和解密用同一把钥匙。

比喻: 你和朋友约定用同一个密码本。发信时用密码本加密,收信时用同一本密码本解密。

常见算法:

算法 密钥长度 特点
AES-256 256位 目前最广泛使用,安全且高效
ChaCha20 256位 移动设备友好,速度更快
DES/3DES 56/168位 已淘汰,不安全

优点: 速度快,适合大量数据加密

缺点: 密钥分发困难——你怎么安全地把密钥交给对方?

# Python中使用AES对称加密(简化示例)
from cryptography.fernet import Fernet

key = Fernet.generate_key()    # 生成密钥
f = Fernet(key)

ciphertext = f.encrypt(b"秘密消息")
plaintext = f.decrypt(ciphertext)   # b"秘密消息"
# ⚠️ 这个key需要安全地传递给接收方

非对称加密(Asymmetric Encryption)

一句话: 公钥加密,私钥解密;私钥签名,公钥验签。

比喻: 你有一个邮箱,投入口(公钥)人人可用往里投信,但只有你有钥匙(私钥)能取出信件。

经典算法:

算法 用途 说明
RSA 加密 + 签名 最经典,密钥长度通常2048/4096位
ECDSA 数字签名 椭圆曲线,更小更快,用于比特币/TLS
Ed25519 签名 现代选择,比RSA更安全更高效

实际应用:SSL/TLS握手

1. 客户端和服务端先通过非对称加密(RSA/ECDH)交换一个"会话密钥"

2. 之后的通信全部用这个会话密钥做对称加密(AES)

3. 这样既解决了密钥分发问题,又保证了通信效率

哈希算法(Hash)

一句话: 任意长度的输入 → 固定长度的输出。单向不可逆。

比喻: 指纹。每个人都有独一无二的指纹,但你无法从指纹还原出一个完整的人。

关键特性:

算法 输出长度 状态
MD5 128位 ❌ 已破解,仅用于非安全校验
SHA-1 160位 ❌ 已破解,Git也在迁移中
SHA-256 256位 ✅ 安全,广泛使用
SHA-3 可配置 ✅ 最新标准
Bcrypt/Argon2 可配置 ✅ 密码哈希专用,故意慢
输入: "Hello"
SHA-256: 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969

输入: "hello"    ← 只改了H的大小写
SHA-256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
                       ↑ 完全不同!

数字证书与PKI(公钥基础设施)

核心问题: 你怎么知道收到的公钥真的是属于百度的,而不是中间人伪造的?

解决方案: 数字证书 = 域名 + 公钥 + CA(证书颁发机构)的数字签名

相当于:你要确认一个警察的身份,警察掏出证件(证书),你可以通过证件上的公安局印章(CA签名)来验证——因为公安局是大家都信任的。

信任链:

根CA证书(预装在操作系统/浏览器中)
  └→ 中间CA证书
      └→ 网站证书(baidu.com)

用openssl查看证书:

openssl s_client -connect baidu.com:443 -showcerts

13.4 防火墙与入侵检测

防火墙(Firewall)

防火墙是网络边界的"安检门",根据规则放行或拦截流量。

类型:

类型 层次 说明
包过滤防火墙 网络层/传输层 根据IP、端口、协议判断
状态检测防火墙 传输层 记住连接状态,"已建立"的回包才放行
应用层防火墙(WAF) 应用层 理解HTTP,拦截SQL注入/XSS等攻击

iptables/nftables(Linux内置防火墙):

# 允许22端口SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 拦截某个IP的所有流量
iptables -A INPUT -s 192.168.1.100 -j DROP

# 默认拒绝所有入站,只放行已知服务
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

云防火墙: 阿里云/腾讯云的安全组就是简易防火墙,在控制台即可配置入站/出站规则。

IDS/IPS(入侵检测/防御系统)

Snort(经典开源IDS)示例规则:

# 检测SSH暴力破解
alert tcp any any -> $HOME_NET 22 \
  (msg:"SSH brute force"; \
   flow:to_server; \
   threshold:type threshold, track by_src, count 5, seconds 60; \
   sid:1000001;)
# 含义:60秒内同一IP向SSH端口发起5次以上连接→报警

13.5 安全意识培养

安全领域有句名言:"最薄弱的环节通常是人类自己。"

密码安全

坏习惯(你中了几条?):

最佳实践:

推荐密码管理器 Bitwarden 的使用流程:
1. 注册账号,设置一个"主密码"(这是你唯一需要记住的)
2. 安装浏览器扩展 + 手机APP
3. 注册新网站时,自动生成随机密码并保存
4. 登录时自动填充,无需手动输入

日常安全习惯

1. 保持软件更新:开启自动更新,安全补丁不能拖

2. 不点可疑链接:收到陌生链接先用 [VirusTotal](https://virustotal.com) 检查

3. HTTPS必须:看到浏览器地址栏没有"小锁"就不要输入敏感信息

4. 公共WiFi用VPN:星巴克、机场WiFi不加密,建议开启VPN

5. 最小权限原则:不要用管理员账号日常使用,新装软件不随手给管理员权限

6. 定期备份:3-2-1原则——3份拷贝、2种介质、1份异地

7. 手机也要安全:设置锁屏密码、不越狱/root、仅从官方商店装应用


13.6 推荐工具

工具 用途 平台
Bitwarden 开源密码管理器 全平台
WireGuard 现代VPN,配置简单 Linux/Win/Mac/iOS/Android
Let's Encrypt 免费HTTPS证书 服务端
ClamAV 开源杀毒引擎 Linux
OWASP ZAP Web应用安全扫描 跨平台
haveibeenpwned 密码泄露查询 Web
VirusTotal 可疑文件/URL分析 Web
Tailscale 基于WireGuard的零配置VPN 全平台

本章小结


⬅️ [上一章:12-版本控制与Git团队协作](12-版本控制与Git团队协作.html)   |   ➡️ [下一章:14-云计算与虚拟化](14-云计算与虚拟化.html)
Collaplex · 克拉普莱克斯 collaplex.me · 2026 浙ICP备2026080865号