前言

这次学习是因为该课程布置了第一次作业,所以需要补充学习一下遗漏的内容。由于这门课是本研共修课程,在开学第一周本科生们就已经选好课并且开始上课了,但是我们新入学的研究生从第三周才能选好课并开始上课。这导致我最终其实第四周左右才选上这门课,所以遗漏了前面的很多内容,上课时感到很不连贯也就没有细听了,最终决定采用根据PPT自学的形式来完成这次布置的第一次作业。

Lec01 Intro

Ethics

  • 通常可以闯入自己的系统
    • 这是评估自己系统的好办法
  • 在获得他人明确许可的情况下,通常可以闯入他人的系统
  • 未经许可闯入他人的系统是不道德且犯罪的

系统失效的原因:

  • Reliability:意外故障
  • Usability:因用户操作错误而引起的问题
  • Design and goal oversights:设计过程中的疏忽、错误和遗漏
  • Security:他人故意造成的故障

Security VS. Correctness:

  • System correctness:

    • 系统满足规范

    • 对于合理输入,获得合理输出

  • System security:

    • 在面对攻击时保留系统属性

    • 对于不合理的的输入,输出不完全错误

主要区别:主动干扰

Course Overview

  • 如何考虑安全和隐私
    • “Security Mind” ——一种思考系统的全新方式
    • Security Principles
  • 安全和隐私的技术方面
    • 漏洞和攻击技术
    • 防御技术
    • 如何构建具有强大安全属性的计算机系统
    • 如何衡量当今技术提供的保护和限制
    • 攻击在实践中的工作原理
  • 主题包括
    • 基本密码学
    • 认证
    • 密钥管理
    • 可用安全性(人工身份验证)
    • 网络安全
    • 数据安全和隐私
      • 匿名和差分隐私
      • 联邦学习
    • Emerging Technologies 的安全
      • ML的安全性
      • 自动驾驶汽车的安全性

Lec02 SecBasics

Objects

Confidentiality(保密性)

  • Confidentiality 是信息的隐瞒
  • Data Confidentiality:确保私人或机密信息不会提供给或披露给未经授权的个人
  • Privacy:确保个人控制或影响哪些和他们有关的信息被收集,以及这些信息会被谁以及向谁披露

Integrity(完整性)

  • Integrity 是防止未经授权的更改
  • Data Integrity:确保数据和信息仅以指定和授权的方式进行更改
  • System Integrity:确保系统以不受损害的方式执行预期功能,不受故意或无意的未经授权的操作对系统执行

Availability(可用性)

  • Availability 是使用信息或资源的能力
  • 确保系统迅速工作,并且不会拒绝向授权用户提供服务

Thread Modeling

Assets:我们要保护什么?这个资产有多少价值?

Adversaries:(对手)谁可能会尝试攻击,为什么?

Vulnerabilities:系统可能多么薄弱?

Threats:攻击者可能会采取哪些措施来利用漏洞

Risk:资产有多重要?漏洞利用的可能性有多大?

Possible Defenses:

  • 不是“传统的”威胁建模,但很重要(无论是整个过程,还是为了在帮助威胁建模之前更好的了解系统)
  • 好处:系统可能会使谁受益,以及如何受益
  • 危害:系统可能会伤害谁,如何伤害

没有完美的安全,但是攻击者的资源有限。**让他们付出不可接受的代价/承担不可接受的风险来取得成功!**根据上下文来定义安全。

Security Principles

安全原则

Know Your Threat Model
Security is Economics
Secure the Weakest
Defense in Depth
Use Fail-Secure Defaults
Least Privilege
Compartmentalization
Hard to Hide Secrets
Separation of Responsibility
Minimize Attack Surface
Have Good Usability
Detect if You Can’t Prevent
Design in Security from the Start

Principle 0: 了解您的威胁模型

攻击者是谁以及他们拥有哪些资源

Principle 1: 安全就是经济

  • 防御成本应低于发生攻击的成本

  • 安全性越高(通常)成本越高

  • 如果攻击的成本高于奖励,攻击者可能不会这样做

Principle 2:保护最弱者

  • 安全是一个链条:系统的安全性取决于最薄弱的环节。

  • 将精力花在提高系统最薄弱部分的安全性上,因为这是攻击者攻击的地方。

Principle 3:纵深防御

  • 攻击者只需要在一个地方获胜

  • 防守方的回应:深度防御

  • 应将多种类型的防御措施分层在一起

    • 如果一个层失败,希望另一个层可以成功。
  • 保护最弱者并深度防御

    • 保护最薄弱的环节适用于非重叠函数
    • 纵深防御适用于同一功能

层(Layers)

  • 计算机系统有多个层

    • 硬件组件

    • 芯片组 / MB

    • OS

    • TCP / IP

    • HTTP 应用程序

    • 安全 http 层

    • Javascript

    • 用户/智能卡接口

多层防御

  • 每一层都引入了额外的安全措施
  • 每个层可以包含多个级别的控制

