很多人刚开始接触信息安全技术基础知识时,会陷入一种奇怪的状态:教程收藏了几十个,工具下载了一大堆,安全新闻也天天刷,但一问到本质问题就卡壳——信息安全和网络安全到底有什么区别?加密算法为什么分对称和非对称?HTTPS 那个小锁头真的代表安全吗?反而是这些基础问题,决定了一个人能不能在这个行业里走远。
作为这个系列的第四篇,这篇不聊某个具体工具的用法,也不追热点漏洞,而是把整个信息安全技术里最底层的地基完整捋一遍:CIA 三元组、密码学的三条技术线、常见网络攻击背后的共性、通信信任模型、纵深防御的落地思路。适合刚转行做安全的同学、团队里需要补安全底子的研发和运维,以及想系统整理自己知识体系的从业者。读完你再去看那些漏洞分析文章和产品文档,会发现顺畅很多——因为你知道它们挂在知识树的哪个位置上。
1. 信息安全的试金石:CIA 三元组和它的现实取舍
1.1 机密性、完整性、可用性分别在拦什么问题
信息安全技术基础知识最容易走偏的地方,就是把“加密”“防火墙”“杀毒软件”当成安全本身。其实安全界对保护目标有统一的归纳,就是业内常说的 CIA 三元组,注意不是那个情报机构,而是 Confidentiality(机密性)、Integrity(完整性)、Availability(可用性)三个词的缩写。
机密性解决的是“谁都能看”的问题。只有被授权的人才能读取数据,手段包括访问控制、文件权限、加密存储。你银行卡密码不能被别人看到,公司财务报表不能泄露给无关员工,这就是机密性。完整性解决的是“数据被改”的问题。数据在传输和存储过程中不能被篡改,手段包括哈希校验、数字签名、数据库事务约束。你下载的安装包被植入了木马,那就完整性被破坏了。可用性解决的是“关键时刻用不了”的问题。系统在需要的时候能正常提供服务,手段包括冗余部署、备份恢复、抗 DDoS 防护。银行系统在高峰期宕机一小时,即使数据一条没丢、一条没泄露,也是一次严重的安全事故,因为可用性没了。
三者的关系可以这样理解:机密性像保险柜,完整性像封条,可用性像水电供应。一个系统如果保险柜打不开、封条完好但电断了,对业务来说仍然是失败的。
1.2 三元组之间的冲突与安全成本平衡
很多人以为安全目标越多越好,但真实业务里 CIA 三者的优先级经常互相打架。把数据库全部加密,每次查询都要解密运算,性能明显下降;如果密钥管理不善导致密钥丢失,数据直接变乱码,可用性归零。权限控制做到极致,所有操作都要层层审批,业务响应速度立刻变慢,员工怨声载道。
我刚入行时参与过一个内部系统的安全评估,当时团队负责人上来就问了一个问题:你想保护的数据,最怕的是被偷看、被篡改、还是系统瘫痪时业务中断?不同业务答案完全不同。银行核心系统优先保证完整性和可用性,一条交易记录被篡改比被偷看可怕得多;医疗数据优先保证机密性,泄露可能带来严重隐私问题;视频网站优先保证可用性,宕机意味着收入直接流失。安全从来不是追求理论上的绝对防御,而是在风险和成本之间做取舍。这也是为什么我在评估任何系统时,第一步永远是问业务方:你最怕什么?而不是急着上设备、开策略。
1.3 AAA:认证、授权、审计组成的另外半张地图
CIA 回答了“保护什么”,但还有一个问题它没直接回答:“怎么确认操作的人是谁、能做哪些事、出事之后能不能追溯?”这就是信息安全里常说的 AAA:Authentication(认证)、Authorization(授权)、Accountability(审计追责)。
认证解决“你是谁”。口令、动态令牌、生物识别、多因子认证都在这层。授权解决“你能做什么”。最常见的是基于角色的访问控制,也就是 RBAC,普通员工只能看自己的薪资记录,部门经理能看团队报表,人事专员才能改薪资。审计解决“你做了什么”。所有关键操作要记录日志,日志要防篡改,配合数字签名还能做到不可否认——某个人操作过某条数据,事后赖不掉。
我把这四件事给很多朋友做过类比:CIA 是你要保护的财物,AAA 是门禁系统,门禁记录了谁刷卡、能进哪个房间、几点进的。没有 AAA,就算数据加密做得再漂亮,内鬼用合法账号把明文数据拖走,你也查不到是谁干的。现实中大量数据泄露事件恰恰不是外部黑客攻破的,而是内部权限过大加上没有审计,一查日志发现全是空白。
2. 密码学的三条技术线:为什么算法分三类,分别用来干什么
2.1 对称加密:速度快,但密钥分发是死穴
密码学是信息安全技术的地基,但这里说的密码学不是让你去发明算法,而是理解三类算法的分工。第一类是对称加密,代表算法是 AES,目前实际场景里基本都是 AES-128 或 AES-256。
对称加密的特点是加密和解密用同一把密钥,就像两个人共用一把钥匙开门。优点是性能极好,适合加密大量数据,比如文件加密、数据库透明加密、磁盘加密。缺点是密钥分发难:如果密钥要通过网络传给对方,那传输过程中密钥本身怎么保护?如果密钥已经泄露,加密形同虚设。
对称加密还有一个容易被忽视的细节是分组模式。很多安全事件的发生不是因为 AES 本身被破解,而是用了错误的模式。ECB 模式下,相同的明文块会产生相同的密文块,加密一张图片之后还能隐约看出轮廓,这种模式在现代应用里已经被弃用。推荐使用的是 GCM 这类带认证的模式,它除了加密,还内置了完整性校验,密文在传输中被篡改能立即被察觉。这也是在给系统选型时我会优先建议 GCM 的原因。
2.2 非对称加密:公钥私钥分离,解决了密钥分发难题
第二类是非对称加密,代表算法有 RSA 和 ECC。它有一对钥匙:公钥可以公开分发,私钥只能自己保管。用公钥加密的数据只能用私钥解密,反过来,用私钥签名的数据任何持有公钥的人都能验证签名是否有效。
非对称加密可以比作一个公共信箱:任何人都能往信箱里投信(用公钥加密),但只有信箱主人能打开取信(用私钥解密)。这个机制一举解决对称加密的密钥分发难题,但代价是性能比对称加密慢好几个数量级,不适合加密大块数据。所以现实方案都是混合加密:用非对称加密安全地协商出一把临时的对称密钥,再用这把对称密钥加密实际传输的数据。TLS 就是这个套路。
非对称加密还有一套反向应用就是数字签名:私钥签名,公钥验签。签名的作用不是保密,而是证明这个数据确实来自声称的那个人,且中途没被改过。你下载软件时看到的 PGP 签名、代码提交时的 GPG 签名,就是这一原理。
2.3 哈希函数:不可逆的“数据指纹”
第三类是哈希函数,典型代表是 SHA-256。它把任意长度的数据映射成固定长度的摘要,几个关键性质决定了它的用途:不可逆,从摘要反推原文在计算上不可行;雪崩效应,原文改一个字节,摘要面目全非;抗碰撞,理论上很难找到两个不同数据拥有相同哈希值。
打个比方,哈希就是给人或文件按一个“指纹”。最常见的用途之一就是完整性校验,从正轨镜像站下载一个大文件后,顺手比对官方公布的 SHA-256 值,一致就说明文件没被篡改。另一个隐形但极其重要的用途是口令存储。用户密码存数据库时绝不能存明文,这一点大家都知道;但很多人不知道的是,存裸哈希也是错的。如果用户口令是123456,直接做 SHA-256 后得到的值是固定的,攻击者拿一份常用口令的预计算表就能批量反查。正确做法是加盐加迭代:给每个用户随机生成一个 salt,拼在一起做几千甚至上万次哈希运算,让破解成本和计算成本都飙升。
2.4 算法选型表和我踩过的坑
三类算法的具体选型,我一般会建议按下面这个思路走:
| 场景 | 推荐方案 | 注意事项 |
|---|---|---|
| 数据加密存储 | AES-256-GCM | 密钥托管到专门的密钥管理系统,不写死在配置里 |
| 传输加密 | TLS 1.2+ 使用 ECDHE + AES | 服务端证书必须由受信任的 CA 签发 |
| 完整性校验 | SHA-256 或 SHA-3 | 不要用 MD5 和 SHA-1,已被实践证明不安全 |
| 口令存储 | Argon2 或 PBKDF2 | 必须加随机盐,禁止使用裸哈希 |
| 数字签名 | ECDSA 或 Ed25519 | 私钥存储在硬件安全模块或安全环境中 |
实操中我踩过最大的坑有两个。一是某次内部系统对接时,对方拍着胸脯说用了“银行级加密”,结果一看是 ECB 模式对每个字段单独加密,相同字段值在数据库里呈现的密文都相同,等于给攻击者留了一本对照字典。二是有人为了方便,把私钥直接提交进代码仓库,扫描器一查就把最核心的密钥暴露了。密码学的安全边界里有一句行业老话:算法是公开的,保密性完全依赖密钥。密钥一旦泄露,算法再强也没有意义,所以密钥管理永远比算法本身更值得投入精力。
3. 应用层攻击的底层逻辑:从注入到 XSS、CSRF 都是同一个问题
3.1 SQL 注入:当用户输入变成了“命令”
如果把安全基础知识按实际遇到频率排序,Web 应用漏洞绝对排第一。常见的 SQL 注入、命令注入、XSS、CSRF,很多人背了一堆 payload,却说不清底层逻辑。其实这些攻击都指向同一件事:开发者把不可信的用户输入,直接拼进了“解释器”。
以 SQL 注入为例,最经典的场景是登录框。代码如果写成这样:
SELECT * FROM users WHERE username = 'admin' AND password = 'xxx'而程序是用字符串拼接的方式构造 SQL:
query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"攻击者在用户名位置输入admin' --,实际执行的 SQL 就变成了:
SELECT * FROM users WHERE username = 'admin' --' AND password = 'xxx'--在数据库里是注释符,后面那段密码校验直接被注释掉,攻击者不需要知道密码就能登录管理员账号。注入的本质不是“过滤不够”,而是输入数据被当成了程序代码来执行。所以标准的修复方案是参数化查询,让数据库把输入永远当作数据而不是 SQL 片段:
cursor.execute( "SELECT * FROM users WHERE username = ? AND password = ?", (username, password) )同样的逻辑可以延伸到命令注入、LDAP 注入、XML 外部实体注入,防御思路是一致的:任何数据与代码的边界都必须清晰,用户输入永远走数据通道,不进代码通道。
3.2 跨站脚本:浏览器把恶意代码当成了页面的一部分
XSS 和 SQL 注入读起来像兄弟,根因也有相似之处:用户输入被不加处理地渲染到页面里,浏览器把它当成合法脚本执行了。存储型 XSS 是把恶意脚本存进数据库,其他用户访问页面时触发;反射型 XSS 是恶意脚本放在链接参数里,诱导受害者点击触发;DOM 型 XSS 则在前端代码用动态拼接 DOM 时触发。
XSS 的危害被很多人低估了,以为不过是弹个窗。实际上攻击者可以借用 JavaScript 读取 Cookie、模拟用户执行操作、绘制钓鱼表单骗取账号密码。防御要分三层:输出位置做上下文编码,让脚本片段变成普通文本;通过 CSP 白名单限制脚本来源,即使注入成功也执行不了;给敏感 Cookie 加 HttpOnly 标记,让脚本拿不到会话凭证。这三层互相独立,哪怕某一层失效,另外的层还能兜底。
3.3 CSRF 和点击劫持:浏览器信任模型的副作用
CSRF 的问题出在浏览器的“自动携带凭证”机制上。你已登录某个网站,Cookie 存在浏览器里;此时你访问了另一个恶意网站,这个网站可以构造一个表单自动提交到前一个网站,浏览器会自动带上 Cookie,服务端还以为是你本人操作。
理解了这层机制就知道防御思路:不能让服务端光靠 Cookie 判断请求发起者。实践中通常用 CSRF Token,在表单里塞一个服务端下发的随机数,请求回来时校验;或者设置SameSite属性限制跨站请求携带 Cookie。这两种方案要同时做好,因为加强验证码只治标不治本。至于点击劫持,是攻击者用透明 iframe 覆盖在合法页面按钮上,诱导用户点击。防御手段是设置X-Frame-Options或 CSP 的frame-ancestors,禁止页面被嵌入第三方框架。
3.4 从攻击链视角看漏洞,为什么单点修复不够
单个漏洞的严重程度,要放在攻击链里看才准确。一条典型的攻击路径是:先扫描公网暴露面找到弱点,利用一个漏洞打入内部,再提权拿到管理员权限,然后横向移动寻找数据库服务器,最后把数据打包带走。SQL 注入可能只是第一步入口,后端的弱口令、缺少网络隔离、数据库权限过大,每一步都在放大前一步的危害。
这也是我给甲方做修复建议时反复强调的一点:不要把眼光局限在某个漏洞本身。你修掉一个 SQL 注入点,但如果同一套系统里还有十几个同类问题,或者服务器没有做最小权限,攻击者换个入口照样能进来。安全加固的正确姿势是给整条攻击链设置多个断点:外部防注入和上传漏洞,内部防横向渗透,数据层防拖库,传输层加密,至少让攻击者在任何单点上受阻。
4. 网络通信中的信任问题:从 ARP 欺骗到 HTTPS 证书体系
4.1 局域网里的无声诈骗:ARP 欺骗
网络层的攻击很多都是在“信任”上做文章。ARP 协议本身不认证任何消息,主机在局域网里发广播问“谁是网关”,任何设备都可以回答“我是网关”。攻击者在同一网段抢答,受害者的流量就会先经过攻击者的机器,这就是 ARP 欺骗。受害者的流量被抓包、被篡改,甚至被重定向到恶意网站,而受害者毫不知情。
防御 ARP 欺骗要靠交换机的端口安全、DAI(动态 ARP 检测)这些网络层的措施。但从应用角度还有一个最朴素的建议:不要裸奔。即使 ARP 被欺骗了,如果流量本身是 HTTPS 加密的,攻击者抓到的也是密文;如果还加了证书校验,攻击者想冒充服务器也过不了证书这一关。所以网络层协议的缺陷,往往要靠上层的密码学来兜底。
4.2 DNS 劫持与中间人攻击:加密不等同于身份可信
DNS 的作用是把域名解析成服务器 IP。如果 DNS 响应被篡改,访问正常域名却连到了攻击者的服务器,这就是 DNS 劫持。此时就算通信加密了,你加密的数据是发给攻击者的,加密保护的是传输过程,却保护不了通信对象本身就是骗子。
这里引出了信息安全里最容易被误解的一个点:加密和身份认证是两回事。你和高仿号“朋友”的微信聊天也是加密的,但对方不是你真朋友。中间人攻击的厉害之处就在这:攻击者在通信双方中间分别建立加密通道,双方都以为自己在和真正的对方通信,实际上数据全经过攻击者中转、查看和篡改。所以,网络安全里真正难的问题不是“怎么加密”,而是“怎么确认对方是真的”。
4.3 TLS 握手与证书链:互联网上的“身份证明系统”
HTTPS 解决的就是上面那个“身份确认”难题,核心是 TLS 协议和证书体系。服务器向客户端证明自己身份时,会出示一份数字证书,证书里绑定了一个域名和一个公钥。关键是这个证书是谁签发的——受信任的 CA 机构。浏览器或操作系统里预置了根 CA 的证书,于是形成了验证链条:服务器证书 → 中间证书 → 根证书,每一层由上一层背书,直到根证书。
简化理解 TLS 握手过程:客户端发起请求说明支持的加密套件;服务器回应并附上自己的证书;客户端验证证书链的合法性,确认这个公钥确实属于当前访问的域名;双方用非对称加密协商出一把临时的会话密钥;之后改用对称加密通信。整条链路解决两个问题:第一,通信对象的身份可信;第二,即使流量被截获,内容也解不开、改不动。
如果服务器用的是自签名证书,浏览器会报警。因为自签名证书没有任何受信任的 CA 背书,就像一个人自己给自己开了一张身份证。我见过不少同事会在内网环境图省事,把自签名证书直接配进生产环境,结果用户访问时总被浏览器拦截,最后被投诉。内部环境正确的做法是搭一套内部 CA,让公司设备信任它,而不是让每一台浏览器都“忽略错误继续访问”。
4.4 证书管理的日常经验:过期、私钥与固定
证书相关的安全事件里,我遇到最多的是证书过期。服务器证书过期导致线上服务握手失败,用户在客户端看到清一色的“连接不安全”报错。这种事故很磨人,因为系统本身没有漏洞,只是少了监控。所以我在所有服务上线清单里都会加一条:证书有效期监控,在过期前三十天自动提醒。
还有一个高频错误是把私钥提交进代码仓库。证书本质上是一对公钥私钥,公钥公开没关系,私钥一旦泄露,证书就失去意义,必须立即吊销重新签发。移动端 APP 做安全通信时,可以考虑证书固定(pinning),把服务端证书或公钥提前内置在客户端里,遇到中间人伪造证书直接拒绝连接。但要注意 pinning 引入的运维成本:证书更换时客户端也要同步更新,否则会出现全部用户无法连接的大规模事故。
5. 纵深防御的落地清单:从网络边界到人员习惯
5.1 洋葱模型:为什么不能只靠一层防护
前面讲的各种攻击和防御,如果逐个单独看,似乎都有解;但现实中没有任何一个单一安全产品能挡住所有攻击,所以才有了纵深防御的思想。纵深防御的经典比喻是洋葱——一层破了还有一层,攻击者要打穿所有层才能到达核心数据,成本和难度成倍增加。
分层思路大致是这样:网络边界用防火墙做访问控制,用 IDS/IPS 检测入侵行为;流量进入应用层,用 WAF 过滤恶意请求;服务器上部署终端检测响应(EDR)盯住文件进程和可疑行为;数据层面做敏感数据加密和数据库审计;最外层还有人的因素,员工的安全意识培训、权限审批流程、账号到期回收制度。层与层之间最好来自不同厂商,避免攻击者攻破一个平台后连带着接管所有安全能力。
5.2 最小权限:账号只给必须的,服务端口只开必要的
纵深防御之外,有一条贯穿所有层面的原则,就是最小权限原则。给每个账号、进程、服务分配的权限,只刚刚够完成本职工作,多一分都不给。数据库账号不用管理员,日常业务账号只要增删改查就够;服务器的 SSH 密钥按人签发,离职必须回收;对外端口只暴露必要的业务端口,运维端口走内网或专门的跳板机。这些说起来都是常识,但在实际系统里我审查过太多问题:一台内网测试服务器拿着和核心库一样的权限,一个前端服务居然能直连生产数据库。权限越大,被攻破时的爆炸半径越大,最小权限本质上是控制爆炸半径。
5.3 一个可参考的小型系统安全基线
结合日常工作,我给小型团队常用系统整理了一份安全基线,没有多高深,但排查问题时很好用:
| 层面 | 检查项 | 参考做法 |
|---|---|---|
| 网络 | 对外端口收敛、隔离区划分 | 仅开放 80/443,其余端口不对外 |
| 主机 | 补丁更新、弱口令、SSH 安全 | 禁 root 直接登录,启用密钥认证 |
| 应用 | 登录防爆破、错误信息脱敏 | 统一登录入口,日志不打印堆栈、Token |
| 数据 | 备份策略、敏感字段加密 | 每日自动备份,异地留存,密钥专人管理 |
| 管理 | 账号复核、日志留存 | 每季度复核权限,关键日志保留至少半年 |
这份基线不是照着填完就安全了,而是要先逐条问自己:这条我们做到了吗?做不到影响在哪?风险能不能接受?我在评估时见过最典型的两种情况:一是清单上全打了勾,实际策略没生效;二是日志确实存了,但一年到头没人看过。安全基线最大的价值不是那张纸,而是逼着团队把平时忽略的细节翻出来看一遍。
5.4 安全运营:设备买回来不算安全,跑起来才叫有效
很多企业买了一大堆安全设备,防火墙、WAF、日志审计系统全齐,但规则没开、日志没接、告警没人看。在我看来这比不买还危险,因为它让人误以为自己是安全的。安全能力不是采购清单,而是持续运营:漏洞扫描和渗透测试要定期做,高危告警要有人跟进处置,攻击事件要复盘并改配置,甚至要演练“服务器被入侵之后,你在一小时内能做什么”。
我对刚入行朋友的建议是:先把“日志”这门课补齐。在一个安全建设不完善的系统里,攻击者进来总会留下点痕迹,但这些痕迹分散在应用日志、系统日志、网络流量里。如果你连日志在哪儿、格式长什么样、怎么排查都不知道,那前面的加密、防火墙都是摆设。只有把日志和监控能力搭起来,安全才算从防守变成了主动。这个过程不用引入复杂的大数据平台,一台集中收集日志的服务器加一套告警规则就够起步了,等业务量大了再平滑迁移。
最后说一点个人体会吧。学了这么多年安全,真正影响我判断力的不是记住了多少漏洞细节,而是养成了威胁建模的思维习惯:系统里最值钱的东西是什么?攻击者通过哪条路径能碰到它?沿途有哪些阻断点?阻断点失效了怎么办?这五个问题可以套在任何一个系统上,比背十个工具命令都管用。如果你也刚开始学这块,不用急着追热点漏洞,先把我上面讲的地基打牢,后面再接触各种复杂场景,你会发现自己站得住。