学习目标: 理解网络安全的核心原则,了解常见攻击手段及防御思路,建立安全开发和安全使用的基本意识。
13.1 网络安全的CIA三元组
网络安全领域有一个经典模型叫CIA三元组,它概括了信息安全的三个核心目标:
机密性(Confidentiality)
机密性确保信息只被授权的人看到。
你给朋友发了一条微信消息,只有你和朋友能看到,这就是机密性。如果消息在传输过程中被第三方截获并阅读,机密性就被破坏了。
实现手段:
- 加密:AES、RSA等算法,即使数据被截获也无法解读
- 访问控制:账号密码、权限系统,只允许授权者访问
- 物理隔离:机房门禁、保险柜,防止物理接触
一个日常例子: HTTPS协议中的"小锁"图标,就是机密性的体现——浏览器和服务器之间传输的数据是加密的,星巴克的WiFi管理员看不到你的银行密码。
完整性(Integrity)
完整性确保信息在传输和存储过程中没有被篡改。
你下载了一个Linux发行版的ISO镜像,你怎么知道文件在下载过程中没有被中间人替换成带后门的版本?这就是完整性问题。
实现手段:
- 哈希校验:SHA-256等算法,对文件生成"数字指纹",修改一个字节指纹就完全不同
- 数字签名:用私钥对哈希值签名,接收方用公钥验证,任何篡改都会导致签名无效
- 版本控制:Git的每个commit都有一个SHA-1哈希,确保了代码历史的完整性
# 检查下载文件的完整性
$ sha256sum ubuntu-24.04.iso
# 将输出与官方公布的哈希值对比,一致则文件完整
可用性(Availability)
可用性确保需要的时候能正常访问。
双十一那天淘宝没挂、健康码在高峰期能刷出来——这些都是可用性的胜利。反之,DDoS攻击就是想破坏可用性。
实现手段:
- 冗余部署:多台服务器、多机房,一台挂了还有其他
- 负载均衡:Nginx分流请求,避免单点过载
- 容灾备份:定期备份+异地备份,出事后能恢复
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; --
-- 结果是整张用户表被删除
防御方法:
- 参数化查询(Prepared Statement):彻底分离SQL逻辑和数据
- ORM框架:Django ORM、SQLAlchemy等自动处理转义
- 输入校验+最小权限:数据库账号不要用root权限
# 危险写法(绝不要用!)
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` |
防御方法:
- 输出编码:渲染用户输入前转义HTML特殊字符(
<→<) - CSP内容安全策略:HTTP头限制脚本来源
- HttpOnly Cookie:防止JavaScript读取敏感Cookie
- 前端框架自带的转义:React的JSX、Vue的模板默认会转义
CSRF(跨站请求伪造)
原理: 攻击者诱使用户在已登录某网站的情况下,点击恶意链接发起非本意的请求。
你登录了银行网站,Cookie还在。然后点开了钓鱼邮件里的链接,那个链接向银行网站发起转账请求,浏览器自动带上了你的Cookie,转账就成功了。
防御方法:
- CSRF Token:表单中包含随机Token,服务器验证
- SameSite Cookie:
Set-Cookie: SameSite=Strict,跨站请求不发送Cookie - 验证Referer/Origin头
- 关键操作二次验证:转账前输入短信验证码
钓鱼攻击(Phishing)
原理: 伪装成合法机构(银行、邮箱、公司IT部门),诱导用户泄露凭据。
常见形式:
- 伪造的登录页面,域名类似(如
amaz0n.com冒充amazon.com) - 伪装成领导/IT部门的邮件:"请点击链接重置密码"
- 伪装成快递/税务:"您的包裹被卡住了,请点击查看"
识别方法:
- 🚩 检查域名是否拼写错误
- 🚩 警惕紧急语气("24小时内不处理将注销账户")
- 🚩 不点击邮件中的链接,自己输入网址访问
- 🚩 检查是否是HTTPS + 正确的证书
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)
一句话: 任意长度的输入 → 固定长度的输出。单向不可逆。
比喻: 指纹。每个人都有独一无二的指纹,但你无法从指纹还原出一个完整的人。
关键特性:
- 确定性:同样的输入永远产生同样的输出
- 雪崩效应:修改1个bit,哈希值天翻地覆
- 抗碰撞:找不到两个不同输入产生相同哈希值
| 算法 | 输出长度 | 状态 |
|---|---|---|
| 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(入侵检测/防御系统)
- IDS(Intrusion Detection System):像监控摄像头,检测到攻击→报警但不拦截
- IPS(Intrusion Prevention System):像门禁系统,检测到攻击→直接拦截
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 安全意识培养
安全领域有句名言:"最薄弱的环节通常是人类自己。"
密码安全
坏习惯(你中了几条?):
- ❌ 所有网站用同一个密码
- ❌ 密码里包含生日、姓名拼音
- ❌ 记在便签纸上贴屏幕边
- ❌ 用
123456、password、admin
最佳实践:
- ✅ 使用密码管理器:1Password、Bitwarden(开源免费)、KeePassXC
- ✅ 每个网站独立随机密码,至少16位
- ✅ 开启双因素认证(2FA):Google Authenticator或用硬件密钥YubiKey
- ✅ 定期检查泄露:在 [haveibeenpwned.com](https://haveibeenpwned.com) 查询邮箱是否出现在数据泄露中
推荐密码管理器 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 | 全平台 |
本章小结
- CIA三元组是安全的基石:机密性、完整性、可用性
- 写代码时永远不信任用户输入,参数化查询防SQL注入、输出编码防XSS
- 加密要懂三种:对称(快,密钥分发难)、非对称(慢,密钥分发易)、哈希(单向指纹)
- HTTPS的本质:用非对称加密交换会话密钥,然后用对称加密高效通信
- 密码管理器+2FA是个人安全最低成本的提升
- 安全意识不是考试,是习惯——每点一次链接、输一次密码,都做一次判断
⬅️ [上一章:12-版本控制与Git团队协作](12-版本控制与Git团队协作.html) | ➡️ [下一章:14-云计算与虚拟化](14-云计算与虚拟化.html)