但是要记住

  • 防御不是免费的
  • 收益递减:防御通常小于其各部分的总和
    • 2 堵墙比 1 堵墙好得多
    • 101 堵墙并不比 100 堵墙好多少

Principle 4:使用 Fail-Secure 默认值

当系统出现故障时,它们不应恢复到不安全的行为。否则,攻击者只需要调用正确的失败。(故障安全系统)

默认为deny access,比如默认执行 false,只有判断安全才会执行true。

Principle 5:最小权限

只应授予执行操作所需的最低访问权限,并且应仅授予该访问权限所需的最短时间。

当代码可能执行的系统范围操作受到限制时,一个应用程序中的漏洞不能用于利用系统的其余部分。

Principle 6: Compartmentalization

  • 将系统分解为尽可能多的独立单元
    • 通过将系统分解成多个单元来最大限度地减少可能造成的伤害
  • 很少有操作系统这样做,因为它难以管理
  • 使用不同的机器执行不同的任务

Principle 7: 难以隐藏secret

  • “机制的安全性不应取决于其设计或实施的保密性。”

  • “即使关于系统的所有内容(除了密钥)都是公共知识,加密系统也应该是安全的。”

                             ——Kerckhoff’s Principle

Principle 8: 责任分离

  • 也称为分布式信任

  • 如果您需要拥有特权,请考虑要求多方合作(串通)以行使该特权

Principle 9: 最小化攻击面

  • 最小化
    • 打开的插槽数量
    • 服务数量
    • 默认运行的服务数量
    • 以高权限运行的服务数量
    • 动态内容网页数
    • 具有管理员权限的帐户数
    • 访问控制较弱的文件和目录数量

Principle 10: 具有良好的可用性

  • 了解您的用户

    • 如果太麻烦,他们会关闭安保。
    • 他们不阅读文档
    • 他们无视警告 – 他们只想得到他们想要的!
  • 如果您的安全机制太烦人和痛苦,您的用户将不遗余力地规避或避免它们。确保您的安全系统达到所需的安全性,但仅此而已。

Principle 11: 如果无法预防,则进行检测

  • 威慑:通过让攻击者更喜欢执行其他操作来阻止攻击
  • 预防:通过使攻击失败,在攻击发生之前阻止攻击
  • 检测:了解存在攻击(发生后)
  • 响应:对攻击执行一些操作(在攻击发生后)

Principle 12: 从一开始就进行安全设计

在构建新系统时,请将安全性作为设计注意事项的一部分,而不是在事后对其进行修补。

Lec03 Cryptography Concepts 1

Unconditional vs. Computational Security

  • 无条件(或“信息论”)安全性
    • 无论有多少计算机能力可用,密码都无法破解
    • 密文提供的信息不足以唯一地确定相应的明文
  • 计算安全性
    • 破解密码的开销超过加密信息的值
    • 破解密码所需的时间超过了信息的有效生存期
    • 我们将看到的大多数现代方案都被认为是计算安全的

Basic Cryptography Terminology

  • Plaintext – 原始消息

  • Ciphertext – 编码消息

  • Key – 只有发送方/接收方知道的密码中使用的信息

  • Encryption– 将明文转换为密文

  • Decryption – 将密文转换为明文

  • Cipher – 用于执行加密 (encipher) 或解密 (decipher) 的算法

Cryptosystems

  • 用于将原始信息转换为密文的操作类型
    • 二进制算术: 移位, XORs, ANDs, etc.
      • 传统/对称加密
    • 整数算术
      • 公有密钥/非对称加密
  • 使用的密钥数量
    • 对称或传统的(使用单一密钥,Key_A = Key_B)
    • 非对称密钥或公钥(2个密钥,一个用于加密,一个用于解密)
  • 原始信息的处理方式
    • 一次一个比特位——“流密码算法”
    • 一个位块——“块密码算法”

Cryptography Roadmap

对称密钥 非对称密钥
保密性 One-time pads
Stream ciphers
Block ciphers with chaining
modes (e.g., AES-CBC)
RSA encryption
完整性,身份验证 MACs (e.g., HMAC) Digital signatures
- Hash functions - Public key exchange (e.g., Diffie-Hellman) - Key management (certificates, PKI) - Password management - Authentication protocols

Symmetric Key Cryptography

对称密钥加密方案有三个算法:

  • KeyGen() → K:生成一个密钥 K
  • Enc(K, M) → C: 使用密钥 K 加密明文 M,生成密文 C
  • Dec(K, C) → M:使用密钥 K 解密密文 C

我们希望对称加密方案具有哪些属性?

  • 正确性:解密密文应生成最初加密的消息
  • 效率:加密/解密算法应该很快
    • 给定明文和密钥,计算密文的计算效率很高。
    • 给定密文和密钥,计算纯文本的计算效率很高。
  • 安全性:保密性
    • 给定没有密钥的密文,计算纯文本在计算上是不可行的。

