SDS_study

这张幻灯片的主题是“Cuestiones”(问题),其中包含了关于密码系统 (Criptosistemas) 和密钥空间 (Espacio de claves) 的讨论问题。
以下是幻灯片上列出的问题及其简要解释:
Criptosistemas (密码系统)
¿Serían seguros los esquemas de criptografía clásica en la actualidad? ¿Por qué?
- 翻译: 经典的密码学方案在当今安全吗?为什么?
- 简答: 不安全。 经典的密码学方案,如凯撒密码、维吉尼亚密码、希尔密码、甚至恩尼格玛机等,大多基于手工计算或简单机械原理。在如今计算能力极强的计算机面前,这些方案很容易通过暴力破解、频率分析、已知明文攻击等方式被破解。它们的密钥空间相对较小,或者加密算法的复杂性不足以抵抗现代密码分析技术。
¿Cuáles son las principales diferencias entre los algoritmos clásicos y los modernos basados en computación?
- 翻译: 经典算法和基于计算机的现代算法之间的主要区别是什么?
- 简答:
- 复杂性: 现代算法(如 AES, RSA, ECC)的数学和计算复杂性远超经典算法。它们设计得能够抵抗各种已知的攻击方法。
- 密钥长度和密钥空间: 现代算法通常使用非常长的密钥(例如,128位、256位甚至更长),这使得暴力破解几乎不可能。经典算法的密钥空间通常很小。
- 设计原则: 现代算法通常基于坚实的数学理论(如数论、离散数学),并且经过公开审查和标准化,而经典算法更多是基于巧妙的替换和置换。
- 自动化和速度: 现代算法设计用于计算机高效执行,能够处理大量数据,实现非常高的加密解密速度。经典算法通常需要大量体力劳动或低效的机械操作。
- 随机性: 现代密码学非常依赖高质量的随机数生成器(CSPRNG)来生成密钥、初始化向量等,以确保安全性。
- 安全性证明: 现代算法会有各种安全证明和形式化分析,而经典算法通常缺乏这些。
Espacio de claves (密钥空间)
¿Qué es más probable, ganar el euromillones o encontrar una clave de 128bit?
- 翻译: 赢得欧洲百万彩票和找到一个128位密钥,哪一个可能性更大?
- 简答: 赢得欧洲百万彩票可能性更大。
- 赢得欧洲百万彩票的概率: 大致为 1 亿 3 千 9 百万分之一(约 $1.39 \times 10^8$)。
- 找到一个128位密钥的概率: 这是一个 $2^{128}$ 的可能性。 $2^{128}$ 是一个天文数字,大约是 $3.4 \times 10^{38}$。
- 比较: $1.39 \times 10^8$ 远远小于 $3.4 \times 10^{38}$。所以,尽管赢得彩票的概率极低,但找到一个128位密钥的概率更是低到难以置信的程度,几乎不可能通过暴力破解实现。
¿Tiene algún sentido que se fije cierta posición al buscar un código o clave? (como aparece en muchas películas)
- 翻译: 在寻找代码或密钥时固定某个位置有意义吗?(就像许多电影中出现的那样)
- 简答:
- 在密码学意义上,通常意义不大: 在传统的密码分析中,例如使用已知明文攻击或频率分析,我们通常会尝试整个密钥空间或寻找算法中的弱点,而不是“固定”某个位置来寻找密钥。在密钥已知但需要解密一段密文时,我们通常不需要“搜索”密钥,而是直接应用它。
- 电影情景的解释: 电影中常见的“固定某个位置”通常是为了增加戏剧性或简化情节。
- 可能指向某种弱点: 有时在电影中,固定某个位置可能意味着攻击者已经找到了密钥的某些部分,或者他们找到了一个算法的漏洞,从而能够缩小搜索范围,集中精力在某个特定区域。
- 猜测或推断: 也可能是基于猜测、推断或内部信息(例如,知道密钥的某个部分是固定字符串或模式)而锁定的特定搜索区域。
- “物理”密码: 如果是指像密码锁或保险柜密码那样有物理位置的密码,那么固定某些已知位当然是有意义的。但对于数字密钥,这种“位置”的概念通常被抽象为比特位或字符索引。
- 实际情况: 在实际的密码破解中,很少有这种操作。更常见的是通过算法分析、数学工具、统计方法或蛮力攻击来攻击整个密钥空间或利用算法缺陷。

