网络安全基础(IT5100E)
L1-Intro
KP1: CIA三角法则
The goal of security is to protect the Confidentiality, Integrity and Availability of software systems
• Confidentiality: can anyone else obtain my secrets? 机密性:确保信息只被有权限的人看到 • Integrity: is my data current, correct and accurate? 完整性:确保数据只被授权的主体进行授权的修改。 • Availability: are my systems available? 可用性:确保数据能够被授权的主体访问到,保证系统可用、数据能及时访问。
KP2: why security important
一些安全方面的例子
KP3: security fundamentals
- Assume breach 假设入侵
- 系统默认有人被攻破了,要限制攻击者横向移动
- 加强日志、监控、威胁检测和响应流程
- Insider threats 内部威胁
- 威胁不只是来自外部,内部人员同样危险
- 不满员工泄密,无意中操作失误(如发错文件),被黑客"钓鱼"控制的账户
- Least privilege and separation of duties 最小权限于职责分离
- 只授予用户完成任务所需的最低权限,防止滥用或误操作
- 将关键任务拆分给不同人,防止某一个人掌握"全权"
- Defense in depth 深度防御
- 有多层安全措施。就算攻击者绕过防火墙,还要面对 MFA、多因素加密、行为分析等
- 网络防火墙,身份认证,应用程序级权限控制,加密存储,终端安全
- Supply chain security 供应链安全
- 使用的组件是安全的,你的安全也取决于你用的"别人家的"代码和硬件是否安全。
- Security by obscurity 隐蔽即安全
- 抽象代码 abstraction
- Attack surface reduction 攻击面缩减
- 去掉系统中不必要的功能、服务、接口,降低被攻击的可能性。
- never trust, always verify
- 这是 零信任(Zero Trust)模型的核心理念
- usable security
- 安全机制不能太复杂
- 采用单点登录(SSO)+ 多因素认证(MFA),安全设计要考虑用户体验(UX) 常见漏洞: CVE,OWASP Top10
L2-Web Applications
KP1: HTTP
get IP address of target website by consulting DNS
- DNS(Domain Name System) 域名系统
- youtube的域名 URL(
www.youtube.com)->youtube的ip地址(11.0.0.1)
- youtube的域名 URL(
Browser and Server communicate use HTTP request data is sent in packets
KP2: Thread modeling
Security by Obscurity : 隐蔽数据库保证数据安全
- Users now must interact with the application via server, which handles all the business logic
- Access to database is now controlled by the server
KP3: Web Application Architecture
client(front-end) - server(back-end) - database
KP4: Software design vulnerabilities
SDLC:Software Development Life Cycle 不安全的设计例子:
- ❌只在client端检查密码
- ✅修改密码之前需要在server端认证用户
- ❌密码以明文形式(plaintext)直接保存在txt文件中 - 文件暴露风险
- ✅使用环境变量,encryption with key,encrypt credentials
- ❌hard-code,硬编码,谁都能看到数据库答案
- ✅不要在源代码里硬编码
- ❌用户在客户端直接发送请求,绕过身份认证
- ✅不要相信客户端的安全性,一直在server端二次验证
- ❌用户登录成功后,服务器发送一个 cookie,其中含有
authenticated=true。之后的请求,只要 cookie 中authenticated=true,就认为用户已经验证过,可以执行敏感操作- ✅每个请求都用 session ID 在服务器端查状态,而不是信任客户端自己描述的身份
- ❌API key在client端,别人也能调用你的api key
- ✅不要相信client
KP5: Design with security
- Least privilege and separation of duties
- Defense in depth
- Never trust, always verify THINGS YOU MUST CONSIDER TO DESIGN SECURE SYSTEMS • Input validation • Authentication & Authorization • Least privilege • Avoid hardcoding secrets
L3-Encrypthion
KP1:Symmetric encryption(AES)
加密算法的要求
- 保密:在不知道必要的密钥(secrets)的情况下,极难解密。
- 可逆:在掌握必要的密钥时,必须可逆(invertible)。 cipher:密码 plaintext: 明文 cowdrinkmilk ciphertext: 密文 021422031708131012081110
substitution cipher 替换密码
- 替换,将每个字符替换成别的内容,它可以使用简单的字符映射表来替换每个字母。
- 密码必须是可逆的,否则解密会变得非常困难。
permutation cipher 置换密码
- 置换密码:乱序,修改字符串顺序
- 置换密码本身不安全,因为如果攻击者知道原始单词结构,可以轻松解密。
如何使用Secret Key:XOR
Substitution-Permutation network(SP network)
Symmetric encryption(AES)
什么是对称加密算法?encryption and decryption is done with the same key
AES:Advanced Encryption Standard 高级加密标准-对称加密算法 AES采用的标准算法:里佳代尔算法 THE RIJNDAEL ALGORITHM
- AES(高级加密标准)基于 Rijndael 算法,是一种分组密码(Block Cipher)
- 块大小:使用128bit(16 byte) 的固定数据块进行加密。
- 密钥长度: 支持 128、192、256-bit密钥
- AES 的加密流程:
- SubBytes(字节替换):采用替换密码(Substitution Cipher),使用 S-Box 对字节进行非线性替换,提高安全性。
- ShiftRows(行移位):采用置换密码(Permutation Cipher),通过移动数据块中的字节位置,增加混淆。
- MixColumns(列混淆):进行线性变换,进一步打乱数据结构 ,增强安全性。
- AddRoundKey(轮密钥加运算):通过 XOR(异或) 操作,将当前状态与轮密钥进行加密,增加复杂性。
KP2: Block Cipher Modes
ECB mode(Electronic Code Book)电子密码本模式
AES 使用 128 位(16 字节)数据块,如果消息长度超过 128 位,将消息拆分成多个 128 位块,然后分别加密。
电子密码本模式(ECB, Electronic Code Book)的问题 ECB 是最简单的分组加密模式,每个 128 位块独立加密:
- 相同的明文块 → 生成相同的密文块!
- 导致模式泄露(Pattern Leak),攻击者可以从密文中推测明文结构。
CTR mode (Nonce+AES) 计数器模式
之前讲到 ECB 模式的缺陷,因为相同的明文块会加密成相同的密文块,导致模式泄露。 CTR(Counter Mode)是一种更安全的分组加密模式
- 通过一个不断变化的计数器(Counter)来增强加密的安全性。
- 使用 AES 进行加密
- 用 AES 加密后的结果和明文进行 XOR 运算
错误做法:固定的nonce
问题: 如果两条消息(A,B)使用相同的密钥,可能会遭受攻击
- CTR 模式的问题:如果密钥相同,且计数器总是从 0 开始,攻击者可以利用密文间的关系来推测原始信息。 解决办法:使用随机数
正确的CTR:使用随机数 nonce
问题: bit-flipping attack: 修改密文的一个bit,实现修改明文信息 解决办法:使用MAC
MAC 消息验证码
CTR 模式仍然有安全问题:CTR 容易受到比特翻转攻击(Bit-Flipping Attack) 攻击者可以修改密文的某些位,导致解密后的明文被篡改,而接收者可能不会察觉。 CTR 需要额外的认证机制,如 MAC(MAC, Message Authentication Code),来确保完整性。
MAC(Message Authentication Code) 是这样一个函数:
MAC = MAC(key, message)
- 它使用一个只有发送方和接收方知道的密钥(key);
- 用来生成一段 "验证码",确保这条消息确实是由可信方发出、且没有被篡改;
- 接收方收到后,重新计算一遍
MAC(key, received_message),跟收到的 MAC 对比,只有一致才通过验证。
举个例子 原始消息:
message = "balance=100"
mac = MAC(key, message)
服务器端发送内容:message + mac
攻击者篡改message后,不知道key是什么,所以没办法生成新的mac。
接收方用收到伪造后的数据,会用自己保存的 key 重新计算MAC
MAC 的安全性 = key 的保密性 换句话说:一旦 key 泄露,MAC 就不再具备防篡改的能力
GCM (CTR+MAC)
MAC(消息验证码):验证消息由可信一方发出,中间未被修改 GCM(Galois/Counter Mode):CTR(nonce+AES)计数器加密+MAC验证
- 推荐使用 GCM 模式(Galois/Counter Mode):
- GCM = CTR(加密)+ GMAC(认证)
- 同时提供加密和完整性校验,确保消息未被篡改。
KP3: Diffie-Hellman Key Exchange
怎么传递key不被发现?染色法 Finding 𝑔^𝑎𝑏 mod 𝑛 from 𝑔, 𝑛, 𝑔^𝑎 mod 𝑛 and 𝑔^𝑏 mod n
- n必须是个大素数:防止周期太短被破解
KP4: Asymmetric Encryption Algorithms (RSA)
如何验证服务器身份?
euler's totient function
找到一种方法,让两方能够建立一个共享的密钥,即使攻击者完全监听通信,也无法得知密钥内容。
- 每一方都有一个自己的秘密,当他们混合这些秘密后,会形成一个共享密钥。
- 该过程必须具备两个特点:
- 容易混合秘密,使双方能够轻松生成共享密钥。
- 难以从混合后的结果中分离秘密,这样即使攻击者监听,也无法恢复密钥。
Prime factorization:大数字的质数分解很困难 30=2^1 x 3^1 x 5^1
RSA algorithm
这个算法用来生成一对密钥(公钥和私钥) RSA加密系统基于大整数的因子分解问题(Factorization Problem),该问题在大素数情况下计算极为困难,从而保证了RSA的安全性。
- 非对称性:每个人拥有一对密钥
- 公钥(Public Key):用于加密,可以公开。
- 私钥(Private Key):用于解密,必须保密。
- 难以破解:要破解RSA,必须将一个极大的整数分解为两个大素数,但这在数学上计算极其困难。
public:k1,n, C=M^k1 mod n private: k2
KP5:Digital Signatures
如何验证公钥正确? client内置CA public key,用它去验证server传过来
签名是用非对称加密的方法做的(RSA)
KP6: HTTPS(HTTP+TLS)
web应用里的通信安全 Transport layer security(TLS)- TLS handshake
TLS:加密传输的步骤
- 服务器生成一对密钥:server private key + server public key ==RSA==
- 服务器向CA申请证书,发送server public key
- 证书的有效期有几个月,在server 本地保存
.crt文件中
- 证书的有效期有几个月,在server 本地保存
- CA 用它的私钥签名 server 的公钥和域名,(CA的公钥在客户端client)
得到证书(certificate):
[server public key + CA 签名] - server向client发送certificate:==RSA== certificate = { server public key, signature by CA (over public key & domain) }
- client用内置的CA public key去验证CA签名
- 成功:server public key可信
- 失败:server public key不可信
- server和client之间协商出==Diffie-Hellman==公钥对 K (ephemeral临时的)
- Server 生成: S(私钥),算出 $S = g^s\mod p$ (公钥) Server 把 S 发给 Client(通常和证书一起发送)
- Client 生成: C(私钥),算出 $C = g^c \mod p$(公钥) Client 把 C 发给 Server(在 handshake 阶段)
- 他们会交换公钥形成一个共享的对称密钥$K = S^c$(session key)
- 每次 TLS 握手 → 新一轮 Diffie-Hellman → 新的 session key
- 浏览器关闭、连接断开 → session key 消失
- 用对称加密AES进行通信 ==AES+GCM==
- Client 想给 Server 发消息
"Hello",它就会:- 用 AES+
K加密消息 → 变成密文
- 用 AES+
- Server 收到密文后,用同样的
K解密 → 得到"Hello"
- Client 想给 Server 发消息
Plaintext → AES-Encrypt(K) → Ciphertext → [Send]
↑
AES-Decrypt(K) ← [Receive]
↓
Plaintext
client 的主要角色是验证证书 + 协商 session key + 用对称加密通信
KP7: 加密失败的原因
L4-Authentication
KP1: store hashed, salted even peppered passwords
Problem: 避免直接把密码存储在数据库里
- password->database (❌)
- password -> encrypt by key -> database (✅)
Hash Function (one-way function)
- 使用哈希函数
f()加密密码 - client 传递 username:u; password:p
- server 往数据库里存储
(u,f(p))
hash function的优点/问题
• Output appears random • Hard to find input given output (one-way) • Given one input/output pair, hard to find second input with same hash value • Hard to find collisions
问题: ranbow table:预先计算出的键值对可以破解密码
Salt
- salt
[string]:一个随机字符串 - "密码+salt" 这个字符串加密之后放在数据库里
Pepper
- 一个随机字符串,所有user都知道,也不是每个用户独一无二的
- pepper不存在数据库里,可能在服务器config文件里,也可能在别的地方
- "密码+salt+pepper" -> encrypt 放到数据库里 作用让反编译的密码时间增加了,这样attacker更难找到原始密码
常用hash function
- 过时的方法
- MD5
- SHA1
- 现代哈希方法P15
- SHA2(SHA-256 / SHA512): 文本挖掘 (存密码太快了)
- Argon2, scrypt, bcrypt, PBKDF2: 密码哈希函数
KP2: 使用一组凭证访问多个用户
federated identity management 联邦身份管理
公司提供身份验证,可以登入多端网页
SAML in SSO
- SAML: Security Assertion Markup Language 安全断言标记语言
- SSO: cross-domain Single Sign-On 跨域单点登录
KP3:使用多重身份验证(MFA)
Multi-factor Authentication(MFA)
- Knowledge:密码
- Possession:手机
- Inherence:指纹,瞳孔,面容识别
KP4: cookies / JWTs
使用cookies / JWTs避免重复验证
cookies - session management
- key-value pairs
- browser -> website : 每次请求会自动发cookie信息
- 用cookie存储session information
JWT(Json Web Token) - stateless
stateless authentication: authentication without sessions
• A signed chunk of data • JWT can be stored as cookie, local/session storage in browser • Manually attached to each request if isn't a cookie
JWT 是一个自包含的 token,它将用户身份和权限等信息直接编码在 token 本身里。这个 token 通常包括:header, payload, signature
因为这些信息都在 token 里,服务器不需要保存任何用户的会话数据来识别用户。
KP5: Broken AuthN / AuthZ
身份认证失败 Broken AuthN
身份认证失败
CROSS-SITE REQUEST FORGERY(CSRF)
跨站请求伪造
CSRF+XSS
XSS (Cross-Site Scripting) 跨站脚本
授权AuthZ
AuthZ: The process of verifying that a requested action or service is approved for a specific entity 验证请求的操作或服务是否被特定实体批准的过程
RBAC ⭐️ABAC ⭐️ReBAC
KP6: 委托授权使用OIDC + OAuth2.0
委托授权:xxx网站想要你的联系人信息
KP7: BROKEN ACCESS CONTROL
访问控制机制
L5-Injection
L6-Security Hardening
security header
HSTS
|特性|HTTP|HTTPS| |---|---|---| |传输协议|明文传输(Hypertext Transfer Protocol)|加密传输(HTTP over SSL/TLS)| |安全性|❌ 不安全,数据可以被窃听或篡改|✅ 安全,数据经过加密,防止中间人攻击| |端口|80|443| |是否加密|否|是(使用 SSL/TLS)|
Test
|类型|名称|描述| |---|---|---| |静态测试|SAST|不运行程序,分析代码安全| |动态测试|DAST|运行程序,从外部测试安全问题| |交互测试|IAST|运行程序,在执行中监控漏洞| |软件成分分析|SCA|检查开源库和依赖项的漏洞|
| 名称 | 全称 | 测试阶段 | 方式 | 类似于 | | -------- | ----------------------------------------------------- | ---- | ----------------- | ------------ | | SAST | Static Application Security Testing | 开发阶段 | 不运行代码,静态分析源代码/字节码 | 看代码找漏洞(白盒) | | DAST | Dynamic Application Security Testing | 测试阶段 | 运行程序后,在外部模拟攻击 | 黑客攻击模拟(黑盒) | | FAST | Feedback-driven AST / Framework-assisted AST(也叫 IAST) | 运行中 | 运行中注入探针,结合内部和外部分析 | 结合了白盒+黑盒(灰盒) |