feat: add cybersecurity topic with 6 subtopics (204 questions)
Deploy Examination / deploy (push) Successful in 7s

New topic group: 网络安全专题 (cybersecurity)
Subtopics:
- web-security: Web 安全基础 (34 questions)
- crypto-basics: 密码学基础 (34 questions)
- buffer-overflow: 缓冲区溢出与漏洞利用 (34 questions)
- os-security: 操作系统安全 (34 questions)
- network-attack: 网络攻防 (34 questions)
- secure-coding: 安全编程实践 (34 questions)

Question types per subtopic:
- single_choice × 20
- true_false × 10
- short_answer × 3
- code_reading × 1

Difficulty range: 1-3 (基础)
This commit is contained in:
2026-09-17 13:33:04 +08:00
parent da9667c265
commit 70e368e235
31 changed files with 4516 additions and 1 deletions
@@ -0,0 +1,54 @@
{
"topic": "crypto-basics",
"type": "code_reading",
"schema_version": "1.0.0",
"generated": "2026-09-17T00:00:00+08:00",
"questions": [
{
"id": "cr-001",
"type": "code_reading",
"difficulty": 2,
"tags": [
"密码学",
"哈希",
"加密",
"数字签名"
],
"question": "阅读以下 Python 代码,回答问题。",
"code": "import hashlib\nimport hmac\nimport secrets\n\n# ========== 第一部分:哈希计算 ==========\ndef compute_sha256(message: str) -> str:\n \"\"\"计算字符串的 SHA-256 哈希值\"\"\"\n return hashlib.sha256(message.encode('utf-8')).hexdigest()\n\n# ========== 第二部分:HMAC 认证 ==========\ndef generate_hmac(key: bytes, message: str) -> str:\n \"\"\"使用 HMAC-SHA256 生成消息认证码\"\"\"\n return hmac.new(key, message.encode('utf-8'), hashlib.sha256).hexdigest()\n\ndef verify_hmac(key: bytes, message: str, expected_mac: str) -> bool:\n \"\"\"验证 HMAC,使用 compare_digest 防止时序攻击\"\"\"\n computed_mac = generate_hmac(key, message)\n return hmac.compare_digest(computed_mac, expected_mac)\n\n# ========== 第三部分:简单密码哈希 ==========\ndef hash_password(password: str) -> str:\n salt = secrets.token_hex(16) # 32 字符的随机盐\n salted = salt + password\n hash_val = compute_sha256(salted)\n return f\"{salt}${hash_val}\"\n\ndef check_password(stored: str, password: str) -> bool:\n salt, hash_val = stored.split('$', 1)\n return compute_sha256(salt + password) == hash_val\n\n# ========== 主程序 ==========\nif __name__ == '__main__':\n msg = \"Hello, Cryptography!\"\n print(f\"SHA-256: {compute_sha256(msg)}\")\n\n key = secrets.token_bytes(32)\n mac = generate_hmac(key, msg)\n print(f\"HMAC: {mac}\")\n print(f\"Verify: {verify_hmac(key, msg, mac)}\")\n\n stored = hash_password(\"my_secret_123\")\n print(f\"Stored: {stored}\")\n print(f\"Check: {check_password(stored, 'my_secret_123')}\")",
"language": "python",
"sub_questions": [
{
"index": 1,
"type": "short_answer",
"question": "函数 generate_hmac 与直接对消息做 SHA-256 哈希相比,核心区别是什么?为什么 verify_hmac 中使用 hmac.compare_digest 而不是普通的 == 运算符?",
"answer": "核心区别:generate_hmac 使用 HMAC(基于密钥的哈希消息认证码),除了保证消息完整性外,还提供了消息认证(即只有持有共享密钥的人才能生成合法的 MAC);而普通 SHA-256 哈希不涉及密钥,任何人都可以计算,仅能用于完整性校验,无法验证消息来源。使用 hmac.compare_digest 是因为它执行恒定时间的字符串比较,可以防止时序攻击(timing attack)——如果使用 ==,Python 的字符串比较会在发现第一个不匹配字符时立即返回,攻击者可以通过测量响应时间逐字节猜测正确的 MAC 值。",
"explanation": "HMAC 是密码学中最常用的消息认证码构造方式,由 Bellare 等人于 1996 年提出。它将密钥与消息结合进行哈希,安全性可归约到底层哈希函数的性质。时序攻击是侧信道攻击的一种,compare_digest 是 Python 标准库提供的安全比较函数。"
},
{
"index": 2,
"type": "single_choice",
"question": "函数 hash_password 中使用 secrets.token_hex(16) 生成盐值。以下关于盐(salt)在密码哈希中作用的描述,哪一项最准确?",
"options": {
"A": "盐的主要作用是增加密码的熵,使暴力破解单个密码所需时间大幅增加",
"B": "盐的主要作用是确保即使两个用户使用相同密码,其存储的哈希值也不同,从而防止彩虹表攻击",
"C": "盐的主要作用是对密码进行加密,使攻击者无法直接读取原始密码",
"D": "盐的主要作用是缩短哈希值长度,节省存储空间"
},
"answer": "B",
"explanation": "盐是一个随机值,与密码拼接后再哈希。其核心目的是打消预计算攻击(彩虹表攻击):因为每个用户的盐不同,攻击者无法为常见密码预先计算哈希表。即使两个用户使用相同密码,由于盐不同,最终哈希值也完全不同。选项 A 描述不准确——盐不增加密码本身的熵;选项 C 混淆了哈希与加密的概念;选项 D 与盐的功能无关。"
},
{
"index": 3,
"type": "short_answer",
"question": "当前 hash_password 的实现使用了单次 SHA-256 哈希加盐。请指出这种实现的一个主要安全缺陷,并提出具体的改进建议。",
"answer": "主要安全缺陷:SHA-256 计算速度极快(现代 GPU 可达每秒数十亿次哈希),这使得暴力破解和字典攻击非常高效。即使有盐,攻击者获得哈希值后仍可对单个目标进行高速离线破解。改进建议:应使用专用的慢哈希算法替代单次 SHA-256,如 bcrypt、scrypt 或 Argon2。这些算法内置了盐处理、可调节的工作因子(迭代次数/内存消耗/并行度),能显著增加离线破解的成本。例如使用 Python 的 bcrypt 库:import bcrypt; hashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt(rounds=12))。",
"explanation": "这是密码存储领域的经典考点。NIST 等标准机构不推荐使用普通哈希函数(即使是加盐的)存储密码。bcrypt 是最广泛采用的方案,Argon2 是 2015 年密码哈希竞赛(PHC)的获胜算法,被认为是目前最佳选择。"
}
],
"explanation": "本题通过一段真实的 Python 密码学代码,考察学生对哈希、HMAC 和密码存储三个核心概念的理解。第一部分是基础哈希计算;第二部分引入密钥和消息认证;第三部分模拟密码存储场景,故意使用不安全的实现来考察学生的安全分析能力。三个子题从概念理解、原理辨析到实际安全评估,难度递进。",
"source": null,
"related": []
}
]
}
@@ -0,0 +1,29 @@
{
"slug": "crypto-basics",
"name": "密码学基础",
"description": "对称/非对称加密、哈希、数字签名、PKI",
"tags": [
"密码学",
"加密",
"哈希",
"数字签名",
"pki",
"证书"
],
"created": "2026-09-17",
"question_files": [
"code_reading.json",
"short_answer.json",
"single_choice.json",
"true_false.json"
],
"stats": {
"total": 34,
"by_type": {
"code_reading": 1,
"short_answer": 3,
"single_choice": 20,
"true_false": 10
}
}
}
@@ -0,0 +1,89 @@
{
"topic": "crypto-basics",
"type": "short_answer",
"schema_version": "1.0.0",
"generated": "2026-09-17T00:00:00+08:00",
"questions": [
{
"id": "sa-001",
"type": "short_answer",
"difficulty": 1,
"tags": [
"密码学",
"哈希"
],
"question": "什么是密码学哈希函数?请列举密码学哈希函数的三个核心安全性质,并简要说明每个性质的含义。",
"answer": "密码学哈希函数是一种将任意长度的输入映射为固定长度输出的单向函数,广泛用于数据完整性校验、数字签名和密码存储等场景。其三个核心安全性质为:(1)抗原像性(Pre-image Resistance):给定哈希值 h,在计算上难以找到任意消息 m 使得 H(m) = h;(2)抗第二原像性(Second Pre-image Resistance):给定消息 m1,在计算上难以找到另一个不同的消息 m2 使得 H(m1) = H(m2);(3)抗碰撞性(Collision Resistance):在计算上难以找到任意两个不同的消息 m1 和 m2 使得 H(m1) = H(m2)。",
"keywords": [
"哈希函数",
"单向函数",
"抗原像性",
"抗碰撞性",
"抗第二原像性",
"固定长度输出",
"SHA-256"
],
"scoring_rubric": "定义正确得 3 分;三个性质各 2 分(名称正确 1 分,含义准确 1 分);满分 9 分。若仅给出定义但未列出性质,最高 3 分;性质名称正确但含义不准确扣 1 分。",
"explanation": "密码学哈希函数是密码学的基础构件之一。与普通哈希函数不同,密码学哈希函数需要满足严格的安全性质。抗原像性保证了从哈希值无法反推出原始消息(单向性);抗第二原像性保证了给定一个消息,无法找到另一个产生相同哈希值的消息;抗碰撞性则是最强的保证,即无法找到任意一对碰撞消息。常见算法包括 SHA-256、SHA-3 等。MD5 和 SHA-1 因已被发现碰撞而不再被视为安全。",
"source": null,
"related": []
},
{
"id": "sa-002",
"type": "short_answer",
"difficulty": 2,
"tags": [
"密码学",
"加密",
"数字签名",
"pki"
],
"question": "请比较对称加密与非对称加密的工作原理、典型应用场景及各自的优缺点。为什么在实际系统中(如 TLS)通常将两者结合使用?",
"answer": "对称加密使用相同的密钥进行加密和解密(如 AES、ChaCha20),优点是加解密速度快、适合大数据量处理,缺点是密钥分发困难——通信双方必须事先安全共享密钥。非对称加密使用一对密钥(公钥加密、私钥解密,如 RSA、ECC),优点是无需安全信道分发密钥、支持数字签名,缺点是计算开销大、速度慢。在实际系统如 TLS 中,两者结合使用:利用非对称加密(或密钥交换协议如 ECDHE)在握手阶段安全协商出一个对称会话密钥,之后的数据传输使用该对称密钥进行高效加密。这种方式兼顾了安全性(安全密钥协商)和性能(高效数据传输)。",
"keywords": [
"对称加密",
"非对称加密",
"AES",
"RSA",
"ECC",
"密钥分发",
"TLS",
"会话密钥",
"混合加密"
],
"scoring_rubric": "对称加密原理和优缺点 3 分;非对称加密原理和优缺点 3 分;结合使用的原因和机制 4 分;满分 10 分。缺少具体算法名称不扣分,但原理描述错误扣相应分数。",
"explanation": "对称加密和非对称加密是现代密码学的两大支柱。对称加密速度快但面临密钥分发难题;非对称加密解决了密钥分发问题但性能受限。实际协议(TLS、SSH、PGP 等)普遍采用混合加密方案:用非对称方法做身份认证和密钥协商,用对称方法做批量数据加密,取两者之长。这是信息安全课程中的核心对比知识点。",
"source": null,
"related": []
},
{
"id": "sa-003",
"type": "short_answer",
"difficulty": 3,
"tags": [
"密码学",
"数字签名",
"pki",
"证书"
],
"question": "在 PKI(公钥基础设施)体系中,数字证书起什么作用?请描述从证书申请到证书验证的完整流程,包括涉及的主要角色和 X.509 证书中的关键字段。",
"answer": "数字证书的核心作用是将公钥与实体身份进行可信绑定,解决公钥的真实性问题。完整流程如下:(1)申请:用户(Subject)生成密钥对,将公钥连同身份信息提交给 CA(证书授权机构);(2)审核与签发:CA 验证申请者身份后,用自己的私钥对证书信息进行签名,生成 X.509 格式的数字证书;(3)使用:用户将证书发送给通信对方;(4)验证:接收方使用 CA 的公钥验证证书签名,检查证书是否过期、是否被吊销(通过 CRL 或 OCSP),以及域名等信息是否匹配。X.509 证书的关键字段包括:Version(版本)、Serial Number(序列号)、Issuer(签发者 DN)、Subject(持有者 DN)、Subject Public Key Info(持有者公钥)、Validity(有效期:Not Before / Not After)、Signature Algorithm(签名算法)、Extensions(扩展,如 Subject Alternative Name)。",
"keywords": [
"PKI",
"CA",
"数字证书",
"X.509",
"公钥绑定",
"证书签名",
"证书验证",
"CRL",
"OCSP",
"证书吊销"
],
"scoring_rubric": "证书作用说明 2 分;申请流程 2 分;签发过程 2 分;验证过程 2 分;关键字段列举(至少 5 个)2 分;满分 10 分。流程顺序错误或遗漏主要角色各扣 1 分。",
"explanation": "PKI 是支撑互联网信任的基础架构。数字证书是其核心产物,本质上是 CA 对「公钥属于某个实体」这一声明的背书。理解证书生命周期(申请→审核→签发→分发→使用→验证→续期/吊销)以及信任链(Root CA → Intermediate CA → End-entity)对于理解 HTTPS、代码签名、电子邮件加密等实际应用至关重要。X.509 是最广泛使用的证书格式标准。",
"source": null,
"related": []
}
]
}
@@ -0,0 +1,412 @@
{
"topic": "crypto-basics",
"type": "single_choice",
"schema_version": "1.0.0",
"generated": "2026-09-17T00:00:00+08:00",
"questions": [
{
"id": "sc-001",
"type": "single_choice",
"difficulty": 1,
"tags": [
"密码学",
"加密"
],
"question": "以下哪种加密算法属于对称加密?",
"options": {
"A": "AES",
"B": "RSA",
"C": "ECC",
"D": "Diffie-Hellman"
},
"answer": "A",
"explanation": "AES(Advanced Encryption Standard)是对称加密算法,加密和解密使用相同的密钥。RSA 和 ECC 都是非对称加密算法,使用公钥/私钥对。Diffie-Hellman 是密钥交换协议,本身不是加密算法,但属于非对称密码学范畴。",
"source": null,
"related": []
},
{
"id": "sc-002",
"type": "single_choice",
"difficulty": 1,
"tags": [
"密码学",
"加密"
],
"question": "AES 支持的密钥长度不包括以下哪一项?",
"options": {
"A": "128 位",
"B": "192 位",
"C": "256 位",
"D": "512 位"
},
"answer": "D",
"explanation": "AES 标准支持三种密钥长度:128 位、192 位和 256 位,分别对应 AES-128、AES-192 和 AES-256。512 位不是 AES 标准定义的密钥长度。更长的密钥通常意味着更高的安全性,但 AES 最高只定义到 256 位。",
"source": null,
"related": []
},
{
"id": "sc-003",
"type": "single_choice",
"difficulty": 2,
"tags": [
"密码学",
"加密"
],
"question": "关于 DES 和 3DES,以下说法正确的是?",
"options": {
"A": "DES 使用 128 位密钥,安全性很高",
"B": "3DES 通过对数据执行三次 DES 加密来提升安全性",
"C": "DES 目前仍被认为是最安全的对称加密标准",
"D": "3DES 的密钥有效长度为 168 位,不存在任何已知弱点"
},
"answer": "B",
"explanation": "3DES(Triple DES)通过对数据执行三次 DES 加密(通常使用加密-解密-加密 EDE 模式)来提升安全性。DES 实际使用 56 位密钥(加 8 位校验),已被证明不够安全。3DES 的有效密钥长度为 112 位(两密钥模式)或 168 位(三密钥模式),但存在中间相遇攻击等弱点,NIST 已在 2023 年正式废弃 3DES。",
"source": null,
"related": []
},
{
"id": "sc-004",
"type": "single_choice",
"difficulty": 2,
"tags": [
"密码学",
"加密"
],
"question": "RSA 算法的安全性基于以下哪个数学难题?",
"options": {
"A": "离散对数问题",
"B": "大整数质因数分解问题",
"C": "背包问题",
"D": "椭圆曲线离散对数问题"
},
"answer": "B",
"explanation": "RSA 的安全性基于大整数质因数分解的困难性:将两个大素数相乘很容易,但将乘积分解回原来的两个素数在计算上极其困难。离散对数问题对应的是 Diffie-Hellman 和 DSA 等算法的基础。椭圆曲线离散对数问题(ECDLP)是 ECC 算法的安全性基础。",
"source": null,
"related": []
},
{
"id": "sc-005",
"type": "single_choice",
"difficulty": 2,
"tags": [
"密码学",
"加密"
],
"question": "与 RSA 相比,ECC(椭圆曲线密码学)的主要优势是什么?",
"options": {
"A": "加解密速度更快,但需要更长的密钥",
"B": "在相同安全强度下,所需密钥长度更短",
"C": "ECC 不依赖任何数学难题,因此绝对安全",
"D": "ECC 只能用于签名,不能用于加密"
},
"answer": "B",
"explanation": "ECC 最大的优势是在提供相同安全强度的情况下,所需的密钥长度远小于 RSA。例如 256 位 ECC 密钥的安全强度约等于 3072 位 RSA 密钥,这意味着更小的存储空间、更快的计算和更低的带宽消耗。ECC 的安全性基于椭圆曲线离散对数问题,并非绝对安全,且 ECC 既可用于密钥交换和加密,也可用于数字签名。",
"source": null,
"related": []
},
{
"id": "sc-006",
"type": "single_choice",
"difficulty": 1,
"tags": [
"密码学",
"哈希"
],
"question": "以下关于哈希函数的描述,正确的是?",
"options": {
"A": "哈希函数是可逆的,可以从哈希值恢复原始数据",
"B": "哈希函数将任意长度的输入映射为固定长度的输出",
"C": "哈希函数的输出长度随输入长度线性增长",
"D": "不同的输入一定产生不同的哈希值"
},
"answer": "B",
"explanation": "哈希函数的核心特性是将任意长度的输入映射为固定长度的输出,例如 SHA-256 始终输出 256 位。哈希函数是单向函数,不可从哈希值逆向恢复原始数据。由于输出空间有限而输入空间无限,理论上不同的输入可能产生相同的哈希值(碰撞),所以\"不同输入一定产生不同哈希值\"是错误的。",
"source": null,
"related": []
},
{
"id": "sc-007",
"type": "single_choice",
"difficulty": 2,
"tags": [
"密码学",
"哈希"
],
"question": "MD5 算法目前被认为不安全的主要原因是什么?",
"options": {
"A": "MD5 的输出长度只有 32 位,太短",
"B": "MD5 已被发现存在实际可行的碰撞攻击",
"C": "MD5 是对称加密算法,密钥太短",
"D": "MD5 的计算速度太慢,不适合实际应用"
},
"answer": "B",
"explanation": "MD5 的输出长度实际是 128 位(通常以 32 位十六进制字符串表示),不是 32 位。MD5 不是加密算法而是哈希函数,不存在密钥的概念。MD5 的计算速度其实很快,但这反而有利于碰撞攻击。MD5 不安全的根本原因是 2004 年王小云教授等人展示了实际可行的碰撞攻击,此后碰撞实例不断被构造出来,因此不应再用于安全场景。",
"source": null,
"related": []
},
{
"id": "sc-008",
"type": "single_choice",
"difficulty": 1,
"tags": [
"密码学",
"哈希"
],
"question": "SHA-256 产生的哈希值长度是多少位?",
"options": {
"A": "128 位",
"B": "160 位",
"C": "256 位",
"D": "512 位"
},
"answer": "C",
"explanation": "SHA-256 是 SHA-2 家族的成员,顾名思义,它产生 256 位(32 字节)的哈希值,通常用 64 个十六进制字符表示。SHA-1 产生 160 位输出,SHA-512 产生 512 位输出。128 位是 MD5 的输出长度。",
"source": null,
"related": []
},
{
"id": "sc-009",
"type": "single_choice",
"difficulty": 2,
"tags": [
"密码学",
"数字签名"
],
"question": "数字签名的主要功能不包括以下哪一项?",
"options": {
"A": "身份认证",
"B": "数据完整性保护",
"C": "数据加密",
"D": "不可否认性"
},
"answer": "C",
"explanation": "数字签名的三大核心功能是:身份认证(确认签名者身份)、数据完整性(确保数据未被篡改)和不可否认性(签名者不能否认签名行为)。数字签名本身不提供数据加密功能,虽然签名过程中会用到非对称加密技术,但签名结果并不对原始数据进行保密处理。若需同时加密,通常需要将数字签名与加密机制结合使用。",
"source": null,
"related": []
},
{
"id": "sc-010",
"type": "single_choice",
"difficulty": 2,
"tags": [
"密码学",
"数字签名"
],
"question": "在数字签名过程中,发送方用什么密钥对消息摘要进行签名?",
"options": {
"A": "接收方的公钥",
"B": "接收方的私钥",
"C": "发送方的公钥",
"D": "发送方的私钥"
},
"answer": "D",
"explanation": "数字签名的基本流程是:发送方先对消息计算哈希得到消息摘要,然后用自己的私钥对摘要进行加密(签名)。接收方收到后用发送方的公钥解密(验签),再与自己计算的摘要比对。使用发送方的私钥签名可以确保只有持有私钥的人才能生成该签名,从而实现身份认证和不可否认性。",
"source": null,
"related": []
},
{
"id": "sc-011",
"type": "single_choice",
"difficulty": 1,
"tags": [
"密码学",
"PKI",
"证书"
],
"question": "PKI(公钥基础设施)中,CA 的主要职责是什么?",
"options": {
"A": "生成对称加密密钥",
"B": "颁发和管理数字证书",
"C": "对所有网络流量进行加密",
"D": "存储用户的私钥"
},
"answer": "B",
"explanation": "CA(Certificate Authority,证书颁发机构)是 PKI 的核心组件,主要负责颁发、续期、吊销和管理数字证书。CA 通过验证实体(个人、组织、服务器等)的身份后,将其公钥与身份信息绑定在数字证书中。CA 不负责生成对称密钥或加密所有网络流量,而用户的私钥应由用户自己安全保管,不应存储在 CA 端。",
"source": null,
"related": []
},
{
"id": "sc-012",
"type": "single_choice",
"difficulty": 2,
"tags": [
"密码学",
"PKI",
"证书"
],
"question": "X.509 数字证书中通常不包含以下哪项信息?",
"options": {
"A": "证书持有者的公钥",
"B": "证书持有者的私钥",
"C": "颁发该证书的 CA 信息",
"D": "证书的有效期"
},
"answer": "B",
"explanation": "X.509 证书包含持有者的公钥、持有者的身份信息(如域名、组织名)、颁发机构(CA)的信息、有效期、序列号以及 CA 的数字签名等内容。证书中绝对不包含持有者的私钥,私钥必须由持有者自行秘密保管。证书的本质是将公钥与身份信息绑定的可信声明,如果包含私钥就会导致严重的安全问题。",
"source": null,
"related": []
},
{
"id": "sc-013",
"type": "single_choice",
"difficulty": 2,
"tags": [
"密码学",
"PKI",
"证书"
],
"question": "当浏览器访问 HTTPS 网站时发现证书已过期,这违反了以下哪项证书检查?",
"options": {
"A": "证书链验证",
"B": "有效期检查",
"C": "证书吊销检查",
"D": "域名匹配检查"
},
"answer": "B",
"explanation": "证书包含一个明确的有效期(notBefore 和 notAfter 字段),浏览器在验证证书时会检查当前时间是否在有效期内。如果证书已过期,说明有效期检查失败。证书链验证是检查证书是否由受信任的 CA 签发;吊销检查是通过 CRL 或 OCSP 确认证书是否被提前撤销;域名匹配检查是确认证书中的域名与实际访问的域名一致。",
"source": null,
"related": []
},
{
"id": "sc-014",
"type": "single_choice",
"difficulty": 3,
"tags": [
"密码学",
"PKI"
],
"question": "以下哪种机制用于实时查询证书是否已被吊销?",
"options": {
"A": "CRL(证书吊销列表)",
"B": "OCSP(在线证书状态协议)",
"C": "TLS 握手",
"D": "DNS 解析"
},
"answer": "B",
"explanation": "OCSP(Online Certificate Status Protocol,在线证书状态协议)允许客户端实时向 OCSP 响应器查询单个证书的吊销状态,相比 CRL 更加即时和高效。CRL 虽然也用于检查证书吊销状态,但它是周期性发布的完整列表,实时性较差。TLS 握手是建立加密连接的过程,DNS 解析是域名到 IP 的映射,两者都不是证书吊销检查机制。",
"source": null,
"related": []
},
{
"id": "sc-015",
"type": "single_choice",
"difficulty": 2,
"tags": [
"密码学",
"加密"
],
"question": "关于分组密码的工作模式,以下哪项说法正确?",
"options": {
"A": "ECB 模式对相同明文块总是产生相同的密文块,因此模式安全性较差",
"B": "所有工作模式都能完全防止重放攻击",
"C": "CBC 模式不需要初始化向量(IV)",
"D": "CTR 模式将分组密码转换为流密码,因此不需要密钥"
},
"answer": "A",
"explanation": "ECB(Electronic Codebook)模式对每个明文块独立加密,相同明文块总是产生相同密文块,这会泄露数据模式,因此安全性较差,不适合加密大量数据。CBC 模式需要一个随机的初始化向量(IV)来确保相同明文产生不同密文。CTR 模式虽然将分组密码转换为类似流密码的模式,但仍需要密钥来驱动分组加密运算。工作模式本身并不能防止重放攻击。",
"source": null,
"related": []
},
{
"id": "sc-016",
"type": "single_choice",
"difficulty": 3,
"tags": [
"密码学",
"加密"
],
"question": "Diffie-Hellman 密钥交换协议容易受到以下哪种攻击?",
"options": {
"A": "已知明文攻击",
"B": "中间人攻击",
"C": "差分密码分析",
"D": "线性密码分析"
},
"answer": "B",
"explanation": "原始的 Diffie-Hellman 密钥交换协议不包含身份认证机制,因此容易受到中间人攻击(MITM)。攻击者可以分别与通信双方建立独立的密钥交换,从而拦截和篡改所有通信内容。已知明文攻击、差分密码分析和线性密码分析主要针对分组密码,不是 DH 密钥交换的主要威胁。实际应用中通常结合数字证书或数字签名来抵御中间人攻击。",
"source": null,
"related": []
},
{
"id": "sc-017",
"type": "single_choice",
"difficulty": 3,
"tags": [
"密码学",
"哈希"
],
"question": "HMAC(基于哈希的消息认证码)相比普通哈希函数多了什么安全特性?",
"options": {
"A": "更快的计算速度",
"B": "更长的输出长度",
"C": "消息认证,能验证消息来源和完整性",
"D": "数据加密能力"
},
"answer": "C",
"explanation": "HMAC 将密钥与哈希函数结合使用,能够同时验证消息的完整性和来源真实性(消息认证)。只有持有正确密钥的人才能生成有效的 HMAC 值,而普通哈希函数不涉及密钥,任何人计算同一消息的哈希值都相同,因此无法验证消息来源。HMAC 并不提供加密能力,其输出长度与所使用的哈希函数相同,计算速度也与底层哈希函数相当。",
"source": null,
"related": []
},
{
"id": "sc-018",
"type": "single_choice",
"difficulty": 3,
"tags": [
"密码学",
"加密"
],
"question": "以下哪种攻击方式针对的是密钥交换过程而非加密算法本身?",
"options": {
"A": "暴力破解",
"B": "生日攻击",
"C": "中间人攻击",
"D": "彩虹表攻击"
},
"answer": "C",
"explanation": "中间人攻击针对的是密钥交换或通信建立过程,攻击者在通信双方之间插入自己,分别与双方建立独立连接。暴力破解是尝试所有可能的密钥来破解加密算法;生日攻击是针对哈希函数碰撞的攻击方法;彩虹表攻击是针对密码哈希的预计算表攻击。这三种攻击都不是直接针对密钥交换过程的。",
"source": null,
"related": []
},
{
"id": "sc-019",
"type": "single_choice",
"difficulty": 3,
"tags": [
"密码学",
"加密",
"密钥管理"
],
"question": "在密钥管理的最佳实践中,以下哪项做法是正确的?",
"options": {
"A": "将加密密钥硬编码在源代码中以便于使用",
"B": "所有系统共享同一个密钥以简化管理",
"C": "定期轮换密钥,并安全销毁不再使用的旧密钥",
"D": "将密钥与加密数据存储在同一个数据库中"
},
"answer": "C",
"explanation": "定期轮换密钥是密钥管理的核心最佳实践,可以限制单个密钥泄露造成的影响范围。旧密钥不再使用时应安全销毁,防止被攻击者获取。将密钥硬编码在源代码中会导致密钥随代码泄露;所有系统共享同一密钥违反最小权限原则,且一旦泄露影响范围巨大;密钥与加密数据存储在同一位置违反了密钥分离原则,攻击者获取数据的同时也会获取解密密钥。",
"source": null,
"related": []
},
{
"id": "sc-020",
"type": "single_choice",
"difficulty": 1,
"tags": [
"密码学",
"加密"
],
"question": "对称加密和非对称加密的根本区别是什么?",
"options": {
"A": "对称加密速度慢,非对称加密速度快",
"B": "对称加密使用同一密钥加密和解密,非对称加密使用不同的密钥",
"C": "对称加密不安全,非对称加密绝对安全",
"D": "对称加密只能加密文本,非对称加密可以加密任何数据"
},
"answer": "B",
"explanation": "对称加密和非对称加密的根本区别在于密钥的使用方式:对称加密使用同一个密钥进行加密和解密,通信双方必须安全地共享该密钥;非对称加密使用一对密钥(公钥和私钥),公钥加密的数据只有对应私钥才能解密。实际上对称加密通常比非对称加密速度更快,两者都能加密各种类型的数据,且两者都不是绝对安全的。",
"source": null,
"related": []
}
]
}
@@ -0,0 +1,150 @@
{
"topic": "crypto-basics",
"type": "true_false",
"schema_version": "1.0.0",
"generated": "2026-09-17T00:00:00+08:00",
"questions": [
{
"id": "tf-001",
"type": "true_false",
"difficulty": 1,
"tags": [
"密码学",
"加密"
],
"question": "对称加密算法中,加密和解密使用相同的密钥。",
"answer": true,
"explanation": "对称加密的核心特征就是加密和解密共享同一个密钥。发送方用该密钥对明文进行加密,接收方用同一个密钥对密文进行解密。常见算法如 AES、DES、3DES 都属于对称加密。由于双方必须持有同一密钥,密钥的分发和管理是对称加密面临的主要挑战。",
"source": null,
"related": []
},
{
"id": "tf-002",
"type": "true_false",
"difficulty": 1,
"tags": [
"密码学",
"加密"
],
"question": "非对称加密算法(如 RSA)中,用公钥加密的数据只能用对应的私钥解密。",
"answer": true,
"explanation": "非对称加密使用一对数学相关的密钥:公钥和私钥。公钥可以公开分发,用于加密数据;只有持有对应私钥的人才能解密这些数据。这一机制解决了对称加密中密钥分发的难题,是 HTTPS、数字签名等安全协议的基础。RSA、ECC、ElGamal 都是典型的非对称加密算法。",
"source": null,
"related": []
},
{
"id": "tf-003",
"type": "true_false",
"difficulty": 2,
"tags": [
"密码学",
"加密"
],
"question": "非对称加密的计算速度通常比对称加密快,因此适合加密大量数据。",
"answer": false,
"explanation": "事实恰恰相反。非对称加密(如 RSA)涉及大数幂运算等复杂数学操作,计算开销远大于对称加密(如 AES 的位运算和查表操作),速度通常慢几个数量级。因此在实际应用中,常见做法是用非对称加密来安全交换一个对称会话密钥,再用该对称密钥加密后续的大量数据,这就是混合加密体制的由来。",
"source": null,
"related": []
},
{
"id": "tf-004",
"type": "true_false",
"difficulty": 2,
"tags": [
"哈希",
"密码学"
],
"question": "密码学哈希函数(如 SHA-256)是可逆的,即可以从哈希值推导出原始输入。",
"answer": false,
"explanation": "密码学哈希函数被设计为单向函数(one-way function),从输入计算哈希值很容易,但从哈希值反推输入在计算上是不可行的。这是哈希函数的核心安全属性之一。如果哈希可逆,那么密码存储、数字签名、完整性校验等依赖哈希的机制都会彻底崩溃。SHA-256、SHA-3、BLAKE2 等都满足这一单向性要求。",
"source": null,
"related": []
},
{
"id": "tf-005",
"type": "true_false",
"difficulty": 2,
"tags": [
"哈希",
"密码学"
],
"question": "不同的输入经过密码学哈希函数计算后,一定会产生不同的输出(哈希值)。",
"answer": false,
"explanation": "由于哈希函数的输出长度固定(如 SHA-256 输出 256 位),而输入空间是无限的,根据鸽巢原理,必然存在不同输入产生相同输出的情况,这称为哈希碰撞(collision)。密码学哈希函数的安全性要求是使找到碰撞在计算上不可行,而非完全不存在碰撞。MD5 和 SHA-1 就是因为被发现存在实际可利用的碰撞而被弃用。",
"source": null,
"related": []
},
{
"id": "tf-006",
"type": "true_false",
"difficulty": 1,
"tags": [
"哈希",
"密码学"
],
"question": "MD5 算法目前仍被广泛推荐用于密码存储和安全证书签名。",
"answer": false,
"explanation": "MD5 已被证明存在严重的安全漏洞,研究人员可以在普通计算机上快速构造碰撞。早在 2004 年,王小云教授团队就展示了 MD5 碰撞攻击的实际可行性。目前 MD5 不应再用于任何安全敏感的场景,包括密码存储和证书签名。现代应用应使用 SHA-256、SHA-3 或 BLAKE2 等更安全的哈希算法,密码存储则推荐 bcrypt、scrypt 或 Argon2。",
"source": null,
"related": []
},
{
"id": "tf-007",
"type": "true_false",
"difficulty": 2,
"tags": [
"数字签名",
"密码学"
],
"question": "数字签名过程中,发送方使用自己的私钥对消息的哈希值进行签名,接收方使用发送方的公钥进行验证。",
"answer": true,
"explanation": "数字签名的工作流程是:发送方先对消息计算哈希值,然后用自己的私钥对哈希值进行加密(签名),接收方用发送方的公钥解密签名得到哈希值,再与自己计算的消息哈希值比对。这一过程同时实现了身份认证(只有私钥持有者能生成该签名)和完整性验证(哈希值匹配说明消息未被篡改)。RSA 签名、ECDSA 等都是遵循这一原理的算法。",
"source": null,
"related": []
},
{
"id": "tf-008",
"type": "true_false",
"difficulty": 3,
"tags": [
"数字签名",
"密码学"
],
"question": "数字签名能同时提供消息完整性、身份认证和不可否认性。",
"answer": true,
"explanation": "数字签名提供了三大安全属性:第一,完整性——签名是对消息哈希值的加密,任何篡改都会导致验证失败;第二,身份认证——只有持有私钥的人才能生成有效签名,因此可以确认消息来源;第三,不可否认性——由于私钥只有签名者持有,签名者事后无法否认自己曾签署过该消息,这在法律和商业场景中尤为重要。这三大属性使数字签名成为电子合同、软件发布签名等场景的核心技术。",
"source": null,
"related": []
},
{
"id": "tf-009",
"type": "true_false",
"difficulty": 2,
"tags": [
"PKI",
"证书",
"密码学"
],
"question": "在 PKI(公钥基础设施)体系中,数字证书是由证书颁发机构(CA)签发的,用于将公钥与实体身份进行绑定。",
"answer": true,
"explanation": "PKI 的核心组件就是数字证书和 CA。证书颁发机构(CA)在验证申请者身份后,用自己的私钥对包含申请者公钥和身份信息的证书进行签名,生成数字证书。依赖方(如浏览器)通过验证 CA 的签名来确认证书的真实性,从而信任证书中的公钥确实属于声称的实体。X.509 是最常用的证书标准,TLS/SSL、S/MIME 等协议都依赖此机制。",
"source": null,
"related": []
},
{
"id": "tf-010",
"type": "true_false",
"difficulty": 3,
"tags": [
"PKI",
"证书",
"密码学"
],
"question": "如果一个网站的数字证书已过期,浏览器会自动信任该证书并建立安全连接,不会有任何警告。",
"answer": false,
"explanation": "浏览器在建立 TLS 连接时会严格检查证书的有效期。如果证书已过期,浏览器会立即中断连接并显示明显的安全警告页面,提示用户该连接不安全。有效期是证书的重要约束字段,CA 在签发证书时设定合理期限(通常 1-2 年),过期后证书失效。这是 PKI 体系中限制私钥泄露影响范围的重要机制——即使私钥泄露,过期后证书也会自动失效,降低了持续风险。",
"source": null,
"related": []
}
]
}