信息安全这门学科最折磨人的地方在于,它从来不缺知识点,缺的是一条能把知识点串起来的线。你随便翻开一本《信息安全概论》或者考试大纲,目录结构几乎都一样:数学基础、密码学、身份认证、访问控制、网络安全、系统安全、安全工程。单独看每一章都能懂,合上书脑子里就只剩下一堆零散的名词——欧拉函数、DES、RSA、TLS、BLP模型、Kerberos、等级保护。做题的时候全靠翻书,做项目的时候全靠搜。
这套知识点总结就是写给被这堆名词淹没的人的。不管你是准备信息安全工程师方向的认证考试,还是计算机专业四级里那个信息安全模块,或者是刚进甲方安全岗、乙方测试岗需要快速补齐理论底子,甚至只是给毕设选题找方向,都可以照着这篇文章的脉络把知识重新排一遍。我不打算把它写成名词词典,而是按照"为什么要学、它解决什么问题、实际怎么用"的顺序来讲,重点放在密码学的计算题套路、网络协议安全的薄弱环节,以及智能网联汽车这类新场景的安全思路上。
先交代一下前提:这篇文章假设你有基础的计算机网络概念和一点点编程感觉,数学部分我会从零补到够用为止。如果你是纯小白,别急着跳过数论那几页,RSA那几道计算题的分值,往往就藏在你觉得自己"看不懂"的地方。另外提醒一句,英语这件事后面会单独说,它对这行的实际影响比大多数人想象的要大。
1. 先给信息安全画一张不迷路的知识地图
1.1 一切从"资产—威胁—脆弱性—风险"这条链子开始
学信息安全最容易犯的错,是一上来就背算法。DES多少位密钥、AES多少轮、MD5多少位摘要,背得滚瓜烂熟,但被问到"为什么要加密"的时候答不上来。真正应该先建立的是这条因果链:先有资产,资产有价值;价值引来威胁;系统本身存在脆弱性;威胁利用脆弱性作用于资产,就产生风险。安全工作的本质,就是想办法把这个风险降到可接受的水平。
这条链子里的每一个词都有明确含义,考试里经常拿来出选择题。资产不只是服务器和数据库,还包括数据、人员、声誉、业务流程;威胁是可能造成损害的潜在因素,比如恶意代码、内部人员误操作、自然灾害;脆弱性是系统自身的短板,比如弱口令、未打补丁的服务、设计缺陷;风险则是前几者叠加之后真正落到业务上的损失可能性。很多人把威胁和脆弱性混为一谈,记住一句话就能分清:威胁是外部的"想干坏事的人或事",脆弱性是内部的"容易被干坏事的地方"。
由此引出信息安全最经典的目标三元组,机密性、完整性、可用性,行业里习惯叫CIA。机密性管的是"不该看的人看不到",加密和访问控制是主要手段;完整性管的是"不该改的东西没被改",哈希校验和数字签名是主要手段;可用性管的是"该用的时候能用",冗余、备份、抗拒绝服务是主要手段。再往外扩展,还有可审计性、不可否认性、真实性这几个衍生属性,数字签名同时覆盖了完整性和不可否认性,这就是它在电子合同、电子发票场景里不可替代的原因。
理解这条链子还有一个隐藏好处:它能让你的思路从"我要用什么技术"转成"我在防什么、防到什么程度"。这两个思路的差别,在实际项目里就是"堆了一堆安全设备但没人看告警"和"明确知道哪条业务线是核心资产、围绕它做纵深防御"的差别。
1.2 四层结构:把零散知识点装进四个抽屉
我带过几个刚转行的同事,他们的共同困扰是"知识点太多,记不住"。我的建议是只准备四个抽屉,所有知识点都往这四个抽屉里塞:
| 抽屉 | 覆盖内容 | 代表的典型知识点 |
|---|---|---|
| 数学基础 | 数论、代数、概率 | 模运算、欧拉函数、有限域、离散对数 |
| 密码学 | 对称、非对称、哈希、协议 | AES、RSA、SM3、HMAC、数字签名、PKI |
| 系统与网络 | 主机、网络、应用、数据 | 访问控制模型、TCP/IP弱点、TLS、Web安全 |
| 工程与管理 | 流程、标准、评估 | 风险分析、等级保护、安全开发生命周期 |
这四个抽屉不是随便分的,它们之间存在明确的依赖关系。数学是密码学的底座,密码学是网络协议安全的底座,而工程与管理则是把前三者组织成可持续运转体系的框架。你去看任何一份考纲,基本都能映射到这四层上,差别只在某些细节的侧重点不同。
有了这张地图,后面所有具体内容就都能挂上去。比如"Kerberos"这个知识点,它属于第三层身份认证,依赖的是对称密码和密钥分发思想;"RSA计算题"属于第二层,依赖的是第一层的欧拉定理和扩展欧几里得;"等级保护定级备案"属于第四层。当你能把任何一个名词瞬间定位到某个抽屉里的某个位置,复习效率会发生质变。
还有一点要强调:这四层的考试权重和实际工作权重是反着来的。考试里数学和密码学的计算题占比很高,因为它们客观、好判分;而实际工作中,第三层和第四层的工程能力才是决定你能不能解决问题的关键。所以别因为数学分高就只啃数学,也别因为工作里不常用RSA就完全不学,两边都要有。
2. 数学基础:密码学背后那台看不见的发动机
2.1 模运算、欧拉函数与扩展欧几里得
密码学里绝大部分运算都建立在"模运算"之上,原因很朴素:实数运算会溢出,模运算在一个有限范围内循环,天然适合计算机处理。所谓 a mod n,就是 a 除以 n 之后的余数,取值范围是 0 到 n-1。两个数如果在模 n 下余数相同,就说它们同余,记作 a ≡ b (mod n)。这个符号后面会反复出现。
接下来是最大公约数。两个数的最大公约数 gcd(a, b),可以用辗转相除法快速求出。但辗转相除法只告诉你"最大公约数是几",扩展欧几里得算法还能顺带求出两个整数 x、y,使得 ax + by = gcd(a, b)。这个式子看着抽象,实际上就是解 RSA 私钥 d 的核心工具。
def ext_gcd(a, b): """返回 (g, x, y) 使得 a*x + b*y = g = gcd(a, b)""" if b == 0: return a, 1, 0 g, x1, y1 = ext_gcd(b, a % b) return g, y1, x1 - (a // b) * y1 # 求 17 在模 3120 下的乘法逆元 g, x, y = ext_gcd(17, 3120) print(g, x) # 输出 1 -367 print(x % 3120) # 输出 2753,就是要求的逆元欧拉函数 φ(n)表示 1 到 n 之间与 n 互质的整数个数。如果 n 是两个不同素数的乘积,即 n = p × q,那么 φ(n) = (p-1)(q-1),这个结论是 RSA 的命根子。由欧拉函数还能推出欧拉定理:如果 gcd(a, n) = 1,那么 a^φ(n) ≡ 1 (mod n)。当 n 本身是素数 p 时,定理退化成费马小定理 a^(p-1) ≡ 1 (mod p)。
这三个东西串起来,正是 RSA 的完整逻辑链:选素数、算 φ(n)、求逆元,私钥和公钥就都出来了。很多人学 RSA 时觉得公式是天上掉下来的,其实每一环都有数学依据,只是教材为了压缩篇幅把它们拆散了讲。我个人建议复习时按"欧拉定理 → φ(n) 的计算性质 → 扩展欧几里得求逆"这个顺序捋一遍,比死记公式稳得多。
2.2 有限域与离散对数:为什么椭圆曲线能用更短的密钥
如果说模运算是密码学的地基,那有限域就是承重墙。所谓域,通俗说就是一个能自由做加减乘除(除零除外)而且结果不跑出集合的代数结构。密码学里最常用的两类有限域,一类是素域 GF(p),也就是整数在模素数 p 下的运算;另一类是二元扩域 GF(2^m),用多项式表示元素,常见于 AES 的 S 盒构造。
在有限域基础上,可以定义离散对数问题:给定 g 和 y,求满足 g^x = y 的 x。在普通整数乘法里,这个 x 很容易求;但在有限域的循环群上,当群足够大时,已知的最优算法也需要亚指数时间。Diffie-Hellman 密钥交换和 ElGamal 加密的安全性,本质上依赖的就是这个问题的困难性。
椭圆曲线把这个思路推广到了另一种代数结构上。在有限域上定义的椭圆曲线,其上的点可以构成一个群,同样能定义离散对数问题,但已知的攻击算法复杂度更高。结果是:要维持同等级别的安全强度,椭圆曲线所需的密钥长度远小于 RSA。具体对比可以参考下面这张表,这也是考试里比较爱考的一个点。
| 对称密钥长度 | RSA/DH 密钥长度 | 椭圆曲线密钥长度 | 大致安全强度 |
|---|---|---|---|
| 80 位 | 1024 位 | 160 位 | 已不推荐 |
| 112 位 | 2048 位 | 224 位 | 过渡使用 |
| 128 位 | 3072 位 | 256 位 | 当前主流 |
| 192 位 | 7680 位 | 384 位 | 高安全场景 |
| 256 位 | 15360 位 | 512 位 | 长期保护 |
这张表值得记住的原因是,它解释了为什么现在的移动端、物联网设备、智能网联汽车普遍选择椭圆曲线而不是 RSA。算力有限、带宽有限、电量有限的场景里,密钥短一半意味着握手快、证书小、功耗低,这些都是实打实的工程收益。国密体系里的 SM2 也是基于椭圆曲线的公钥算法,SM3 是 256 位摘要算法,SM4 是 128 位分组对称算法,三件套构成了一套完整的国产密码方案。
2.3 数学部分的复习取舍:哪些必须会算,哪些理解即可
数学基础这块内容多、难度跨度大,很多人在这里耗掉大量时间却收效甚微。我的经验是按"是否会影响计算题"来分配精力:
必须能动手算的,是模运算、最大公约数求解、欧拉函数计算、模逆元求解、RSA 加密解密过程、中国剩余定理的基本应用。这些点几乎每年都会以计算题形式出现,方法固定、步骤明确,练熟之后是稳拿分的地方。
理解原理即可的,是群环域的定义、有限域的构造细节、椭圆曲线点加法的具体公式、格密码的数学基础。这些属于"知道它在干什么"的层次,除非你专门做密码学研究或者准备高级别竞赛,否则不必深挖推导。
有个很实用的技巧:把 RSA 的完整流程手推三遍,每一遍都在纸上写出"这一步在算什么、为什么这么算"。第一遍可能要靠书,第三遍基本就能独立完成。我见过太多人用眼睛看十遍公式,结果考场上还是写不出扩展欧几里得的递归过程。数学这东西,眼睛会骗人,手不会。
3. 密码学:对称、非对称、哈希三条腿撑起来的体系
3.1 对称加密与分组密码的工作模式
对称加密的核心特点是加密和解密用同一把密钥,所以速度快,适合处理大量数据。但它有两个天然难题:一是密钥怎么安全地送到对方手里,二是 n 个人两两通信需要 n(n-1)/2 把密钥,规模一大就管不过来。这两个问题后来都交给非对称加密和密钥管理机制来解决。
分组密码是把明文按固定长度切成块,逐块加密。DES 的分组长度是 64 位,密钥有效长度是 56 位,因为密钥里有 8 位是校验位。56 位在今天看来太短了,穷举空间只有 2^56,专用硬件几天就能暴力破解,所以 DES 已经退出历史舞台。3DES 是把 DES 做三次(加密、解密、加密),密钥长度提升到 112 位或 168 位,属于过渡方案。AES 才是当前的主力,分组长度固定 128 位,密钥支持 128、192、256 位三种,对应轮数分别是 10、12、14 轮。
AES 的每一轮做四件事:字节代换、行移位、列混合、轮密钥加。第一次听说会觉得像在描述一个流水线,实际上它就是通过"混淆"和"扩散"两种操作反复搅拌数据,让明文和密钥之间的关系变得极难反推。列混合用到了前面提到的有限域 GF(2^8) 运算,这就是数学基础的实际落点。
分组密码本身只能处理固定长度的块,要加密任意长度的数据,就得靠工作模式。这块内容考试很爱考,而且很多人记混,我整理了一张表:
| 模式 | 是否需要填充 | 能否并行加密 | 是否需要初始向量 | 典型用途 |
|---|---|---|---|---|
| ECB | 需要 | 可以 | 不需要 | 不建议使用,相同明文块产生相同密文块 |
| CBC | 需要 | 加密不可、解密可以 | 需要 | 文件加密、TLS 历史版本 |
| CFB | 不需要 | 解密可以 | 需要 | 流式加密场景 |
| OFB | 不需要 | 都不可以 | 需要 | 噪声信道、卫星通信 |
| CTR | 不需要 | 可以 | 需要(计数器) | 高性能场景、磁盘加密 |
注意:ECB 模式的问题不在于算法弱,而在于它没有把前后块关联起来。经典的"企鹅图"例子就是用它加密位图时,轮廓依然清晰可辨。只要你的数据有明显的重复结构,就不要用 ECB。
这里还涉及一个容易忽略的细节——填充。CBC 这类模式要求明文长度是分组的整数倍,不足的部分要补齐。常用的 PKCS#7 填充规则是"缺几个字节就填几个几",比如缺 3 个字节就填 03 03 03。这个规则看着简单,但历史上因为实现不当引发过真实的攻击,所以解填充时的错误提示要尽量模糊,不要让攻击者通过"填充正确与否"的差异来反推明文。
3.2 非对称加密与 RSA 计算题的完整套路
非对称加密用一对密钥,公钥公开、私钥保密,加密和验证用公钥,解密和签名用私钥。它解决了密钥分发问题,代价是运算慢,通常只用来加密对称密钥或者做签名,不直接加密大块数据。RSA 是最经典的非对称算法,也是各类考试里出现频率最高的计算题。
RSA 的完整流程可以拆成六步,我按顺序写清楚,每一步都说明为什么:
第一步,选两个大素数 p 和 q。实际应用中它们各自通常是 1024 位以上,且不能太接近,防止被费马分解法攻击。考试里一般给几个小素数让你算。
第二步,计算 n = p × q。n 就是模数,它会作为公钥的一部分公开。n 的长度就是常说的"密钥长度",2048 位指的就是 n 的位数。
第三步,计算欧拉函数 φ(n) = (p-1)(q-1)。注意这里的减一必须减,很多人考试时直接写 p×q,那是错的。
第四步,选定公钥指数 e。要求 1 < e < φ(n),且 gcd(e, φ(n)) = 1。实践中常用 65537,因为它二进制只有两个 1,做模幂运算快。
第五步,计算私钥 d,使得 e × d ≡ 1 (mod φ(n))。这一步就是用扩展欧几里得求模逆元,是整个流程里唯一需要"技术活"的地方。
第六步,加密 c = m^e mod n,解密 m = c^d mod n。
我用两个例子走一遍。第一个是经典的考试规格:p = 61,q = 53,e = 17。
n = 61 × 53 = 3233 φ(n) = 60 × 52 = 3120 求 d 使 17d ≡ 1 (mod 3120):
3120 = 183 × 17 + 9 17 = 1 × 9 + 8 9 = 1 × 8 + 1 8 = 8 × 1 + 0回代: 1 = 9 - 8 1 = 9 - (17 - 9) = 2 × 9 - 17 1 = 2 × (3120 - 183 × 17) - 17 = 2 × 3120 - 367 × 17
所以 -367 × 17 ≡ 1 (mod 3120),d = -367 mod 3120 =2753。验证一下:17 × 2753 = 46801,46801 ÷ 3120 = 15 余 1,正确。
加密 m = 65:c = 65^17 mod 3233,用快速幂算出来是 2790。解密 2790^2753 mod 3233 会回到 65。这个例子给的是小数字,实际做题时要注意,模幂运算不要硬算,用平方-乘法的思路逐步约减。
第二个例子更小,适合验算:p = 11,q = 13,e = 7。n = 143,φ(n) = 120,求 7d ≡ 1 (mod 120)。因为 7 × 103 = 721 = 6 × 120 + 1,所以 d = 103。加密 m = 5:c = 5^7 mod 143。先算 5^2 = 25,5^4 = 625 mod 143 = 625 - 572 = 53,那么 5^7 = 5^4 × 5^2 × 5 = 53 × 25 × 5 = 6625,6625 mod 143 = 6625 - 6578 = 47。所以密文是 47,解密时 47^103 mod 143 会等于 5。
实际系统里还有一个优化叫CRT 加速。因为 n = p × q,解密者知道 p 和 q,可以把一次大模幂拆成两次小模幂,用中国剩余定理合并结果,速度大约能提升三四倍。做法是预先计算 d_p = d mod (p-1) 和 d_q = d mod (q-1),解密时分别算 m1 = c^d_p mod p 和 m2 = c^d_q mod q,再合并。这个优化在 OpenSSL 这类库里面是默认开启的,考试里偶尔会考到原理。
提示:RSA 的安全性建立在"大整数分解困难"之上,但前提是参数选得对。如果 p 和 q 太接近、e 选得太小(比如 e = 3 且明文很短)、或者不同用户共用同一个 n,都会出问题。考试喜欢在这些地方设陷阱。
3.3 哈希函数、消息认证码与数字签名
哈希函数把任意长度的输入压缩成固定长度的输出,特点是单向(从输出推不出输入)、抗第二原像(给定一个输入,找不到另一个输入有相同输出)、抗碰撞(找不到任意两个不同输入有相同输出)。常见的算法参数如下:
| 算法 | 输出长度 | 分组长度 | 现状 |
|---|---|---|---|
| MD5 | 128 位 | 512 位 | 已被破解,禁止用于安全场景 |
| SHA-1 | 160 位 | 512 位 | 已被破解,逐步淘汰 |
| SHA-256 | 256 位 | 512 位 | 主流选择 |
| SHA-3 | 224/256/384/512 位 | 可变 | 与 SHA-2 结构不同,作为备份方案 |
| SM3 | 256 位 | 512 位 | 国产标准,广泛用于国内密码应用 |
这里有个必考的结论要记牢:哈希的抗碰撞强度只有输出长度的一半。原因是生日悖论——在 2^(n/2) 个随机样本里出现碰撞的概率就接近一半了。所以 SHA-1 的 160 位输出,实际抗碰撞强度约 80 位;SHA-256 约 128 位。这也解释了为什么 MD5 和 SHA-1 必须退出。
哈希单独用不足以证明消息来自谁,因为任何人都能改数据之后重算哈希。要解决这个问题,就要引入密钥。消息认证码(MAC)用共享密钥参与运算,保证完整性和来源真实性,HMAC 是最常用的构造方式,把哈希函数套在密钥和消息的两次组合里,即使底层哈希有某些弱点也能保持安全。
数字签名则用私钥运算、公钥验证,除了完整性和真实性,还能提供不可否认性。流程是:发送方先对消息算摘要,再用自己的私钥对摘要做签名运算,把消息和签名一起发出去;接收方用发送方的公钥验证签名,同时自己也算一遍摘要比对。RSA 签名、DSA、ECDSA 都是常见方案,国密体系里对应 SM2 签名。
签名要真正可信,还得解决"公钥到底是不是他的"这个问题,这就轮到PKI 和数字证书出场。证书由认证机构签发,里面包含主体信息、公钥、有效期、签发者信息,以及 CA 自己的签名。验证证书时沿着证书链一路向上,直到某个被信任的根证书。CRL 和 OCSP 是检查证书是否被吊销的两种机制,前者是定期下载吊销列表,后者是实时在线查询,各有开销和实时性的取舍。
注意:哈希加盐是密码存储的正确做法,但"盐"要和哈希值一起存,它不是秘密。真正要保密的是每个用户的盐值随机性,以及整个数据库的访问权限。用固定盐或者全库共用一个盐,等于白做。
4. 网络与协议安全:从链路层一直看到应用层
4.1 分层看弱点:每一层都有自己的软肋
网络协议安全最好的学习方式,是拿 TCP/IP 四层模型当骨架,逐层问"这里有什么薄弱点"。这样做的好处是不容易漏,坏处是初次接触会觉得信息量大。我按层整理一下核心内容。
链路层和局域网这块,最典型的问题是ARP 协议没有认证机制。ARP 的工作方式是广播询问"这个 IP 是谁的,请告诉我你的 MAC",然后对应主机回应。攻击者可以伪造回应,把自己的 MAC 地址绑定到网关 IP 上,导致流量被牵引。防御手段包括静态 ARP 绑定、动态 ARP 检测、端口安全等。同一层还有 MAC 泛洪攻击(塞满交换机 MAC 表让它退化成广播设备)和 VLAN 跳跃,防御思路是限制每端口可学习的 MAC 数量、关闭不必要的端口。
网络层的核心问题是IP 协议本身不提供认证和加密。源地址可以轻易伪造,这就是各种反射放大攻击的基础。防御手段是入口过滤,也就是在边界路由器上丢弃源地址不属于本网段的包。IPSec 是网络层的安全方案,提供 AH(认证头)和 ESP(封装安全载荷)两种协议,支持传输模式和隧道模式,前者只保护载荷,后者把整个原始 IP 包封进去,适合网关到网关的场景。
传输层的经典问题是TCP 三次握手的资源消耗。攻击者发送大量伪造源 IP 的 SYN 包,服务器回应 SYN-ACK 并等待确认,连接进入半开状态占用资源。防御手段包括 SYN Cookie、缩短超时时间、部署清洗设备。TCP 还有序列号可预测导致的会话劫持风险,现代操作系统已经用随机初始序列号大幅缓解。
应用层的问题最多,因为协议种类繁杂、实现质量参差不齐。DNS 缓存投毒、HTTP 明文传输、邮件伪造、API 越权,都属于这一层。防御的基本盘是"该加密的加密、该认证的认证、该校验的校验",具体到 DNS 有 DNSSEC,HTTP 有 TLS,邮件有 SPF、DKIM、DMARC 三件套。
4.2 TLS 握手到底在干什么
TLS 是应用层安全里最重要的协议,也是考试和面试的高频考点。很多人能背出"握手建立安全通道",但说不清楚每一步在交换什么。我按 TLS 1.2 的完整握手流程讲一遍,然后再对比 1.3 的变化。
第一步,客户端发ClientHello,里面包含客户端支持的 TLS 版本、密码套件列表、一个客户端随机数,以及扩展字段(比如支持的椭圆曲线、签名算法)。
第二步,服务端回ServerHello,从客户端提供的列表里选定一套密码套件和版本,给出服务端随机数。随后服务端发送Certificate,把自己的证书链发过去;如果是使用临时密钥交换(ECDHE),还会发ServerKeyExchange,带上签名后的密钥交换参数;最后发ServerHelloDone表示这一轮说完。
第三步,客户端验证证书。这一步要做的事很多:检查证书链能否构建到受信根、检查有效期、检查域名匹配、查询吊销状态、验证服务端对密钥交换参数的签名。验证通过后,客户端生成预主密钥,用服务端公钥加密发过去(ClientKeyExchange),双方各自用两个随机数加预主密钥计算出主密钥,再派生出会话密钥。
第四步,双方发ChangeCipherSpec通知对方"后面开始用新密钥",然后发Finished消息,内容是对之前所有握手消息的摘要,用来确认握手没被篡改。至此握手完成,应用数据开始用对称密钥加密传输。
TLS 1.3 做了大幅精简:握手从两次往返压缩到一次往返,删掉了 RSA 密钥传输、静态 DH 等一批有安全隐患的套件,只保留前向安全的密钥交换方式,并且默认开启加密,连证书部分也加密。所谓前向安全,指的是即使长期私钥以后泄露,也无法解密之前录下来的通信内容——因为每次会话用的临时密钥用完就丢。这也是为什么现在各类加密通信场景都在往 TLS 1.3 迁移。
注意:证书验证是 TLS 最容易出问题的地方。移动端应用里常见的错误做法是"信任所有证书",或者只做域名检查不做链验证,这等于把 TLS 的安全性全丢了。自签名证书要单独做固定证书校验,而不是简单跳过校验。
4.3 防火墙、入侵检测与访问控制模型
网络边界的防护设备主要有三类。包过滤防火墙看的是五元组(源 IP、目的 IP、源端口、目的端口、协议),速度快但粒度粗;状态检测防火墙在包过滤基础上维护连接状态表,能判断一个包是不是属于已建立的会话,安全性更高;应用代理防火墙把连接在应用层断开重建,能理解协议内容,粒度最细但性能开销最大。实际部署中常见的是状态检测加应用层插件的组合。
入侵检测系统(IDS)负责发现异常,入侵防御系统(IPS)负责阻断,二者的区别是部署方式:IDS 通常旁路部署,只镜像流量做分析,不会影响业务;IPS 串联在链路中,发现问题直接丢弃报文,但一旦误判就可能影响正常业务。所以 IPS 上线前的规则调优特别重要,宁可先当 IDS 跑一段时间观察,也不要一上来就串联阻断。
访问控制模型是理论部分的重点,几个经典模型要能区分清楚:
| 模型 | 关注目标 | 核心规则 | 典型场景 |
|---|---|---|---|
| BLP | 机密性 | 不上读、不下写 | 军事、涉密系统 |
| Biba | 完整性 | 不下读、不上写 | 关键数据保护 |
| Clark-Wilson | 完整性 | 主体只能通过程序访问客体 | 商业系统、财务系统 |
| RBAC | 管理效率 | 权限授予角色,角色授予用户 | 企业信息系统 |
| ABAC | 灵活性 | 基于属性组合动态判定 | 云平台、细粒度授权 |
BLP 和 Biba 的读写下方向最容易记反。我的记法是:BLP 保机密,所以低级别的人不能读高级别的文件(不上读),高级别的信息不能流到低级别(不下写)。Biba 反过来,保完整性,所以不能读低完整性的东西(怕被污染),也不能往高完整性的地方写(怕污染别人)。用"防泄密"和"防污染"两个词去套,基本不会错。
5. 系统与应用安全:从主机加固到智能网联汽车
5.1 操作系统与主机层的加固要点
主机安全的第一道门是身份认证。口令要有复杂度要求和失败锁定策略,更重要的是别让口令成为唯一的凭证,重要系统应叠加多因素认证,比如"口令加动态令牌"或者"口令加生物特征"。口令在数据库里必须加盐哈希存储,绝对不能用明文或者可逆加密。
第二道门是访问控制,核心原则是最小权限。操作系统层面通过用户、组、文件权限位、访问控制列表来管;数据库层面通过账号权限和视图来管;应用层面通过角色和接口鉴权来管。三层的权限要一致,经常出现的情况是系统层做了限制但数据库账号是 root,等于前功尽弃。
第三道门是补丁与配置管理。绝大多数被利用的问题都是已知问题,只是没及时修复。实际运维中要建立资产清单、漏洞扫描、补丁评估、灰度上线这一套流程。配置基线同样重要,比如关闭不必要的服务和端口、禁用默认账号、修改默认路径、开启日志审计。默认配置最危险的地方不是它配置错了,而是攻击者都知道它长什么样。
第四道门是恶意代码防护与审计。防病毒、主机入侵检测、日志集中收集是标配。日志的价值在于事后追溯,所以时间同步要做,日志要防止被篡改,保留周期要符合要求。我个人建议日志集中到一个独立平台,别放在被监控的主机上,否则一旦主机沦陷,日志也一起没了。
5.2 软件与代码层面的常见问题
软件安全的问题可以粗略分成两类:一类是实现缺陷,一类是设计缺陷。实现缺陷里最经典的是输入验证不足,也就是把用户输入当成了可信数据。缓冲区溢出、SQL 注入、跨站脚本、命令注入,本质都是这个原因。防御手段也很统一:参数化查询、输出编码、白名单校验、最小权限运行。
以 SQL 注入为例,正确的防御不是去过滤某些关键字,而是用参数化查询把数据和语句彻底分开。过滤关键字这件事在编码方式多样化的情况下很容易被绕过,而参数化查询是数据库驱动层面的机制,从根上就不给注入留空间。同样的道理,输出到 HTML 要按上下文做编码,输出到 JavaScript、URL、CSS 里各有各的编码规则,一套 HTML 编码走天下是不行的。
设计缺陷更难发现,比如越权访问、业务逻辑绕过、竞态条件。越权分水平越权和垂直越权,前者是普通用户能看别人的数据,后者是普通用户能用到管理员功能。这类问题的根因往往是把权限校验放在前端,或者只在列表接口做校验但详情接口忘了加。防御的核心思路是每个涉及资源的接口都问一遍"当前登录者有没有权限访问这个具体资源",而不是只问"他登录了没有"。
安全开发生命周期这个概念值得记住,它把安全活动嵌入到需求、设计、编码、测试、上线、运维每个阶段。需求阶段做安全需求分析,设计阶段做威胁建模,编码阶段做安全规范和静态扫描,测试阶段做安全测试,上线前做安全评审,上线后做监控和响应。这套流程的价值在于把问题往前赶,因为在需求阶段改一个设计,成本远低于上线后打补丁。
5.3 智能网联汽车:一个新的安全战场
智能网联汽车是这几年信息安全领域增长最快的方向之一,也是很多竞赛和毕设的热门选题。它的特殊性在于,安全问题的后果直接关联人身安全,而且车辆的生命周期长达十几年,远超一般 IT 设备的更新周期。
先看攻击面,一辆现代智能汽车的可能入口包括:物理接口如 OBD 诊断口和 USB 口,短距无线如蓝牙、WiFi、无钥匙进入系统,远程通信如蜂窝网络连接的远程信息处理单元,车外感知如摄像头、毫米波雷达、超声波传感器,以及车内的各种总线和车载以太网。
车内网络里最常被讨论的是CAN 总线。它的设计目标是可靠、实时、成本低,报文以广播方式发送,天然没有认证和加密机制,任何接入总线节点理论上都能发送报文。这在功能安全角度是合理的,但在信息安全角度就是明显短板。随着车载以太网和 SOME/IP 协议引入,情况有所改善,但也带来了新的 Web 类问题。
针对这类场景的防护思路,目前比较成体系的包括:在网关处做域隔离,把动力、底盘、娱乐、远程通信分到不同域,跨域通信要经过网关过滤;引入安全车载通信机制,对关键报文加消息认证码,让接收方能判断报文来源是否可信;在车内网络部署入侵检测,通过监测报文频率、ID 分布、周期特征来发现异常注入;强化诊断接口的访问控制,诊断服务要有身份认证和权限分级,不能谁接上 OBD 就能刷写固件;建立整车 OTA 的安全链路,固件包要签名、传输要加密、刷写前要校验版本和完整性,并且要能回滚。
竞赛里的题目通常围绕这些点展开,比如给一段 CAN 报文日志让你分析异常 ID、给一个诊断服务交互记录让你判断安全访问流程哪里有问题、给一份固件让你定位硬编码密钥。这类题目的共同点是考察你能不能把协议规范和实际数据对应起来,而不是让你去做破坏性操作。我的建议是从抓包分析入手,先把正常的通信流程看明白,再看异常在哪。
关于"渗透测试"这个词,必须说清楚边界:任何测试都必须有明确的书面授权、明确的范围界定、明确的时间窗口,并且不能影响生产环境和真实用户数据。车载领域的测试更是如此,涉及实车时必须由厂商组织并在受控环境里进行。没有授权就动手,性质就完全变了。
6. CTF 与实战:把知识点用起来的正确方式
6.1 CTF 的五大方向与备赛思路
CTF 竞赛是检验信息安全知识掌握程度的一种方式,题目通常分几个方向,每个方向考察的知识点差异很大:
| 方向 | 主要考察内容 | 依赖的基础知识 |
|---|---|---|
| Crypto | 密码算法、编码、数论 | 数学基础、密码学 |
| Reverse | 逆向分析、程序逻辑还原 | 汇编、编译原理、操作系统 |
| Pwn | 内存破坏、漏洞利用 | C 语言、内存布局、汇编 |
| Web | 注入、越权、逻辑漏洞 | HTTP、前后端、数据库 |
| Misc | 隐写、取证、杂项编码 | 文件格式、编码常识 |
对刚入门的人来说,Crypto 和 Misc 是最容易上手的两个方向,因为它们对系统底层知识的要求相对低,更多依赖逻辑推理和工具使用。Crypto 里的 RSA 类题目尤其适合练手,很多题给出的参数有特殊关系,比如共用模数、小公钥指数、p 和 q 太接近,只要能识别出是哪类问题,就能找到对应的解法。这和前面讲的 RSA 参数选择注意事项是同一套知识,只是从"防御"换到了"发现问题"的视角。
Web 方向适合有开发经验的人,因为很多漏洞本质上是对框架和协议理解不透导致的。Reverse 和 Pwn 门槛最高,需要补汇编和操作系统,但一旦入门,在很多岗位上会有明显优势。
备赛的方法我总结成三条:第一,别只刷题不总结,每道题做完要写清楚"考的是什么知识点、卡在哪一步、下次怎么识别";第二,工具要熟练但不能依赖,基础脚本能力比工具菜单更重要;第三,跟着知识地图补短板,做到哪个方向卡住,就回去补对应的理论块,而不是盲目刷量。
6.2 从知识点到工作能力:几个实际的转化路径
学完这套理论,很多人会问"接下来干什么"。我按几种常见的职业方向给点建议。
如果你走安全运维或甲方安全岗,重点是把资产、漏洞、事件三件事管起来。资产要清楚有什么、在哪里、谁负责;漏洞要有扫描、评估、跟踪闭环;事件要有监测、响应、复盘流程。理论部分最有用的是访问控制模型、密码学应用(证书、加密存储)、以及风险评估方法。
如果你走安全测试或安全服务岗,重点是系统化的测试方法论和扎实的协议理解。测试本身有标准流程:授权与范围确认、信息收集、威胁建模、测试执行、报告与修复验证。理论部分最有用的是网络协议、Web 安全、密码学应用中的常见误用。这里再次强调,测试的合法性来自授权,不是来自技术能力。
如果你走安全研发或产品岗,重点是密码学工程实践、密钥管理、安全架构设计。你会频繁面对"用什么算法、密钥怎么存、怎么轮换、怎么兼顾性能"这类问题。理论部分最有用的是密码学基础和系统安全设计原则,比如最小权限、纵深防御、失效安全。
6.3 英语到底要不要好:一个绕不开的现实
热词里有个问题很真实——"信息安全需要英语好吗"。我的回答是:不需要英语好到能写小说,但需要好到能读文档。
原因很具体。这个领域的第一手资料基本都是英文的:协议规范、算法标准、漏洞公告、厂商安全通告、顶会论文。你可以靠翻译工具解决一部分,但涉及精确描述的部分,翻译经常失真。比如一个漏洞公告里说"improper input validation in the authentication module",翻译成"认证模块中的不当输入验证"之后,你可能会以为是输入格式没校验,实际可能是认证逻辑可以被绕过,两者差别很大。
更现实的是,很多工具的报错和日志是英文的,出问题时能不能读懂报错,直接决定你的排查效率。我的建议是把英语学习嵌进日常工作里,别单独背单词。每次遇到英文文档,先自己读一遍,遇到不认识的术语查一下记下来,几个月下来常用的那几百个词自然就熟了。RFC 文档不用全读,挑你正在用的协议读关键章节就够了。
7. 常见问题与排查技巧实录
7.1 复习和做题中反复出现的坑
下面这些是我自己在复习和带人过程中反复遇到的高频问题,整理成速查表,遇到卡壳的时候可以对照排查。
| 现象 | 常见原因 | 处理思路 |
|---|---|---|
| RSA 求 d 时算错 | φ(n) 忘记减一,或模逆元符号搞错 | 先验证 e×d mod φ(n) 是否等于 1 |
| 分组模式分辨不清 | 只记名字没记特性 | 记住是否需要 IV、能否并行、是否需要填充三点 |
| BLP 和 Biba 记反 | 记的是结论不是逻辑 | 用"防泄密"和"防污染"两个词判断方向 |
| TLS 握手步骤混乱 | 按顺序背而不是按目的记 | 按"协商参数、验证身份、生成密钥、确认完成"四段记 |
| 哈希抗碰撞强度算错 | 忘记生日悖论 | 抗碰撞强度是输出长度的一半 |
| 访问控制模型混淆 | 没区分保密性和完整性 | 先判断这个模型保的是什么属性 |
| 证书链验证出错 | 只验证了签名没验证其他项 | 逐项检查:链、有效期、域名、吊销状态 |
| 数字签名概念不清 | 把私钥公钥的用途搞反 | 记"私钥签名、公钥验证" |
再补充几个不是表格能说清的经验点。
第一,公式要手推,不要只看。欧拉定理、扩展欧几里得、RSA 三步计算,这些内容看一遍觉得懂了,实际动手就会卡。我在复习时会用空白纸默写扩展欧几里得的递归和回代过程,连续三天都能写对才算过关。
第二,协议要画图,不要只读文字。TLS 握手、Kerberos 认证、IPSec 处理流程,这些内容画成时序图之后理解难度会大幅下降。画的时候把每一步交换的消息、用到的密钥、保护的范围都标出来,画完一遍胜过读十遍。
第三,概念要对比,不要孤立记忆。对称和非对称、IDS 和 IPS、BLP 和 Biba、MD5 和 SHA、DAC 和 MAC,这些成对出现的概念放在一起对比着记,效果远好于单独背。我习惯用一张表把它们的"目标、手段、弱点、场景"四列填出来,填的过程就是理解的过程。
第四,别忽略"安全管理"这块。风险评估方法、安全策略层次、业务连续性、应急响应流程,这些内容在考试里占分不少,在实际工作中更是天天用。技术能力决定你能不能解决问题,管理能力决定问题会不会反复发生。
7.2 一些实操中踩过的坑
说几个具体场景里的经验,都是我自己或者身边人踩过的。
关于加密存储:见过不止一个系统用 MD5 存口令,理由是"反正哈希了"。问题在于 MD5 早就可以用彩虹表反查,加固定盐也没用,因为攻击者拿到代码就知道盐是什么。正确做法是用专门的口令哈希算法,加上每个用户独立的随机盐,并且把计算强度参数调到一个合理值,让暴力破解的成本高到不划算。
关于证书管理:证书过期导致线上故障是特别常见的低级问题。解决办法不是靠人记,而是把证书到期时间纳入监控,提前 30 天告警,并且把证书续期流程自动化。另外要维护一份证书清单,知道哪个服务用了哪张证书、谁负责续期,千万别等出事才发现没人知道这个证书是哪来的。
关于日志:日志太少查不了问题,日志太多没人看。我的经验是先明确几个关键问题,比如"谁在什么时候从哪里登录了""哪个接口被调用了多少次""哪个操作失败了",围绕这些定义日志字段。敏感信息千万别记进日志,比如口令、密钥、身份证号,这些一旦落到日志文件里,日志就变成了新的风险点。
关于权限:最容易被忽略的是离职和转岗人员的权限回收。很多系统的权限是"加的时候很积极,删的时候没人管",时间一长就积累一堆僵尸账号。建议做定期权限复核,尤其是核心系统的访问权限,每季度过一遍,把不再需要的权限收回来。
关于测试:做任何测试之前,先确认三件事——有没有书面授权、范围包含哪些资产、出问题找谁。这三件事任何一件不清楚,就不要动手。技术能力越强越要守住这条线,因为影响范围也越大。
关于毕设选题:如果打算做信息安全方向的毕业设计,我建议选"有明确边界、可以独立完成、能拿出可验证结果"的题目。比如某个协议的实现与安全分析、某个场景下的检测方案设计与实现、某个系统的安全加固方案与验证。避免选那种依赖特殊环境或者需要大量真实数据才能做的题目,否则中期会很痛苦。选题的时候多问自己一句:这个题目我做完了能给别人演示什么?
最后说一个我自己的体会。信息安全的知识点确实碎,但它碎得有规律——所有的加密都在解决"信任",所有的访问控制都在解决"边界",所有的检测响应都在解决"发现"。当你能用这几个大问题去统摄那些细碎的名词,复习就不再是记忆负担,而是不断往一个已经成型的框架里填内容。后续如果想继续扩展,可以从两个方向入手:一个是往深走,挑一个方向(比如密码学工程实践或车内网络安全)做深;另一个是往宽走,把云原生安全、数据安全治理这些相邻领域补上,它们和传统知识点的衔接点比想象中多。