计算机安全导论 复习笔记
本文最后更新于:2024年7月24日 凌晨
- 计算机安全导论 复习与总结
计算机安全导论 复习与总结
Chapter 1 简介
1.1 基本概念
[IMP] C.I.A.: 机密性, 完整性和可用性 [P2]
- 机密性 (congfidentiality): 避免未授权信息的泄露, 涉及数据的保护 (加密, 身份验证, 授权, 物理安全等)
- 完整性 (integrity): 不能以未授权的方式改变信息的属性
- 可用性 (avaliability): 对任何授权用户都可以及时地访问和修改信息
[IMP] A.A.A.: 保证, 真实性, 匿名 [P6]
- 保证 (assurance): 在计算机系统中如何管理和提供信任, 例如策略 权限 保护等
- 信任管理 (trust management)
- 软件工程
- 真实性 (authenticity): 能够确定由人或系统发布的声明, 策略, 权限等是名副其实的能力
- 通过数字签名实现
- 匿名 (anonymity): 不保存任何足够辨识的个人信息
威胁与攻击
类型: 窃听, 修改, 拒绝服务 (服务或信息访问的中断或退化), 冒充 (例如钓鱼), 抵赖 (对承诺或数据接收的否认, 是一种对于保证的攻击)
十大安全原则
- 机制的经济性
- 故障安全默认值
- 完全仲裁: 检查每一次访问是否满足保护方案
- 开放式设计: 安全只依赖于密钥的保密, 可由多方检查系统
- 特权分离
- 最小特权
- 最少公共机制: 多用户时共享机制最小化, 也就是尽可能独立
- 心里可接受: 接口和用户的预期一致
- 工作因素: 绕过安全机制的代价应与攻击者的资源相比较
- 大概是类似 workload factor 的意思, 就是说复杂度要合适, 不能过度保护
- 记录危害
[IMP] 1.2 四种访问控制模型的优缺点 [P11]
最小权限原则: 限制用户只能访问或修改与他们相关的信息
- 访问控制矩阵 (Access Control Matrix)
- 每一行是主体 (用户, 组, 或者可以执行操作的其他实体)
- 每一列是客体 (文件, 目录等需要定义访问权限的其他任何实体)
- 单元格中为权限, 例如读 写 执行等
- 优点
- 快速直接确定任何主体-客体的访问控制权限
- 简单直观
- 缺点
- 矩阵可能很大
- 访问控制列表 (ACL, Access Control List)
- 以客体为中心, 每个客体拥有一个列表, 记录了所有对该客体拥有访问权限的主体
- 类似将矩阵按照列拆分
- 优点
- 大小较小 (尤其是和访问控制矩阵相比)
- 对安全的系统, 可以将 ACL 保存为客体的元数据
- 缺点
- 除了遍历客体, 否则无法从主体查询该主体的所有访问权限
- 权能 (capablity)
- 以主体为中心, 记录该主体拥有访问权限的客体
- 类似将矩阵按照行拆分
- 优点
- 大小较小
- 缺点
- 没有与客体直接关联
- 基于角色的访问控制 (RBAC, Role-Based Access Control)
- 管理员定义角色, 然后指定角色的访问控制权限 (而不是直接指定主体的)
- 然后将主体分配到不同的角色 (可以是多个角色)
- 角色间可以有层级结构
- 优点
- 记录的规则总数少, 效率高
- 缺点
- 现有操作系统尚未实现
[IMP] 1.3 加密的概念 [P16]
加密
允许双方在不安全的通道上建立保密的通信, 即进行明文和密文间的可逆变换
加密和解密使用相同密钥的方案称为对称密码系统或共享密钥密码系统, 例如 AES, DES 等 (密钥较短, 速度较快)
公钥密码系统: 使用公钥加密, 使用私钥解密; 公钥公开, 私钥解密, 例如 RSA (密钥较长, 速度较慢)
数字签名
利用公钥密码系统, 可以将消息 和私钥 作为解密算法的输入, 然后将解密算法的输出和公钥 作为加密算法的输入得到消息 . 任何拥有私钥的人都可以做到这点.
由此, 若作者 A 欲证明其为消息 的作者, 可以先使用私钥 对消息解密, 得到的 即为 M 的数字签名. 接收者可以使用 A 的公钥 再次加密 S, 如果正确则应当得到 M. 由于只有 A 拥有私钥 , 因此接收者可以确定 M 的作者一定为 A.
这种方法的唯一缺点: 签名和明文至少等长, 无法实用
加密散列函数
不知道为啥要加个加密, 注意散列函数不是加密, 因为散列不可逆
散列函数: 单向的, 不可逆, 即不能由输出倒推输入
对某信息产生的散列值也称作摘要 (digest), 摘要一般都比原消息要短. 通过对消息的摘要进行数字签名更加高效, 而且可以防止中间人攻击 (MITM Attack) 和篡改 (很难找到两个摘要一样的信息)
消息认证码 (Message Authication Code, MAC): 可以对通过不安全信道交换的信息提供完整性保护
数字证书
数字证书: 由证书颁发机构 (Certificate Authority, CA) 颁发, 能将公钥和公钥拥有者的身份信息绑定在一起.
为了验证证书本身的可信性, 证书本身带有对自己的数字签名, 我们也需要保存 CA 的公钥用来验证.
1.4 可用性 密码 字典攻击原理 社会工程学
可用性
安全解决方案应该是高效的, 因为用户不喜欢慢的系统
[IMP] 密码及字典攻击原理 [P27]
字典攻击: 大多数容易记住的密码属于一个很小的集合, 因此可以通过收集常用的密码作为尝试的集合进行枚举
社会工程
利用人们内心的弱点攻破安全解决方案.
- 假托: 伪装成另外一个人
- 诱饵: 例如散布免费但装有攻击程序的 U 盘等
- 相等补偿 (对等交换): 利用不想白占便宜的心理
Chapter 2 物理安全
弹子锁
上下弹子在同一直线上, 但并没连接在一起. 通过钥匙让所有上下弹子中间的缝隙对齐即可开锁. 详细的看书.
电子密码锁
通过使用电磁铁或电机来操作锁, 开锁信号可由电子密码, 磁条卡, 智能卡, RFID标签, 生物识别等给出.
常用的身份验证技术
条形码: 一维的和二维的 (条的和方的)
磁条卡: 三条磁道 (分别是个人信息, 卡号以及未使用), 可以被直接复制
智能卡: 可以内带芯片, 便宜的可能只有存储器, 可能通过差分功耗分析泄露密钥 (不同操作消耗的功率不同)
SIM 卡: Subscriber Identity Module Card, 客户识别模块卡, 用于手机的智能卡, 标识了用户的身份和联系方式
RFID: 无线射频识别, 自带一个线圈作为天线, 可用于商品标签或护照等, 可使用跳码进行认证
生物特征识别: 特征需要满足普遍性, 独特性, 永久性和可收集性, 通过将特征量化为特征向量并和预先存储的参考向量比较完成识别
[IMP] SIM 卡安全及挑战响应协议
- 手机向本地基站发送 IMSI (国际移动客户身份, International Mobile Subscriber Identity)
- 基站检查数据库是否存在该 IMSI, 若存在则向手机发送128位随机数
- 手机使用存储在 SIM 卡中的 128 位密钥对随机数加密, 算法为 A3, 密文发送回基站
- 基站执行相同的计算, 若两个密文匹配, 则验证成功
- SIM 卡通过 A8 算法生成 64 位密钥
- 此后所有的数据交换使用 A5 算法加密
A3 A5 A8 均为非公开的算法 (违背了开放式设计的原则), 较旧的 SIM 卡通过 COMP128-1 实现它们, 但均已被逆向工程攻破; 新版的称为 COMP128-2, 尚未被攻破
针对计算机的直接攻击
- 环境攻击和事故: 电力, 温度, 短路 (水灾)
- 窃听: 搭线窃听 (光纤可以抵御)
- 射频辐射: 利用逸散的电磁波
- 光辐射
- 声音辐射: 例如按键声
- 硬件键盘记录器: 连接在键盘和计算机之间, 复制键盘输入的内容
针对 ATM 的攻击
- 黎巴嫩圈套: 将薄膜套插入卡槽, 欺骗客户发生了吞卡
- 分离器: 在卡槽上增加复制装置, 复制客户的卡片
Chapter 3 操作系统的安全
进程的安全
- 从开始到结束的传递信任
- 监控, 管理和日志: 事件日志, 进程查看器等
内存和文件系统的安全
- 虚拟内存的安全: 虚拟内存保存了内存的信息, 但位于外部的硬盘上
- 身份验证: 盐的概念, 原理
- 原理: 引入与用户ID相关的随机数作为哈希函数的输入值来增加搜索空间的大小
- 方法: 存储用户ID, ID 的盐值, 密码和盐值整体的哈希值
[IMP] 应用程序安全 [P97]
- DLL 注入: 使用动态链接的程序依赖外部的动态链接库 (dll或者so文件), 因此可以通过共享库向程序注入代码
- 算术溢出: 利用补码表示时, 负数过小可能会溢出为很大的正数
- 缓冲区溢出攻击: 利用向长度限制不受检查的缓冲区写入大量数据来覆写内存, 进而修改代码或获得控制权限
- 栈溢出 (覆写返回地址或在栈中插入指令串 (常称为 shellcode))
- NOP 指令滑动
- 返回到 libc (利用加载的 libc 库中的函数进行攻击)
- 堆溢出
- 格式化字符串攻击 (只给 printf 函数提供格式化字符串这一个参数, 这样它会把栈上的数据作为其余的参数, 原理见 x86 栈帧)
- 竞争条件
Chapter 4 恶意软件
内部攻击的基本方式
- 后门: 程序中隐藏的功能或命令
- 逻辑炸弹: 根据特定的条件触发而已操作
- 防御方式
- 避免单点故障, 不只让一个人负责重要系统
- 代码交叉检查
- 归档, 日志和报告
- 限制权限和授权
- 物理安全
- 监控员工与机器的行为
[IMP] 计算机病毒, 木马和蠕虫 [P120]
- 病毒四个阶段: 潜伏, 繁殖, 触发, 行动
- 病毒类型
- 文件病毒 (程序病毒): 修改文件包含的对象代码
- 宏病毒 (文档病毒): 利用编辑器的宏功能, 当打开文档时启动病毒, 可以感染其他文档
- 引导区病毒: 修改引导区的代码, 这样每次系统启动或重启时都会运行病毒
- 病毒防御
- 特征码: 计算已知病毒的数字指纹, 然后对所有文件进行模式匹配
- 检测与隔离
- 木马: 表面上执行有用的任务, 但会隐形地执行攻击任务
- 蠕虫: 不是计算机病毒, 不会感染其他程序, 通过传播自己的副本来扩散
Rootkits
- 特别的, 隐形的恶意软件
- 通过修改系统程序或系统本身来防止检测
- 例如使用钩子函数 (修改特定的函数)
- 可以通过对系统文件进行校验来检测
零日攻击
就是经常看到的 0-day attack
- 利用此前未知或未公开的脆弱性进行攻击
- 特征码不能识别, 需要启发式的检测方法
僵尸网络
- 大量的被恶意软件控制的计算机组成的网络
入侵隐私软件
- 目标是用户的隐私或其他有价值的信息
- 例如广告软件, 间谍软件等
[IMP] Chapter 5 网络安全 I
互联网的分层
IP 的五层和 OSI 的七层, 直接看计网的图
以太网的概念
既是指所用的物理介质 (通常来说是线缆), 也指链路层协议标准 IEEE 802.3
[IMP] ARP 欺骗 [P155]
ARP 概念见 计网复习-ARP
对于攻击目标的 ARP 请求, 如果我们能够在真正的目标计算机回应前抢先回复自己的 MAC 地址, 就可以修改攻击目标的 IP-MAC 映射表, 进而截获它的数据包, 由此可以进行中间人攻击.
- 利用的 ARP 协议无身份验证的缺陷
- 可用静态 ARP 表防御 (提前指定好 IP-MAC 映射关系)
[IMP] IP 协议与 ICMP 协议 [P157]
IP 协议:
- 在网络层
- 尽力转发
- 存在子网掩码的概念
ICMP 协议:
- 网际控制消息协议
- 主要用于网络诊断消息
- 包含回显请求, 回显响应, 超时 (到达 TTL 限制, 数据包已不能继续传递), 目的不可达等
- ping, tracert 依赖 ICMP 协议
[IMP] IP 地址欺骗 [P161]
- 操作系统基本都提供了使用任意 IP 头信息发送报文的接口
- IP 欺骗时, 发起者不能直接接收到返回的报文
- 因为他的 IP 地址是伪造的
- 不过对于一些场合, 例如拒绝服务攻击没啥影响, 因为这时我们也不关心返回的内容
- 可以通过配置路由器来阻止
- 例如阻止转发源地址在域内, 但实际地址在域外的数据包
数据包嗅探
- 由于大多数 IP 数据包没有加密, 因此可以进行嗅探 (获得同一网络下的流量)
- 网络接口在混杂模式下运行时, 会保留所有的帧而不检查 MAC 地址
- 使用交换机缩小网段可以缓解嗅探攻击
传输层协议
TCP:
- Transmission Control Protocol, 传输控制协议
- 有流量控制, 通过滑动窗口协议实现
- 有拥塞控制
- 连接有状态, 有重传
UDP:
- User Datagram Protocol, 用户数据报协议
- 无流量控制
- 无拥塞控制
- 连接无状态, 无重传
[IMP] TCP 会话劫持 [P168]
- 会话欺骗: 创建伪造的会话
- 尝试预测服务器给出的 SYN+ACK (第二次握手) 中的序列号, 然后作为 ACK (第三次握手) 的确认号, 并配合 IP 地址伪造
- 如果成功, 可以以受害者的 IP 地址的身份和服务器建立连接
- 由于初始序列号的产生是可预测的, 因此攻击是可能的
- 盲注入: 使用 IP 伪造, 无法接受回应, 但可以使用请求者的 IP 地址对应的身份执行命令
- ACK 风暴: 盲注入后双方会尝试同步, 会循环发送大量 ACK
- 完全会话劫持: 利用嗅探获取序列号, 可以配合 ARP 欺骗实现中间人攻击
[IMP] 拒绝服务攻击 [P170]
Denial of Service, DoS, 拒绝服务攻击
利用连接容量有限的特点, 发起大量连接使得服务器无法运行
可以配合 IP 地址伪造
[IMP] IP 地址回溯 [P175]
- 尝试确定数据包的真实来源 (因为源 IP 可能是伪造的)
- 利用数据包标记: 每个路由器都是概率性地 (或确定性地) 对数据包做出标记
- 这样, 若被最接近受害者路由器标记的概率为 , 则被上一层标记的概率应当为
- 通过比例递推可以确定路径
- 实际中能够实现的很少, 因为实际上是在网络层解决网络层的认证问题
想想也是, 这成功听起来就是概率性的
[IMP] Chapter 6 网络安全 II [P180]
[IMP] DNS 原理 [P183]
DNS, Domain Name System, 域名系统
- DNS 用来实现域名 (例如 www.example.com) 和 IP 地址 (
93.184.216.34
或者2606:2800:220:1:248:1893:25c8:1946
, 后者是 IPv6 地址) 间的映射- 后者到前者称为反向查询
- DNS 是分层的, 从上往下是根域名服务器, 权威域名服务器, 非权威域名服务器
- 查询过程 (以 www.example.com 为例, 递归方式):
- 首先, 客户端和自己保存的 DNS 服务器 S 查询 (通常是 ISP 分配的, 也可手动指定)
- S 检查缓存, 如果有且没过期直接返回, 否则开始递归查询
- S 首先向根域名服务器发送 DNS 查询, 得到 .com 的权威域名服务器的地址
- S 继续向 .com 的域名服务器查询 example.com, 得到 example.com 域名服务器的地址
- S 继续查询, 得到 www.example.com 的地址
- S 缓存这个来之不易的结果, 然后给客户端返回
[IMP] DNS 攻击 [P185]
- 将正确的域名指向错误的 IP 地址
- DNS 缓存中毒: 欺骗并使其缓存错误的结果
- 例如要针对 x.y 域名进行攻击:
- 首先对 DNS 服务器发送查询 x.y 的请求
- 利用 IP 地址伪造, 伪装成权威域名服务器的源地址, 向 DNS 服务器发送恶意的 IP 地址 p, p 是一个恶意的 DNS 服务器, 会把地址解析到钓鱼网站等
- DNS 服务器缓存了错误的结果, 现在对于 y 的请求都会被 p 操控
- 利用了 DNS 协议无身份验证的缺陷 (后来有了 DNSSec)
- 对客户端也可发动
- 例如要针对 x.y 域名进行攻击:
防火墙技术
- 防火墙对数据包的处理方式: 接受, 丢弃 (不允许通过且无失败指示), 拒绝 (不允许通过且有失败提示)
- 无状态防火墙: 只针对当前正在处理的数据包, 不维护任何上下文
- 开销小, 实现简单, 不能区分当前数据包是否是对前一个特定数据报的响应
- 有状态防火墙: 记录每个连接的信息
- 可以实行更严格的管控, 可以实现深度数据包检测
[IMP] 隧道 [P195]
- 在客户端和服务器端自动加解密
- 不需要修改应用程序
- 增加了 IP 协议栈的开销
[IMP] 安全的 Shell [P196]
Secure Shell, SSH, 即安全的 Shell
- 建立了一个安全的隧道
- 建立方式:
- 客户端通过 TCP 连接到服务器, 交换连接信息 (加密算法, 协议版本等)
- 进行密钥交换, 创建共享的秘密会话密钥 (注意不是加密算法), 并加密之后所有的通信 (通常用块加密, 例如 AES, Blowfish 等)
- 服务器向客户端发送可接受的身份验证方法, 客户端进行尝试
- 如果是公钥认证, 客户端向服务器发送自己保存的公钥
- 服务器检查该公钥是否在自己存储的已授权的密钥列表中
- 如果不在则要求客户端换个公钥 (这个公钥不是对这台服务器的)
- 如果在, 则使用公钥加密挑战 (一个随机的字符串)
- 客户端使用私钥解密挑战, 并向服务器返回响应
- 若两者结果一致, 则身份验证成功, 服务器允许客户端访问
[IMP] IPSec [P197]
- 配合 IPv6, 但是 IPv4 也可使用
- 两种模式: 传输模式, 隧道模式
- 传输模式: 在原数据包的有效载荷前插入 IPSec 头信息, 只对有效载荷进行加密或验证
- 隧道模式: 构建新的数据包, 将 IPSec 头信息和整个原数据包作为新数据包的有效载荷
- 常用于创建 VPN
虚拟专用网络
Virtual Private Network, VPN
- 远程访问 VPN: 允许在互联网另一端的用户访问内网
- 站点到站点的 VPN: 安全地桥接两个网络
- 结合隧道技术, 可以对数据进行封装与加密, 避免防火墙的检测
- 但防火墙仍然可以直接阻断
入侵检测
入侵检测系统, IDS, Intrusion Detection System
- 实时地检测威胁
- 传统的网络入侵检测: 位于边界, 基于流量和内容
- 基于协议的入侵检测系统: 专门检测特定协议的恶意行为
- 基于主机的入侵检测系统: 检测单个主机上的活动
- 存在误报和漏报
Chapter 7 Web 安全
网络钓鱼
- 利用用户不会仔细检查网页的特点, 创建与真实页面十分相似的虚假页面
- 伪造的 URL 一般与真实网站不同 (除非对 DNS 或缓存进行攻击), 但十分相似 (利用 Unicode 中相似的字符) -> URL 混淆
- 点击劫持: 看上去是 A 的超链接, 但实际指向 B
- 利用媒体内容的脆弱性 (例如 Flash, ActiveX 控件 和 Java Applet)
[IMP] XSS (跨站脚本) [P239]
cross-Site Scripting, XSS
- 通过未经过滤的输入向网站上注入代码
- 利用 JavaScript
- 持久性 XSS: 攻击者注入的代码会在网站上保留一段时间, 且对其他用户可见
- 非持久性 XSS: 注入的代码不会持久保留
- 可以窃取用户的 Cookie, 重定向到恶意网站等
- 通过过滤和检测可以防御
跨站请求伪造
CSRF, Cross-Site Request Foegery
- 利用网站信任的特定用户
- 让受害者在不知情的情况下在恶意网站上执行命令, 然后恶意网站向受攻击的网站发送恶意请求
[IMP] SQL 注入 [P251]
- 利用拼接 SQL 查询时不对某些字段的值进行校验的漏洞, 构造能获取 (或修改) 其他信息的查询
- 可以删库跑路, 还可以绕过身份验证
- 可以检查输入是否为合法的值, 并去除危险字符 (例如引号和斜杠等) 来防御
Chapter 8 加密 (密码学概述)
对密码系统攻击的类型
- 唯密文攻击: 已拥有一个或多个使用相同的密钥加密的密文
- 已知明文攻击: 已拥有一个或多个使用相同的密钥的明文-密文对
- 选择明文攻击: 可以选择一个或多个明文, 根据相同的密钥得到各自对应的密文
- 离线选择明文攻击: 必须事先选择好所有的明文
- 自适应选择明文攻击: 可以以迭代的形式逐个选择明文
- 选择密文攻击: 选择一个或多个使用相同密钥得到的密文, 得到各自对应的明文
- 同样有离线和自适应的版本
替换密码和频率分析
- 替换密码: 将每个字母按规律替换为其他字母
- 例如凯撒密码
- 若替换单位是字母组, 则为多字母替换密码, 替换规律称为替换盒, 或称 S 盒
- 维吉尼亚密码: 利用密钥决定不同字母替换时的偏移量
- 例如密钥为
XYZ
, 则分别用X
Y
Z
三行的偏移量进行替换 - 同样是替换密码 (相当于按照密钥长度分段, 段内的不同字母间是偏移量不同的凯撒密码, 但段间偏移量的模式相同)
- 如果密文中出现了相同的模式, 则根据重复部分间隔的长度可以推断出可能的密钥长度, 进而按照凯撒密码进行破解
- 例如密钥为
- 频率分析: 不同字母在文本中出现的概率通常不等
一次一密 (OTP)
OTP, One-Time Pad, 一次性密码本 (注意不是一次性密码 Password, 这是不同的概念)
- 如果能做到以下两点, 则无法进行频率分析
- 密钥块的长度与明文长度相等 (单次加密不需要反复循环使用同一个密钥)
- 每次的偏移量完全随机, 即密钥不重复
- 这就是一次性密码本
- 弱点: 必须要求密钥完全不重用
分组密码
Block Cipher, 也称作块密码
将明文划分为固定大小的分组 (如果最后一个分组长度不够, 通常会用特定算法补齐, 例如PKCS5
, PKCS7
等), 然后对分组进行操作
AES 算法
AES, Advanced Encryption Standard, 高级加密标准
- 是分组密码, 分组大小固定为 128 位
- 密钥长度可以是 128, 192 或者 256 位
- 一共有十轮处理, 每轮包含四步:
- S-盒替换
- 置换 (移动行)
- 矩阵乘法 (打乱列)
- 使用从密钥派生的轮密钥进行异或
- 为了加速计算, 使用了查找表实现从字节到整数的映射
- 存在定时攻击的可能: Cache 会保存存储表中使用了的表项, 这时访问这些表项比访问不在 Cache 中的快
- 可以让 AES 的执行时间固定来防御定时攻击
- 仅有旁路攻击 (侧信道攻击) 是对 AES 的实际攻击
分组密码的操作模式
- 电子密码本模式 (ECB): Electronic CodeBook mode
- 对每个分组进行独立加密
- 优点: 简单, 可允许分组丢失
- 缺点: 相同的分组加密后的内容相同, 分组数量较多时会泄露明文的模式
- 密码分组链接 (CBC): Cipher-Block Chaining mode
- 第一个分组先和初始化向量 (Initialization Vector, IV) 异或, 然后再加密; 此后的每一个分组先和上一个分组的密文异或再加密
- 优点: 不会泄露明文的模式, 可允许分组丢失
- 缺点: 必须顺序加密 (但是可以并行解密, 因为异或依赖的是密文)
- 密码反馈 (CFB): Cipher FeedBack mode
- 类似 CBC, 但是先加密前一个密文, 然后再和这个明文分组异或作为密文
- 优点: 比 CBC 快
- 输出反馈 (OFB): Output FeedBack mode
- 从初始化向量开始, 加密后作为下一个向量; 每一级的明文和对应的向量异或作为密文
- 优点: 能容忍密文丢失, 如果能有向量序列则加解密均可并行
- 计数器模式 (CTR): CounTeR mode
- 类似 OFB, 从一个随机种子 s 开始, 第 i 个偏移向量是 , 明文和向量异或后作为密文
- 优点: 向量的生成和加解密均可并行, 可容忍分组丢失
流密码
- 将明文看作字符串或者二进制位串, 然后逐字符或逐位进行加密 (简单的异或即可)
- 为了防止密钥穷举, 使用和明文一样长的密钥流
- 重点在于如何从有限长度的密钥中产生任意长度的密钥流, 例如使用线性同余发生器
数论基础
辗转相除法 (欧几里得算法)
- 用来计算两个数 a b 的最大公约数 (GCD, Greatest Common Divisor)
- 原理: 两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数, 即
- 步骤:
- 设 a > b, 判断 是否成立
- 若否, 则让 , a 为 b 的初值
- 若是, 则 b 为 GCD
- 设 a > b, 判断 是否成立
费马定理和欧拉定理
- 费马小定理: 设 p 为素数, g 为小于 p 的任意正整数, 则
- 欧拉定理: x, n 为任意正整数, 且互质, 则
- 称作欧拉函数, 它的值等于 “不大于 n 的范围中的素数的个数”
- 欧拉定理是费马小定理的扩展
RSA 算法
- 密钥产生:
- 公钥: 选择两个大素数 p q, 令 , 选择一个和 互质的数 e, 计算 , 则公钥为 对
- , 其中为 n 的质因子
- n 的二进制长度即为位数, 通常为 1024 或者 2048 位
- 实际中 e 常取值 65537
- 私钥: 对为私钥
- 公钥: 选择两个大素数 p q, 令 , 选择一个和 互质的数 e, 计算 , 则公钥为 对
- 加密过程: 设明文为 M, 密文为 C, 则
- 解密过程:
散列函数 (哈希函数)
- 将输入 (通常称为"消息") 映射到固定长度的输出字符串, 同时提供确定性, 单向性和抗冲突性
- 抗冲突性: 由于输出长度可以大于输出长度, 所以必定存在冲突
- 强抗冲突性: 很难构造两个不同的输入, 使得输出一样
- 弱抗冲突性: 很难构造一个输入, 使得输出等于一个已知的输入的输出
- 存在针对 MD5 的攻击, 对于两个不同的输入可以构造两个后缀, 使得两组 (消息+后缀) 的哈希值一样
生日攻击
- 用来攻击哈希函数
- 对于输出为 b 位的哈希函数 H, 可能的输出有 种
- 但如果生成大量的随机消息并计算散列值, 则找到两条散列值一样的消息实际上和两个人生日一样的原理相同
- 所以尝试的消息数可以降低到
- 因此, 通常根据输出大小的一半来考虑加密散列函数的安全, 例如输出为 256 位的 H 安全性是 128 位
具体来说, 对于输出为 b 位的哈希函数 H, 可能的输出有 种
则攻击者生成的第 i 个消息与前面 条消息冲突的概率为 $$1-\frac{i-1}{m}$$
在 k 轮后, 仍然没有冲突的概率为 $$F_k = (1-\frac{1}{m}) + (1-\frac{2}{m}) + \dots + (1-\frac{k-1}{m})$$
考虑到 , 则 $$F_k \approx e ^{-(\frac{1}{m} + \frac{2}{m} + \dots + \frac{k-1}{m})} = e^{\frac{k(k-1)}{m}}$$
, 即成功概率达到一半时, 代入上式得 $$k \approx 1.17 \sqrt{m}$$
而 的二进制位数是 , 也就是输出位数的一半, 证明了生日攻击的存在
消息认证码
消息认证码, Message Authentication Code, 和 MAC 地址没关系
- 确保不安全信道所传输的消息的完整性和机密性
- 普通的哈希函数不能直接用作消息认证函数
- 设密钥为 K, 消息为 M, 将 (K||M), (M||K), (K||M||K) 作为输入都是不安全的
- 基于哈希函数的消息认证码 (HMAC) 可以解决
- , 其中 A B 为常数
- 安全性等价于底层使用的哈希函数 H 的安全性
- 哈希链: 从随机数 r 开始重复进行密码学哈希计算
- 得到的序列是伪随机的
- 可用作一次一密的密码 (One Time Password)
- 推广可得哈希树
- 验证链: 作为增量数据的验证方案
- 设 x 为认证码, ,
- 首先传输签名
- 然后传输数据包 , P 为信息, 每个数据包包含下一个包的哈希值
- 每个哈希值的完整性需要余下的哈希值作为保证
- 常数级开销 (每个明文一次哈希)
Chapter 9 安全模型与实践
Kerberos 架构
- 票据:
- 票据授予票据 (Ticket-Granting Ticket, TGT): 用户和会话密钥的全局标识符
- 服务票据 (Service Ticket): 对用户的请求进行验证, 确定用户能否使用特定服务
- 使用独立的, 受信任的第三方作为密钥分发中心 (Key Distribution Center, KDC), 包含两部分
- 身份验证服务器 (Authentication Server, AS), 保存着用户和服务密钥, 对用户提供的密码进行哈希得到用户的密钥
- 票据授予服务器 (Ticket-Granting Server, TGS)
- 两部分独立
- 旨在对整个网络进行集中的身份验证, 即使 KDC 被入侵用户密码仍然保密 (只保存了密码的哈希)
Kerberos 身份验证
- 除了最开始的请求没有明文信息, 不过这个请求本身也不包含敏感信息
- 所有的票据都有时间戳, 可以抗重放攻击
- 优点: 在不安全的网络中仍然安全, 抗重放攻击, 使用对称加密 (更高效)
- 缺点: 存在单点故障的可能 (KDC 挂了整个系统就无法工作了), 需要同步时钟 (票据都有时间戳)