这张幻灯片的主题是“Cuestiones” (问题),提出了关于伪随机数生成器 (PRNG) 的几个讨论点和思考题,特别是关于密码学安全 (Cryptographically Secure) PRNG 和普通 PRNG 之间的区别。
讨论点/问题解释
Demostración rendimiento.
- 翻译: 性能演示。
- 解释: 这很可能是一个提示,表示在演讲或课程中,可能会有代码示例或实验来比较不同 PRNG 的性能。例如,比较 LCG 和加密安全 PRNG 的速度差异,以直观地展现为什么加密安全 PRNG 不适合所有场景。
Números aleatorios en Go
- 翻译: Go 语言中的随机数。
- 解释: 这是一个具体的案例,链接到关于 Go 语言中随机数实现的资源。Go 语言(以及其他现代编程语言)通常会提供两种不同用途的随机数包:
math/rand: 通常是非加密安全的 PRNG,用于一般模拟和游戏等。crypto/rand: 是加密安全 PRNG,用于生成密钥、Nonce 等需要安全随机性的场景。
- [blog] [math] [crypto]
- 解释: 这些标签表明链接的资源可能包含博客文章(
blog)、数学原理(math)和密码学应用(crypto)方面的内容,涵盖了 Go 语言中随机数的不同方面。
- 解释: 这些标签表明链接的资源可能包含博客文章(
¿Qué diferencias hay entre PRNG criptográficos (seguros) y los que no lo son?
- 翻译: 密码学伪随机数生成器(安全的)和非密码学伪随机数生成器有什么区别?
- 解释: 这是一个核心问题,旨在区分两种类型的 PRNG。主要区别在于安全性和不可预测性:
- 普通 PRNG (e.g., LCG): 主要关注统计随机性(输出看起来均匀分布、不重复等),但不关注抗预测性。它们是确定性的,如果你知道算法和当前状态(或少量的输出),就可以轻松预测其未来的输出。它们速度快、实现简单,适用于非安全敏感的模拟、游戏等场景。
- 密码学安全 PRNG (CSPRNG, e.g., AES-CTR 的 DRBG 模式, ChaCha20, Blum Blum Shub): 除了具备统计随机性外,最重要的是难以预测性。即使攻击者知道算法和大量的过去输出,也无法在计算上可行的时间内预测未来的输出,或者从未来输出推断出过去的输出(前向和后向安全)。它们通常基于数学难题(如大数分解)或密码学原语(如哈希函数、分组密码)。实现上更复杂,速度通常比普通 PRNG 慢,但这是为了安全性所必须付出的代价。
¿Cuál sería un PRNG criptográfico adecuado?
- 翻译: 哪种 PRNG 会是合适的密码学 PRNG?
- 解释: 这个问题旨在探讨有哪些具体的算法或机制被认为是合格的 CSPRNG。这通常包括:
- 现代操作系统提供的
/dev/random或/dev/urandom(Linux/Unix) /CryptGenRandom()(Windows): 这些是操作系统层面的熵源和 CSPRNG 实现,通常是首选。它们从各种物理事件中收集真正的随机性(熵),然后用这些熵作为种子来驱动一个更高效的 CSPRNG 算法。 - 基于密码学原语的 DRBG (Deterministic Random Bit Generators):
- HMAC-DRBG: 基于哈希消息认证码 (HMAC)。
- CTR-DRBG: 基于分组密码的计数器模式 (Counter Mode),如 AES-CTR。
- Hash-DRBG: 基于哈希函数。
- 其他数学难题驱动的生成器: 如前面提到的 **Blum Blum Shub (BBS)**,虽然理论上很强,但因为速度慢而在实际中应用较少。
- 流密码: 某些流密码(如 ChaCha20)在某些模式下也可以直接用作 CSPRNG。
- 现代操作系统提供的
这张幻灯片的目的是引导听众思考、比较和理解不同类型 PRNG 的核心差异和适用场景,强调了在安全敏感的应用程序中使用正确类型的随机数生成器的重要性。
好的,我们来详细解释一下流加密 (Stream Cipher) 和 分组加密 (Block Cipher) 这两种对称加密算法的主要区别。
对称加密是指加密和解密使用相同密钥的加密方式。流加密和分组加密是实现对称加密的两种主要模式。
1. 分组加密 (Block Cipher)
核心思想:
分组加密将明文(要加密的数据)分成固定大小的“块”(Block),然后对每个块独立地进行加密。
工作方式:
- 输入: 接受一个固定大小的明文块(例如,一个128比特的块)和一个密钥。
- 输出: 输出一个等长的密文块。
- 重复处理: 如果明文数据超过一个块的大小,就需要将其分割成多个块。最后一个块如果不足固定大小,需要进行“填充”(Padding)。
- 模式: 分组加密通常不会直接用于加密整个消息,而是与各种“工作模式”(Operation Modes)结合使用,以处理任意长度的消息,并增加加密的随机性和安全性(例如,CBC、CTR、GCM 等模式)。
特点:
- 固定块大小: 每次处理的数据单位是固定大小的块。
- 可重复使用: 同一个块加密器可以用于加密不同的块,但在不同的模式下,通常会使用额外的输入(如初始化向量 IV)来确保每个块的加密是唯一的。
- 通常速度较慢: 相对于流加密,单比特或单字节的加密效率较低,因为它需要等待填满一个块才能进行加密。
- 安全性: 在设计上,一个好的分组加密器应该像一个“伪随机置换”,意味着无法区分加密操作和真正的随机置换。
- 例子: AES (Advanced Encryption Standard)、DES (Data Encryption Standard)、3DES。
优点:
- 成熟可靠: 经过广泛研究和应用,安全性得到充分验证。
- 多用途: 通过不同的工作模式,可以实现保密性、认证性、完整性等多种安全服务。
缺点:
- 需要填充: 如果明文长度不是块大小的整数倍,需要进行填充,这会增加密文长度,并且可能引入填充攻击的风险(如果填充处理不当)。
- 不能处理实时数据流: 一次处理一个块的特性使其不适合处理实时数据流,因为它需要等待整个块准备好。
2. 流加密 (Stream Cipher)
核心思想:
流加密一次处理一个比特或一个字节的明文。它通过生成一个伪随机密钥流 (Keystream),然后将密钥流与明文进行异或 (XOR) 操作来生成密文。解密时,使用相同的密钥流再次与密文异或,即可恢复明文。
工作方式:
- 密钥流生成器: 流加密算法的核心是一个密钥流生成器 (Keystream Generator)。它使用密钥和一个初始向量 (IV) 来生成一个看似随机的、与明文等长的比特流(密钥流)。
- 加密: 明文 ⊕ 密钥流 = 密文
- 解密: 密文 ⊕ 密钥流 = 明文 (因为 $A \oplus B \oplus B = A$)
- 实时处理: 由于它逐比特/字节操作,非常适合处理实时数据流。
特点:
- 逐比特/字节操作: 每次处理的数据单位是更小的(通常是1比特或1字节)。
- 无填充: 不需要填充,密文长度与明文长度相同。
- 速度通常较快: 比分组加密通常更快,尤其是对于硬件实现和处理实时数据流。
- 安全性: 密钥流的随机性是其安全性的关键。如果密钥流生成器是可预测的,那么整个加密系统就容易被破解。一个好的流密码应该生成一个与真正随机序列无法区分的密钥流。
- 例子: RC4 (已被证明不安全,不应再使用)、ChaCha20、Salsa20、A5/1 (用于GSM,有已知弱点)。
优点:
- 速度快: 特别适合高速数据传输和硬件实现。
- 无需填充: 不增加密文长度,避免填充攻击风险。
- 适用于实时通信: 逐比特/字节处理使其非常适合如语音、视频等实时数据流加密。
缺点:
- 密钥流重用: 绝对不能使用同一个密钥流加密两个不同的明文。如果发生密钥流重用,攻击者可以通过异或两个密文来获取两个对应明文的异或结果 ($C_1 \oplus C_2 = (P_1 \oplus K) \oplus (P_2 \oplus K) = P_1 \oplus P_2$),从而可能推断出明文。因此,每个加密会话必须使用唯一的 IV 来生成唯一的密钥流。
- 统计特性可能因输出而异: 有些流密码在统计随机性方面可能不如高标准的分组密码(尽管现代流密码如 ChaCha20 已大大改善)。
主要区别总结
| 特性 | 流加密 (Stream Cipher / Cifrado de Flujo) | 分组加密 (Block Cipher / Cifrado de Bloque) |
|---|---|---|
| 处理单位 | 逐比特或逐字节 | 固定大小的数据块 |
| 加密方式 | 明文 ^ 密钥流 | 对数据块进行复杂的数学变换 (置换、代换) |
| 填充需求 | 无 | 有 (如果明文长度不是块大小的整数倍) |
| 密文长度 | 等于明文长度 | 通常略大于明文长度 (因填充) |
| 速度 | 通常较快,尤其适合硬件和实时流 | 通常较慢 (但通过并行化和硬件优化可达高速) |
| 随机性来源 | 密钥流生成器的随机性 | 加密算法本身对块的置换和代换 |
| 密钥流重用 | 绝对禁止 (高风险) | 不同的工作模式下,需要 IV,但并非完全等同于流密码的密钥流重用 |
| 典型算法 | ChaCha20, Salsa20, RC4 (不安全) | AES, DES, 3DES |
| 适用场景 | 实时通信 (VOIP, 视频), 大文件加密 | 文件加密,数据存储,网络协议 (TLS/SSL 的底层) |
总的来说,流加密和分组加密各有优劣,适用于不同的场景。在实际应用中,我们通常不会直接使用 AES 或 ChaCha20 算法本身,而是使用它们在特定工作模式下的实现,如 AES-GCM (分组加密,提供认证和加密) 或 ChaCha20-Poly1305 (流加密,提供认证和加密),以获得更好的安全性和功能。

这张幻灯片的主题是流加密器 (Cifradores en flujo),并将其分为两种主要类型:同步流加密器 (Síncronos) 和 **自同步流加密器 (Autosincronizantes)**。
简单来说,这两种流加密器的区别主要在于它们如何生成密钥流以及它们处理传输错误的方式。
Cifradores en flujo (流加密器)
核心概念: 流加密器通过生成一个伪随机密钥流,并将其与明文逐比特或逐字节进行异或 (XOR) 操作来加密数据。解密时使用相同的密钥流再次异或密文。流加密器的安全性完全取决于密钥流的随机性和不可预测性。
Síncronos (同步流加密器)
特点:
- La secuencia cifrante se genera de forma independiente. (密钥流是独立生成的。)
- 这意味着密钥流的生成只依赖于密钥和初始向量 (IV) 或 nonce(一个只用一次的随机数),不依赖于明文或密文。发送方和接收方完全依据相同的密钥和 IV 独立地生成相同的密钥流。
- El emisor y receptor han de estar sincronizados. (发送方和接收方必须保持同步。)
- 因为密钥流是独立于数据生成的,所以发送方和接收方必须严格地知道当前正在处理的是第几个比特或字节,以便使用密钥流中对应的部分进行异或操作。如果一方错过了或多了一个比特,就会导致后续所有的比特都用错了密钥流,从而无法正确解密。
- Un bit borrado provoca un error de sincronía. (一个比特的删除会导致同步错误。)
- 这是因为一旦有一个比特被删除,接收方就不能再与发送方生成密钥流的步进保持一致,所有后续的解密都会失败。
- Un bit alterado no afecta a los demás bits. (一个比特的改变不会影响其他比特。)
- 如果密文中的一个比特在传输过程中被翻转(例如0变成了1),由于密钥流是独立生成的,这个错误只会影响到它自身对应的明文比特。其他比特将正常解密,因为它们的密钥流仍然是正确的。这是一个优点,因为它限制了错误的影响范围。
示例: ChaCha20、CTR 模式下的分组加密(虽然是分组加密的工作模式,但其行为类似于同步流加密)。
Autosincronizantes (自同步流加密器)
特点:
- La secuencia cifrante es una función de la clave y el texto cifrado. (密钥流是密钥和密文的函数。)
- 与同步流加密器不同,自同步流加密器在生成密钥流时,会利用之前生成的密文。这意味着接收方在解密时,可以使用自己已经接收到的密文来生成所需的密钥流。
- El emisor y receptor se sincronizan de forma automática. (发送方和接收方会自动同步。)
- 由于密钥流的生成依赖于密文,即使在传输过程中丢失了一些比特,只要接收方收到一定数量的连续密文比特,它就可以重新“赶上”发送方,即自发地重新生成正确的密钥流。这是因为它能够根据接收到的密文来纠正其内部状态。
- Cualquier bit erróneo provoca una propagación de errores. (任何错误的比特都会导致错误传播。)
- 这是一个缺点。如果密文中的一个比特被改变,它不仅会影响自身对应的明文比特,还会影响后续密钥流的生成。因为后续的密钥流是基于这个有错误的密文生成的,所以它会导致一系列后续比特的解密都出错,直到加密器达到一个新的稳定状态(如果它能达到的话),或者错误的影响范围有限制。这就像一个链式反应。
示例: 分组加密的 CFB (Cipher Feedback) 模式可以被视为一种自同步流密码。
底部注释:
“Los cifradores en flujo son casi todos síncronos, si bien algunos pueden ser modificados para ser autosincronizantes.”
(流加密器几乎都是同步的,尽管有些可以通过修改成为自同步的。)
解释: 这句话指出了一个常见的趋势。大多数设计的流加密器都是同步的,因为它们的结构更简单,密钥流生成更直接。但通过特定的设计(例如分组加密的 CFB 模式),可以将流加密器实现为自同步的,以应对通信中的延迟或比特丢失。不过,如幻灯片所示,这种自同步能力通常以错误传播为代价。
总结表格:
| 特性 | 同步流加密器 (Síncronos) | 自同步流加密器 (Autosincronizantes) |
|---|---|---|
| 密钥流依赖 | 仅依赖密钥和 IV/Nonce | 依赖密钥、IV/Nonce 和之前的密文 |
| 同步要求 | 发送方和接收方必须严格同步 | 发送方和接收方会自动同步/重新同步 |
| 比特删除影响 | 导致后续所有解密失败 (同步错误) | 会自动重新同步 (但会丢失数据) |
| 比特改变影响 | 只影响自身对应的明文比特 (错误不传播) | 导致错误传播 (影响后续多个比特) |

这张幻灯片的主题是**”Comentario: nonces y otros parámetros similares” (评论:随机数和其它类似参数)**,它提出了在密码学中关于 nonce 和类似参数的两个关键问题:
- ¿Cómo se genera un nonce u otro valor similar? (如何生成一个随机数或其它类似值?)
- ¿Cómo se transmite, dónde se almacena? (如何传输,存储在哪里?)
解释 nonce 和类似参数:
Nonce 是 “Number used once” 的缩写,意思是一次性数字。在密码学中,它是一个在每个加密会话、加密消息或加密操作中只使用一次的随机或伪随机数。
nonce 和其他类似参数(如 初始化向量 IV - Initialization Vector、计数器 Counter、盐值 Salt 等)在密码学中扮演着非常重要的角色,它们的主要目的是:
- 增加安全性,防止重放攻击 (Replay Attacks): 通过确保每次加密操作都使用不同的
nonce,即使相同的明文被加密多次,得到的密文也会不同。这使得攻击者无法简单地重放截获的旧密文来欺骗系统。 - 增加随机性: 即使使用相同的密钥加密相同的明文,
nonce也可以引入额外的随机性,使得每次加密的结果都不同。这对于增强密码系统的安全性至关重要。 - 防止字典攻击: 对于哈希函数中的盐值 (Salt),它可以防止预计算的彩虹表攻击。
- 作为密钥流的起点: 在流加密和分组加密的 CTR (计数器模式) 等模式中,
nonce或 IV 常常是生成密钥流的起点。
解答幻灯片提出的问题:
1. ¿Cómo se genera un nonce u otro valor similar? (如何生成一个随机数或其它类似值?)
生成 nonce 或类似值有几种常见的方法:
- 真随机数生成器 (TRNG - True Random Number Generator):
- 方法: 使用物理现象(如热噪声、放射性衰变、鼠标移动、风扇转速)来生成高度不可预测的随机数。
- 优点: 提供高熵值,安全性强。
- 缺点: 速度通常较慢,需要专门的硬件。
- 密码学安全伪随机数生成器 (CSPRNG - Cryptographically Secure Pseudo-Random Number Generator):
- 方法: 通过一个确定性算法,从一个小的、高熵的种子值开始,生成看似随机的数字序列。CSPRNGs 被设计成即使知道一部分输出也很难预测未来的输出。
- 优点: 速度快,可以在软件中实现,通常足够安全。
- 缺点: 依赖于一个好的初始种子值。
- 计数器 (Counter):
- 方法: 例如,简单地从 0 开始递增一个数字,确保每次使用时都独一无二。
- 优点: 简单,易于实现,保证了唯一性。
- 缺点: 如果计数器或其状态被泄露,可能会导致安全问题。它不提供随机性,只提供唯一性。在某些情况下,会被与随机数结合使用(如 ChaCha20)。
- 时间戳 (Timestamp):
- 方法: 使用当前时间作为
nonce。 - 优点: 易于实现,通常能保证唯一性(如果精度足够高且不重复使用)。
- 缺点: 如果时间戳不是足够长或不够随机,可能容易被预测,且在分布式系统中处理同步可能较为复杂。
- 方法: 使用当前时间作为
关键要求: 无论哪种方法,nonce 的核心要求是唯一性 (Uniqueness)。在某些情况下,为了抵抗某些攻击(如猜测攻击),还需要不可预测性 (Unpredictability) 和**随机性 (Randomness)**。
2. ¿Cómo se transmite, dónde se almacena? (如何传输,存储在哪里?)
- 如何传输 (How to transmit)?
- 通常以明文形式传输:
nonce(或 IV)本身不包含敏感信息,它的目的是增加加密的随机性或唯一性。因此,它通常不需要加密,可以作为密文的一部分与密文一起发送。例如,在 TLS 握手、GCM 模式等中,nonce或 IV 是公开传输的。 - 与密文一起发送: 最常见的做法是将
nonce作为消息头的一部分或与密文拼接在一起发送给接收方。接收方使用收到的nonce和共享密钥来生成正确的密钥流进行解密。
- 通常以明文形式传输:
- 存储在哪里 (Where to store)?
- 在传输中携带: 最常见的是不单独存储,而是每次加密时生成并随密文一起发送。接收方收到后立即使用。
- 会话状态: 在某些协议中,
nonce可能作为会话状态的一部分在发送方和接收方之间维护,以确保连续性。例如,TLS 会话可以维护一个递增的序列号作为nonce的一部分。 - 数据库或文件系统 (针对盐值): 对于密码哈希中的**盐值 (Salt)**,它通常与哈希值一起存储在数据库中。这样,即使数据库被泄露,攻击者也无法通过预计算的彩虹表直接还原密码。
总结:
Nonce 和类似参数是现代密码学中的基本构建块,它们通过引入随机性和唯一性来增强加密系统的安全性。正确地生成、传输和管理这些参数对于维护系统的整体安全性至关重要。错误地使用(例如,重用 nonce 或使用可预测的 nonce)可能会导致严重的加密漏洞。

这张幻灯片提出了关于流加密器的几个关键问题,并提到了在 Go 语言中实现流加密器的一些例子。
Cuestiones (问题)
1. ¿Qué diferencias hay entre cifradores en flujo y PRNG criptográficos? (流加密器和密码学伪随机数生成器 (CSPRNG) 有什么区别?)
- **密码学伪随机数生成器 (CSPRNG - Cryptographically Secure PseudoRandom Number Generator)**:
- 目的: 生成一个能通过各种统计测试、看起来像随机数的序列。关键要求是不可预测性,即使攻击者知道算法和一部分输出,也无法预测未来的输出或回溯到过去的输出。
- 输出: 伪随机比特序列。
- 输入: 一个高熵的种子 (seed)。
- 独立性: 输出通常与任何特定数据无关。
- 应用: 生成密钥、
nonce、盐值、随机数。
- **流加密器 (Cifradores en flujo - Stream Ciphers)**:
- 目的: 对数据进行加密。它们通过生成一个**密钥流 (keystream)**,并将其与明文逐比特或逐字节进行异或 (XOR) 操作来达到加密目的。
- 输出: 密文(加密后的数据)。
- 输入: 密钥、
nonce(或 IV)、明文。 - 核心: 一个安全的流加密器的核心就是一个 CSPRNG。 流加密器实际上就是用一个密钥和
nonce来“驱动”一个 CSPRNG,把 CSPRNG 生成的输出作为密钥流,然后将密钥流与明文进行异或。 - 区别: 虽然流加密器的核心是 CSPRNG,但流加密器还包括了将密钥流应用于明文的异或操作,并通常有特定的结构来管理
nonce和密钥。CSPRNG 只是生成随机比特,流加密器则使用这些随机比特进行加密操作。
简单总结: 流加密器利用 CSPRNG 来生成加密所需的密钥流。CSPRNG 是工具,流加密器是使用这个工具完成加密任务的系统。可以把 CSPRNG 比作一台随机数产生机,流加密器则是在这台机器上加上了把这些随机数与待加密数据混合在一起的功能。
2. ¿En qué situaciones sería útil un cifrador en flujo? (在什么情况下流加密器会有用?)
流加密器在以下场景中特别有用:
- 实时通信 (Real-time communication):
- 例如,在视频会议、语音通话 (VoIP) 等需要低延迟和高吞吐量的应用中,流加密器可以快速地对数据进行加密和解密,因为它们通常比分组加密算法在很多场景下更快,且不需要缓冲整个数据块。
- 数据流很长或无限长:
- 当数据以流的形式连续到达时(如网络数据包),流加密器可以逐个字节或比特进行处理,而不需要等待整个数据块形成。这使得它们非常适合像 TCP 连接这样的流式数据。
- 资源受限的环境 (Resource-constrained environments):
- 在一些内存或处理能力有限的设备(如物联网设备、嵌入式系统)中,流加密器的实现通常更简单、占用资源更少。
- 明文长度可变:
- 流加密器不需要对明文进行填充 (padding),因为它们是逐字节/比特操作的。这使得它们在处理长度不确定或不断变化的明文时更灵活。
- 需要低错误传播:
- 对于同步流加密器,单个比特错误只影响对应的一个明文比特,而不会像分组加密的某些模式那样导致整个块无法解密(高错误传播)。但这不适用于自同步流加密器。
3. ¿Cuál sería un cifrado en flujo adecuado? (哪种流加密器是合适的?)
根据当前的密码学最佳实践和安全建议,RC4 已经不再是合适的选择,因为它存在已知的严重安全漏洞。
目前合适的流加密器包括:
- ChaCha20:
- 优点: 快速、安全、在软件中高效、具有良好的抵抗侧信道攻击的能力。它被广泛认为是 RC4 的一个安全且高效的替代品。
- 应用: 已被集成到 TLS 协议的 ChaCha20-Poly1305 组合中,并在 Android、Chrome 等广泛使用。
- AES in CTR mode (Counter Mode):
- 虽然 AES 本身是分组加密,但当它以 CTR (计数器) 模式运行时,它行为上就等同于一个流加密器。
- 优点: 广泛的硬件支持、非常安全、并行性好(可以并行计算密钥流)、具有低错误传播。
- 应用: 广泛用于各种安全协议和应用中。
重点: 在选择流加密器时,安全性和性能是两个核心考量。始终选择经过充分审查且没有已知弱点的现代算法。
Cifradores en flujo en Go (Go 语言中的流加密器)
Go 语言的 crypto 标准库提供了实现流加密器所需的功能。幻灯片中提到的例子:
[RC4](RC4 流加密器)- 虽然 Go 库中可能有 RC4 的实现,但考虑到其安全性问题,不推荐在新项目中使用。它可能仅用于兼容旧系统或教育目的。
[ChaCha](ChaCha 流加密器)- Go 语言的
crypto/chacha20包提供了 ChaCha20 的实现。这是一个现代的、安全的流加密算法。
- Go 语言的
[Ej. RC4](RC4 示例)- 这可能指的是一个具体的代码示例,演示如何使用 Go 的
crypto/rc4包。
- 这可能指的是一个具体的代码示例,演示如何使用 Go 的
[Ej. ChaCha20](ChaCha20 示例)- 这指的是如何使用 Go 的
crypto/chacha20包进行 ChaCha20 流加密的示例。
- 这指的是如何使用 Go 的
[Ej. XChaCha20](XChaCha20 示例)- XChaCha20 是 ChaCha20 的一个变种,它使用了更长的
nonce(192位),以提供更高的安全性,尤其是在nonce可以是随机数而不是递增计数器的情况下,可以降低nonce重复的风险。Go 语言的x/crypto/chacha20poly1305包中包含了 XChaCha20 的实现(通常与 Poly1305 认证码结合使用)。
- XChaCha20 是 ChaCha20 的一个变种,它使用了更长的
总结 Go 语言部分: Go 语言的标准库和扩展库提供了对多种流加密算法的支持。对于新项目,应该优先选择安全的现代算法,如 ChaCha20 或 XChaCha20。

这张幻灯片以“分组加密:问题”为题,围绕分组加密器的选择、使用情境以及与流加密器的比较提出了几个关键问题,并列出了在 Go 语言中实现分组加密器的例子。
Cifrado en bloque: cuestiones (分组加密:问题)
1. ¿Qué cifrador en bloque elegirías en la actualidad, atendiendo a la seguridad y el rendimiento? ¿Con qué tamaño de clave y modo de operación? (考虑到安全性和性能,你目前会选择哪种分组加密器?使用哪种密钥大小和操作模式?)
分组加密器选择:AES (Advanced Encryption Standard)
- 原因: AES 是目前最广泛采用和推荐的分组加密算法。它经过了严格的审查,没有已知的实际攻击方法,并且在现代硬件(尤其是支持 AES-NI 指令集的 CPU)上表现出极高的性能。
密钥大小 (Tamaño de clave):
- AES-128: 密钥长度 128 位。对于大多数通用应用来说,其安全强度已经足够抵抗未来几十年的暴力破解攻击。在性能敏感的场景下,128 位密钥可能略快于更长的密钥。
- AES-256: 密钥长度 256 位。提供更高的安全强度,通常用于需要最高安全保证的场景,例如国家级机密或长期保密的数据。它的性能略低于 AES-128,但在现代硬件上差异通常不明显。
- 推荐: 对于大多数应用,AES-128 已经足够。如果对安全性有极高的要求且性能影响可接受,可以选择 AES-256。
操作模式 (Modo de operación):
选择操作模式至关重要,因为它决定了分组加密器如何将明文分组转换为密文分组,并直接影响安全性特性(如数据完整性、认证)和性能。
- 推荐:AES-GCM (Galois/Counter Mode):
- 优点: GCM 是一种认证加密 (Authenticated Encryption with Associated Data - AEAD) 模式。它不仅提供机密性 (Confidentiality)(数据加密),还提供数据完整性 (Data Integrity) 和**认证 (Authentication)**。这意味着接收方不仅知道数据已被加密,还能验证数据在传输过程中没有被篡改,并且确实来自预期的发送方。它也支持并行处理,效率高,并且在现代硬件上通常有优化。
- 何时使用: 几乎所有需要加密和同时保护数据完整性的现代应用都应优先考虑 GCM,例如 TLS/SSL 通信、IPSec、文件加密等。
- 备选:AES-CTR (Counter Mode):
- 优点: CTR 模式将分组加密器转换为流加密器。它支持并行处理,效率高,并且不会对明文进行填充 (padding),适用于流式数据。其错误传播特性也较好。
- 何时使用: 如果只需要机密性,并且愿意额外实现认证机制(例如,使用 HMAC),或者在某些情况下,例如加密大量连续数据流时,CTR 是一个不错的选择。但通常,推荐与认证机制(如 HMAC)结合使用,形成 Encrypt-then-MAC 方案,或者直接使用 AEAD 模式如 GCM。
不推荐的操作模式:
- ECB (Electronic Codebook Mode): 绝不应直接用于加密多块数据。 它会为相同的明文块生成相同的密文块,泄露明文模式。
- CBC (Cipher Block Chaining Mode): 比 ECB 安全得多,但通常需要填充,并且解密不支持完全并行化。更重要的是,它不提供认证,易受填充预言攻击 (Padding Oracle Attacks)。如果需要认证,必须额外添加 HMAC。AES-GCM 通常优于 AES-CBC + HMAC。
2. ¿Hay situaciones en las que sería preferible un cifrador en bloque a uno en flujo o viceversa? (有没有一些情况是分组加密器比流加密器更优,或者反之?)
分组加密器更优的情况:
- 需要认证加密 (Authenticated Encryption): 许多现代的分组加密操作模式(如 GCM)直接提供了认证加密功能,即同时保证机密性、完整性和认证性。而许多流加密器只提供机密性,需要额外集成认证机制。
- 例子: TLS/SSL 通信(如 AES-GCM)、需要同时验证数据来源和完整性的文件加密。
- 标准化和广泛审计的方案: 分组加密器及其操作模式(如 AES-GCM)经过了极其广泛的标准化和密码学社区的审查和测试。
- 固定大小的数据块: 当数据自然地按固定大小的块(如磁盘扇区、内存页)处理时,分组加密器更直接。当然,通过操作模式,分组加密器也可以处理变长数据。
流加密器更优的情况 (或分组加密器的 CTR/GCM 模式更优):
- 实时通信和流式数据 (Real-time/streaming data):
- 流加密器可以即时处理到达的每一个比特或字节,无需等待整个数据块。这对于实时音频/视频流、网络数据传输等低延迟应用非常有利。
- 注意:分组加密器的 CTR 模式和 GCM 模式本质上也是将分组密码转换为流密码来操作,同样具有这些优势。
- 资源受限(尤其是在历史或某些嵌入式)环境:
- 某些简单的流加密器(如 RC4,尽管不安全)在实现上非常轻量级。现代安全的流加密器(如 ChaCha20)在软件实现上也非常高效,且内存占用小。
- 不允许填充 (No padding allowed):
- 流加密器不会对数据进行填充,因为它是一比特一比特或一字节一字节地加密的。对于不允许数据长度变化或增加开销的特殊应用场景有优势。分组加密器的一些操作模式(如 CTR 和 GCM)也避免了填充。
- 错误传播特性 (Error propagation):
- 在同步流加密器(以及分组加密器的 CTR/GCM 模式)中,传输中的单个比特错误通常只影响对应的明文比特,而不会像 CBC 模式那样导致整个分组解密失败。
现代趋势: 实际上,随着 CTR 和 GCM 等将分组加密器“流化”的操作模式的流行,分组加密器和流加密器之间的界限变得模糊。许多场景下,人们最终会使用一个分组加密器(如 AES)在流模式(如 CTR 或 GCM)下运行,以结合两者的优点。通常建议优先选择具有认证加密功能的模式 (如 AEAD 模式,例如 AES-GCM 或 ChaCha20-Poly1305)。
Cifradores en bloque en Go (Go 语言中的分组加密器)
Go 语言的 crypto 标准库提供了强大的分组加密功能:
[AES](AES 分组加密器)- Go 语言的
crypto/aes包提供了 AES 的核心分组加密算法实现。它提供了创建 AES 密钥和初始化 AES 块加密器(cipher.Block接口)的功能。
- Go 语言的
[Ej. AES-CTR](AES-CTR 示例)- 这指的是使用
crypto/cipher包结合crypto/aes实现 AES 在计数器 (CTR) 模式下的加密示例。cipher.NewCTR(block, iv)函数可以创建一个 CTR 流加密器。
- 这指的是使用
[Ej. AES-GCM](AES-GCM 示例)- 这指的是使用
crypto/cipher包结合crypto/aes实现 AES 在伽罗瓦/计数器 (GCM) 模式下的认证加密示例。cipher.NewGCM(block)函数可以创建一个 GCM 认证加密器,然后使用Seal和Open方法进行加密和解密/认证。
- 这指的是使用
[Alt. XChaChaPoly](替代方案:XChaCha-Poly1305)- 这指的是替代 AES-GCM 的另一种推荐的认证加密方案:XChaCha20 与 Poly1305 认证码的组合。Go 语言的
golang.org/x/crypto/chacha20poly1305包提供了这个实现。它通常被认为是 AES-GCM 的一个极佳的软件实现替代品,在没有硬件加速的机器上可能会更快。
- 这指的是替代 AES-GCM 的另一种推荐的认证加密方案:XChaCha20 与 Poly1305 认证码的组合。Go 语言的
总结 Go 语言部分: Go 语言的 crypto 库提供了在实际应用中实现安全的分组加密所需的所有工具,尤其是 AES-GCM 和 XChaCha20-Poly1305 这两种现代推荐的认证加密方案。开发者应熟悉这些模式及其正确使用方法。

这张幻灯片以“哈希和密码:问题”为题,探讨了哈希函数在数据隐私中的应用、从密码派生密钥的可能性,并提到了 Go 语言中哈希函数和基于密码的密钥派生函数(PBKDF)的实现。
Hash y contraseñas: cuestiones (哈希和密码:问题)
1. ¿Cómo podrías emplear un hash en la privacidad de datos? (你将如何利用哈希来保护数据隐私?)
哈希函数在数据隐私中有多种关键用途,主要通过确保数据的完整性、不可篡改性以及在某些情况下对敏感信息进行匿名化或伪匿名化来实现。
主要应用场景包括:
- 存储密码 (Storing Passwords):
- 方法: 网站或应用程序不直接存储用户的明文密码,而是存储密码的哈希值。当用户登录时,系统会计算输入密码的哈希值,并与存储的哈希值进行比较。
- 隐私保护: 即使数据库被泄露,攻击者也只能获取到哈希值,而无法直接得知用户的明文密码。
- 最佳实践: 必须结合加盐 (Salt) 和使用**慢哈希函数 (Slow Hash Functions)**(如 Argon2、bcrypt、scrypt)来防止彩虹表攻击和暴力破解攻击。
- 数据完整性验证 (Data Integrity Verification):
- 方法: 计算数据(如文件、消息)的哈希值(也称为数字指纹或校验和),并将哈希值与数据分开存储或传输。接收方或使用方可以重新计算数据的哈希值,并与原始哈希值进行比较。
- 隐私保护/安全: 如果哈希值不匹配,则表明数据在传输或存储过程中被篡改或损坏。这确保了数据的完整性,避免了恶意修改对隐私的影响。
- 例子: 软件下载验证、文件同步检查、数字签名。
- 构建数据结构 (Building Data Structures):
- 方法: 哈希函数用于构建哈希表 (hash table) 和布隆过滤器 (Bloom filter)。
- 隐私保护:
- 布隆过滤器: 可以用于高效地检查一个元素是否“可能”存在于集合中,而无需存储或暴露原始元素。例如,在“我关注的人”列表中,可以通过布隆过滤器来检查某个用户是否关注了你,而无需公开你的完整关注列表。
- 密码学承诺 (Cryptographic Commitments): 使用哈希函数可以实现“承诺”,即在不揭示实际值的情况下,先承诺一个值,之后再公开并验证。这在多方计算和零知识证明中很有用,以保护隐私。
- 去重和内容寻址 (Deduplication and Content Addressing):
- 方法: 计算数据的哈希值,用作数据的唯一标识符。
- 隐私保护: 例如,在一个去重存储系统中,可以只存储数据的哈希值列表,当用户上传新数据时,计算其哈希值并检查是否已存在。这有助于减少存储冗余,同时可以间接作为一种数据识别方式。
- 伪匿名化 (Pseudonymization) 和标识符生成:
- 方法: 对敏感数据(如用户 ID、电子邮件地址)进行哈希处理,生成一个伪匿名标识符。
- 隐私保护: 这些哈希值可以用于分析、统计或与其他第三方共享,而无需直接暴露原始的个人身份信息。由于哈希是单向的,即便得到哈希值,也难以逆推出原始数据。
- 注意: 对于小范围或低熵数据(如少数民族、特定年龄段),哈希可能不足以提供完全的匿名化,因为哈希值仍可能通过穷举攻击被逆推。需要结合随机盐值和其他匿名化技术。
2. ¿Se puede generar más de una clave a partir de una contraseña? (可以从一个密码生成多个密钥吗?)
是的,可以。 这正是基于密码的密钥派生函数 (PBKDF - Password-Based Key Derivation Function) 的主要用途之一。
PBKDF 的作用:
PBKDFs 的设计目标是:
- 从低熵的密码(人类可记忆的短字符串)安全地派生出高熵的加密密钥。
- 增加计算成本,使其难以进行暴力破解和字典攻击。
如何生成多个密钥:
PBKDF 通常接受几个输入:
- 密码 (Password): 用户输入的原始密码。
- 盐值 (Salt): 一个随机的、唯一的字符串。每次为同一个密码生成密钥时都应该使用不同的盐值。这使得攻击者无法使用彩虹表,并且即使两个用户使用相同的密码,也会生成不同的哈希值。
- 迭代次数/工作因子 (Iteration Count/Work Factor): 一个参数,控制哈希函数执行的次数。迭代次数越高,生成密钥所需的计算时间越长,抵御暴力破解攻击的能力越强。
- 输出密钥长度 (Output Key Length): 指定所需密钥的长度。
通过调整 PBKDF 的输出密钥长度或结合其他派生机制,可以从同一个密码派生出多个不同的密钥:
- 调整输出长度: 大多数 PBKDF(如 PBKDF2、scrypt、Argon2)允许你指定派生密钥的长度。你可以从同一个密码和盐值派生出不同长度的密钥段,然后将它们用作不同的密钥。例如,你可以派生出一个 64 字节的密钥,然后将其分成两个 32 字节的密钥,一个用于加密,一个用于认证。
- 使用不同的上下文信息 (Context Information): 在 PBKDF 的基础上,你可以引入额外的“上下文信息”或“域分离字符串”,这样即使使用相同的密码和盐值,也能生成用于不同目的的独立密钥。例如,可以用 “
password || salt || 'encryption'“ 作为输入的一部分来生成加密密钥,用 “password || salt || 'authentication'“ 来生成认证密钥。这通常通过密钥派生函数 (KDF - Key Derivation Function) 中的具体参数实现。 - 使用 HKDF (HMAC-based Key Derivation Function): HKDF 是一个将现有伪随机密钥材料扩展为多个加密密钥的 KDF。你可以首先使用 PBKDF 从密码派生出一个主密钥(或者称为伪随机密钥 PRP - PseudoRandom Key),然后使用 HKDF 从这个 PRP 派生出多个子密钥,每个子密钥用于特定目的(如一个用于加密流量,另一个用于消息认证)。
安全性考量:
- 从密码派生多个密钥时,确保每个派生密钥都是独立且安全的,并且它们的使用不会相互影响(例如,一个密钥的泄露不会轻易导致另一个密钥的泄露)。
- 始终使用强大的 PBKDF(Argon2 优于 scrypt,scrypt 优于 bcrypt,bcrypt 优于 PBKDF2),并为其设置足够高的工作因子(迭代次数、内存消耗、并行度),以抵抗当今硬件条件下的暴力破解。
Funciones hash y PBKDF en Go (Go 语言中的哈希函数和 PBKDF)
Go 语言的 crypto 标准库提供了丰富的哈希函数和 PBKDF 实现:
[SHA-256](SHA-256 哈希函数):- Go 语言的
crypto/sha256包提供了 SHA-256 的实现。这是 SHA-2 系列中最常用的一种,输出 256 位的哈希值,广泛用于数据完整性验证、数字签名等。
- Go 语言的
[SHA-512](SHA-512 哈希函数):- Go 语言的
crypto/sha512包提供了 SHA-512 的实现。它输出 512 位的哈希值,提供更高的安全强度,适合需要更高碰撞抵抗性的场景。
- Go 语言的
[SHA-3](SHA-3 哈希函数):- Go 语言的
golang.org/x/crypto/sha3包提供了 SHA-3(Keccak)的实现。SHA-3 是最新的 NIST 标准哈希函数系列,与 SHA-2 系列基于不同的结构,为未来的安全性提供了多样性。
- Go 语言的
[Ej. Hash](哈希示例):- 这指的是使用 Go 语言的
hash接口及其具体的实现(如sha256.New())来计算数据的哈希值的代码示例。
- 这指的是使用 Go 语言的
[Ej. Argon2](Argon2 示例):- Go 语言的
golang.org/x/crypto/argon2包提供了 Argon2 密钥派生函数(PBKDF)的实现。Argon2 是目前推荐的用于密码存储的最安全的哈希函数之一,因为它被设计成抵抗 GPU 和 ASIC 的暴力破解攻击,通过其内存消耗和并行度参数有效地减慢攻击速度。
- Go 语言的
总结 Go 语言部分: Go 语言在密码学方面做得很好,提供了现代且安全的哈希函数和 PBKDF 实现。对于密码存储,强烈建议使用 Argon2;对于数据完整性验证,SHA-256、SHA-512 或 SHA-3 都是可靠的选择。开发者应该熟悉这些工具并正确使用它们,以确保应用程序的安全性。

这张幻灯片是标题为“问题(Cuestiones)”的总结或讨论部分,提出了几个与非对称密码学相关的关键问题,旨在引发思考或回顾前面内容。
以下是这些问题的解释:
“Cuestiones” (问题)
“Comparativa de rendimiento” (性能比较)
- 解释: 这本身是一个讨论主题,而不是一个问题。它可能暗示在之前的课程内容中,已经对不同类型的密码学(对称和非对称)进行了性能比较。通常,非对称密码学(公钥密码学)的计算开销要远大于对称密码学。
“¿Por qué no usamos criptografía de clave pública para propósito general y qué alternativas tenemos a nuestra disposición?” (为什么我们不将公钥密码学用于通用目的,以及我们有哪些替代方案可用?)
- 解释: 这个问题的核心在于公钥密码学(非对称加密)的性能瓶颈。
- 为什么不用于通用目的? 公钥加密(如RSA、ECC)的计算速度比对称加密(如AES)慢很多,通常慢几个数量级。如果用它来加密一个很大的文件或持续的数据流,会非常低效,消耗大量计算资源和时间。
- “通用目的” 通常指的是对大量数据进行加密。
- 替代方案: 实际上,我们通常的做法是“混合加密(Hybrid Encryption)”。
- 使用公钥密码学安全地交换一个临时的对称密钥(也称为会话密钥)。
- 然后,使用这个对称密钥通过对称加密算法(因为它速度快)来加密实际的大量数据。
- 这样既利用了公钥密码学在密钥交换上的优势(无需预共享密钥),又利用了对称密码学在数据加密上的高效性。
- 解释: 这个问题的核心在于公钥密码学(非对称加密)的性能瓶颈。
“¿Qué papel tienen las funciones hash en los protocolos de firma digital?” (哈希函数在数字签名协议中有什么作用?)
- 解释: 哈希函数在数字签名中扮演着至关重要的角色:
- 数据压缩/摘要: 对要签名的原始消息(可能是任意长度)计算其哈希值。哈希函数生成一个固定长度的“消息摘要(message digest)”或“指纹”。
- 效率提升: 签名算法(如 RSA 签名)是对这个短小的哈希值进行签名,而不是对整个原始消息进行签名。这大大提高了签名和验证的效率。如果直接对整个大文件签名,效率会非常低。
- 完整性验证: 数字签名实际上是证明“这个哈希值是由特定私钥签名者认可的”。如果消息内容被篡改,其哈希值会改变,导致签名验证失败,从而揭示篡改。
- 防止“可能消息攻击”: 对消息进行哈希处理后,即使原始消息很短,哈希值也是固定长度且看上去是随机的,这有助于防止前一个幻灯片中提到的“可能消息攻击”。
- 简单来说: 数字签名不是直接签消息,而是签消息的“指纹”(哈希值)。
- 解释: 哈希函数在数字签名中扮演着至关重要的角色:
“¿Qué diferencia hay entre un certificado y un par de claves pública/privada?” (证书和公钥/私钥对之间有什么区别?)
- 解释: 这两个概念紧密相关,但有明确的区别:
- 公钥/私钥对(Par de claves pública/privada):
- 这是非对称密码学的核心组成部分。
- 公钥是公开的,用于加密和验证签名。
- 私钥是秘密的,用于解密或创建签名。
- 它们是一对数学上关联的密钥,由一个实体(个人、服务器等)生成。
- 数字证书(Certificado Digital):
- 一个数字证书是(通常)一个电子文档,它绑定了一个实体的“身份”信息(例如,一个人的姓名、邮箱;一个网站的域名等)与该实体的“公钥”。
- 主要目的是: 解决公钥认证问题。也就是说,当你收到一个公钥,如何信任这个公钥确实属于你声称的那个实体,而不是伪造的?
- 证书由一个受信任的第三方机构(证书颁发机构,CA)颁发和数字签名。这个签名就是 CA 用自己的私钥对证书内容(包括公钥和身份信息)进行的签名。
- 通过验证 CA 的签名,你可以信任证书中的公钥确实属于证书中声明的实体。
- 总结: 密钥对是加密和签名的基本工具,而数字证书是验证“公钥的真实身份”的工具,它包含了一个公钥以及该公钥所有者的身份信息,并由一个大家都信任的机构担保。
- 公钥/私钥对(Par de claves pública/privada):
- 解释: 这两个概念紧密相关,但有明确的区别:
这些问题涵盖了非对称密码学在实际应用中的性能考虑、与其他密码原语(如哈希函数)的协作,以及它如何构建信任链(通过证书)。

这张幻灯片是“问题(Cuestiones)”部分,旨在引发关于安全数据传输协议的讨论和思考。幻灯片的顶部显示了课程名称的底部横幅:“Seguridad en el Diseño de Software · Transporte seguro de datos”(软件设计安全 · 安全数据传输)。
以下是每个问题及其含义:
“Cuestiones” (问题)
“Soporte en Go:” (Go 语言支持:)
- “[HTTPS] [TLS] [SSH]”
- 解释: 这部分不是一个问题,而是提供了一个关于Go语言对重要安全传输协议支持的参考点。它可能意味着在之前的课程内容中,已经讨论了如何在Go语言中使用这些协议的库或框架。
- HTTPS (Hypertext Transfer Protocol Secure): 网页浏览器和服务器之间用于安全通信的协议,基于 HTTP 和 TLS。
- TLS (Transport Layer Security): 基础加密协议,用于在计算机网络上提供通信安全。HTTPS、FTPS 等很多应用层协议都使用 TLS 来保证安全。
- SSH (Secure Shell): 一种加密的网络协议,用于在不安全的网络上安全地进行网络服务。主要用于远程登录、文件传输(SFTP)和端口转发等。
“¿Crees que todas las aplicaciones se benefician de protocolos como TLS, HTTPS o SSH o únicamente aquellas que tratan con datos privados o confidenciales?” (你认为所有应用程序都受益于像 TLS、HTTPS 或 SSH 这样的协议,还是只有那些处理私人或机密数据的应用程序才受益?)
- 核心问题: 安全协议的普适性。
- 讨论点:
- 传统观点: 只有涉及敏感数据(如密码、银行信息、个人身份信息)的应用程序才需要加密。
- 现代观点: 即使是公开数据或看似不重要的数据,也从安全协议中受益。
- 完整性: 确保数据在传输过程中未被篡改,即使是非机密数据。
- 认证: 确认你连接的是预期的服务器,而不是一个冒充者。
- 隐私: 即使内容不敏感,传输模式、访问内容等元数据也可能泄露用户行为或习惯。
- SEO 和用户信任: HTTPS 已经成为现代网站的标准,搜索引擎会优先考虑 HTTPS 网站,用户也更信任带有“小锁头”的网站。
- 结论(倾向性): 现代网络安全最佳实践倾向于认为所有应用程序都应该使用安全协议,而不仅仅是那些处理敏感数据的。
“¿Cómo elegir entre los distintos protocolos?” (如何在不同的协议之间进行选择?)
- 核心问题: 协议选择的决策依据。
- 讨论点: 选择协议通常取决于应用层协议的要求和传输数据的性质:
- HTTPS/TLS:
- 适用场景: 基于 Web 的通信(浏览器到服务器,API 调用,物联网设备到云端),需要端到端加密和服务器认证。
- TLS 作为基础: 如果你想构建自己的安全应用层协议,可以直接使用 TLS。
- SSH:
- 适用场景: 远程系统管理、安全文件传输(SFTP/SCP)、端口转发、隧道技术。它主要用于用户或程序与远程服务器之间的交互,提供一个安全的通道。
- 其他协议: 还有 VPN 协议(如 WireGuard, OpenVPN)用于建立私人网络链路,以及其他更专业的安全协议。
- HTTPS/TLS:
- 选择考虑因素: 应用类型、安全性需求(机密性、完整性、认证)、性能要求、开发复杂性、现有基础设施兼容性等。
“¿Qué hacer en caso de protocolos o sistemas inseguros heredados?” (如果遇到不安全的遗留协议或系统,该怎么办?)
- 核心问题: 遗留系统安全问题(Technical Debt)的处理。
- 讨论点: 这是很多组织面临的真实挑战。
- 识别风险: 首先要评估遗留系统的风险等级,了解其不安全性可能带来的具体危害。
- 逐步迁移/升级:
- 升级协议: 如果可能,将不安全的协议升级到安全版本(例如从 HTTP 升级到 HTTPS,从 Telnet 升级到 SSH)。
- 增加安全层: 在遗留系统外部增加一个安全代理或网关,由它来处理安全通信,然后转发到不安全的内部系统。
- 代码重构/替换: 这是最彻底但成本最高的方案,逐步用现代安全系统替换遗留部分。
- 隔离和限制访问: 将不安全的系统隔离在受控的网络环境中(例如,内部局域网),限制外部访问。
- 监控和审计: 对遗留系统进行严格的监控和日志记录,以便及时发现异常活动。
- 风险接受: 在某些特定情况下,如果迁移成本过高且风险可控(例如,系统不再用于关键业务,数据不敏感且访问权限严格受限),可能需要接受一定的风险,但这不是推荐做法。
- 结论: 这是一个复杂的问题,需要权衡安全性、成本、时间和业务连续性。通常的策略是尽可能地升级、增加安全层或隔离。
这张幻灯片鼓励学生深入思考安全协议在实际应用中的决策、挑战和最佳实践。