对机密性更好的定义叫做 IND-CPA (indistinguishability under chosen plaintext attack),在选择明文攻击下的不可区分性。

Classical Ciphers

  • 替换密码(也称为“单字母密码”)
  • Playfair 密码(普莱费尔密码)

替换密码

  • 替代密码用于加密普通英语文本。
  • 加密和解密规则都是字母字符的排列。
  • 攻击使用 26 个字母及其组合出现的概率。

Playfair 密码

一次加密两个字母

  • 如果一对是重复的字母,请插入填充物,例如 “x”。
    • 例如,“balloon” 中断为 “ba lx lo on”
  • 如果两个字母位于同一行中,请将每个字母替换为向右的字母(从末尾向后换行以开始)。
    • 例如,“ar” 加密为 “RM”
  • 如果两个字母都在同一列中,请将每个字母替换为其下方的字母(再次从底部换行到顶部)。
    • 例如,“mu” 加密为 “CM”
  • 否则,每个字母将替换为对中另一个字母的列中其行中的字母。
    • 例如,“hs” 加密为 “BP”

One-Time Pad (OTP):

Encryption: 𝐶 = Enc(𝐾, 𝑀) = 𝑀 ⨁ 𝐾 Decryption: Dec(𝐾, 𝐶) = 𝐶 ⨁ 𝐾 = (𝑀 ⨁ 𝐾) ⨁ 𝐾 = 𝑀

密钥 K 是随机选择的 bitstring。

如果对两个密文进行 XOR 运算,就会学习到 M_0 ⊕ M_1!这是有关消息的部分信息!攻击者可以猜M_0并检查M_1是否与她的猜测相符,反之亦然。因此如果密钥被重复使用,则One-Time Pad不安全。

唯一实际应用:提前传达密钥,这样密钥只会用到一次。

Stream Ciphers(流密码)

问题:OTP 密钥与信息的长度相同

解决方案:Pseudo random key - stream ciphers(伪随机密钥 - 流密码)

𝐶 ← PRG(𝐾) ⊕ 𝑀

Block Ciphers(分组密码)

用于加密固定大小的位块

  • 分组密码是一种替代密码。

    • 每个块都可以被视为一个巨大的字母。

    • “字母表”由 2N个巨大的字母组成。

  • 每个特定的密码都是从纯文本 “alphabet” 到密文 “alphabet” 的一对一映射。

    • 有 2 N个这样的映射。
    • 密钥指示要使用哪一个映射。

Feistel Cipher Structure

几乎所有传统的块加密算法(包括 DES)都具有由 IBM 的 Horst Feistel 于 1973 年首次描述的结构。

输入:一个数据块和一个密钥

将数据块分为两半 L 和 R。

经历几轮。在每一轮中,

  • R 不会改变。
  • L 执行依赖于 R 的运算和从该密钥派生的round key。

Feistel 网络的具体实现取决于以下参数和功能的选择:

  • 区块大小:区块大小越大意味着安全性更高
  • 密钥大小:密钥大小越大意味着安全性越高
  • 回合数:多个回合提供更高的安全性
  • 子密钥生成算法:复杂性越高,密码分析难度越大

DES (Data Encryption Standard)

1970 年代/80 年代/90 年代使用最广泛的分组密码。块大小 64 位 (n = 64);密钥大小 56 位 (k = 56)

但是,由于密钥大小小,现代计算机速度使其完全不安全

Avalanche Effect(雪崩效应)

纯文本或密钥中的微小更改会导致密文发生重大变化。

完备性效果:密文的每个 bit 都需要依赖明文上的很多 bit。DES 中 D-box 和 S-box 产生的扩散和混淆,表现出非常强的完备性效果。

2DES

考虑具有两个密钥的 2DES:

𝑐 = EK2(EK1(𝑚))

𝑚 = DK1(DK2(𝑐))

3DES with 2 Keys

𝑐 = EK3(EK2(EK1(𝑚))) In practice: 𝑐 = EK3(DK2(EK1(𝑚)))

Symmetric Key Cryptography:

Advanced Encryption Standard (AES)

  • 密钥大小 128、192 或 256 位(k = 128、192 或 256)
    • 实际密码名称为 AES-128、AES-192 和 AES-256
    • 像 NSA 这样的偏执狂使用 AES-256 密钥,但 AES-128 在实践中很好
  • 块大小 128 位 (n = 128)
    • 注意:无论密钥大小如何,块大小仍始终为 128 位

AES 也有字的概念:一个字由四个字节组成,即 32 位。因此,state 数组的每一列都是一个单词,每一行也是如此。

不同的密钥大小使用不同的轮数

每一轮都使用自己的“轮次密钥”,该密钥派生自密码密钥

AES:整体结构

Block 密码只能加密固定大小的消息,如果我们想加密超过 128 位的东西怎么办?

为了解决这些问题,我们将添加使用Block 密码作为构建块的操作模式!