希赛王勇.2021.软考高级系统架构设计师

0 阅读7分钟

这是一个非常独特的需求。通常大家提到“软考信息安全工程师”,想到的都是背诵、刷题和枯燥的规范。但如果我们将考点视为构建数字世界的“源代码”,那么每一个核心知识点其实都是一段逻辑严密的代码实现。

以下是一篇结合了 个人观点 与 代码示例 的文章。我将 2021 年软考信息安全工程师的高频考点,转化为 Python 代码片段,通过编程的视角重新解读这些安全概念。

代码视角下的 2021 软考信息安全工程师:用 Python 破译核心考点

文 / 安全极客的备考笔记

2021 年的软考信息安全工程师考试已经落下帷幕,但知识体系却历久弥新。在备考过程中,很多人面对厚厚的教材感到窒息:对称加密、非对称加密、PKI 体系、访问控制模型……这些概念抽象且晦涩。

作为一名开发者,在备考时我习惯用编程思维去解构这些考点。我认为,安全不是死记硬背的条文,而是一段段运行在系统底层的逻辑代码。  如果你能把这些知识点写成代码,考试对你来说就不再是默写,而是“Code Review”。

以下是我基于 2021 年高频考点,用 Python 编写的一组“核心考点速记代码”。这不仅是一份备考手册,更是我对安全机制的代码级解读。

考点一:PKI 体系与数字签名机制

【个人观点】
很多人搞不懂“数字签名”和“加密”的区别,更理不清 CA 证书的链条。其实,这就是面向对象编程中的 封装 与 继承。发送方用自己的私钥签名(封装身份),接收方用公钥验签(检查继承来源)。

【代码实现】
这段代码演示了 PKI 的核心:私钥签名、公钥验签,以及不可伪造性。

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization
from cryptography.exceptions import InvalidSignature

class PKI_Entity:
    def __init__(self, name):
        self.name = name
        # 生成私钥 (对应考点:非对称加密算法 RSA)
        self.private_key = rsa.generate_private_key(
            public_exponent=65537,
            key_size=2048,
        )
        # 提取公钥
        self.public_key = self.private_key.public_key()

    def sign_data(self, data: bytes) -> bytes:
        """
        对应考点:数字签名过程
        1. 使用发送方的私钥
        2. 对摘要进行加密
        """
        signature = self.private_key.sign(
            data,
            padding.PSS(
                mgf=padding.MGF1(hashes.SHA256()),
                salt_length=padding.PSS.MAX_LENGTH
            ),
            hashes.SHA256()
        )
        return signature

    def verify_signature(self, data: bytes, signature: bytes, sender_public_key):
        """
        对应考点:签名验证过程
        1. 使用发送方的公钥
        2. 解密摘要并比对
        """
        try:
            sender_public_key.verify(
                signature,
                data,
                padding.PSS(
                    mgf=padding.MGF1(hashes.SHA256()),
                    salt_length=padding.PSS.MAX_LENGTH
                ),
                hashes.SHA256()
            )
            return True
        except InvalidSignature:
            return False

# 考点速记:私钥签名用于保证不可否认性和完整性
alice = PKI_Entity("Alice")
bob = PKI_Entity("Bob")

message = b"2021 软考信息安全工程师核心考点"
sig = alice.sign_data(message)

# Bob 用 Alice 的公钥验证
is_valid = bob.verify_signature(message, sig, alice.public_key)
print(f"签名验证结果: {is_valid}") # Output: True

考点二:访问控制模型(DAC, MAC, RBAC)

【个人观点】
软考中必考的三个模型:DAC(自主)、MAC(强制)、RBAC(基于角色)。如果死记硬背容易混淆,用代码写出来一看便知。

  • DAC 是“我的是我的,我说了算”。
  • MAC 是“没有规矩不成方圆,标签决定一切”。
  • RBAC 是“在其位谋其政”。

【代码实现】
这里用 Python 模拟最复杂的 MAC(强制访问控制)  逻辑,这是 2021 年真题中关于 BLP(Bell-LaPadula)模型的高频点。

from enum import Enum, auto

class SecurityLevel(Enum):
    TOP_SECRET = auto() # 绝密
    SECRET = auto()     # 秘密
    CONFIDENTIAL = auto()# 机密
    PUBLIC = auto()     # 公开

class File:
    def __init__(self, name, level: SecurityLevel):
        self.name = name
        self.level = level # 对应考点:敏感标记

class User:
    def __init__(self, name, clearance: SecurityLevel):
        self.name = name
        self.clearance = clearance # 对应考点:安全许可证

def mac_read_check(user: User, file: File) -> bool:
    """
    对应考点:BLP 模型的“简单安全属性”(No Read Up)
    主体只能读低于或等于其安全级别的客体。
    """
    if user.clearance.value >= file.level.value:
        print(f"[允许] {user.name} 读取 {file.name}")
        return True
    else:
        print(f"[拒绝] {user.name} 权限不足,无法读取 {file.name}")
        return False

def mac_write_check(user: User, file: File) -> bool:
    """
    对应考点:BLP 模型的“星号*属性”(No Write Down)
    主体只能向高于或等于其安全级别的客体写入。
    为了防止信息从高密级流向低密级。
    """
    if user.clearance.value <= file.level.value:
        print(f"[允许] {user.name} 写入 {file.name}")
        return True
    else:
        print(f"[拒绝] {user.name} 不得向下级文件 {file.name} 写入")
        return False

# 模拟考试场景
secret_agent = User("007", SecurityLevel.SECRET)
top_secret_file = File("Nuclear_Launch_Codes", SecurityLevel.TOP_SECRET)
public_file = File("News_Release", SecurityLevel.PUBLIC)

# 考点考察:No Read Up -> 007 (Secret) 不能读 Top Secret
mac_read_check(secret_agent, top_secret_file) # 应该被拒绝

# 考点考察:No Write Down -> 007 (Secret) 不能写 Public (防止泄密)
mac_write_check(secret_agent, public_file)    # 应该被拒绝

考点三:网络攻防之 SQL 注入与防御

【个人观点】
Web 安全是软考下午题的常客。SQL 注入的本质是“代码与数据的混淆”。考点不仅仅是如何注入,更重要的是防御手段——预编译。

【代码实现】
对比“错误拼接”与“正确参数化查询”的区别。

import sqlite3

# 模拟数据库环境
def setup_db():
    conn = sqlite3.connect(':memory:')
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, username TEXT, password TEXT)")
    cursor.execute("INSERT INTO users VALUES (1, 'admin', 'p@ssw0rd')")
    conn.commit()
    return conn

# ==========================================
# 场景 A: 漏洞代码 (对应考点:SQL 注入原理)
# ==========================================
def vulnerable_login(username_input):
    conn = setup_db()
    cursor = conn.cursor()
    
    # 考点核心:直接字符串拼接,导致输入变成了代码的一部分
    # 攻击输入:admin' --
    query = f"SELECT * FROM users WHERE username = '{username_input}'"
    print(f"[注入检测] 执行语句: {query}")
    
    try:
        cursor.execute(query)
        result = cursor.fetchone()
        if result:
            print(f"登录成功!用户: {result}")
        else:
            print("登录失败")
    except Exception as e:
        print(f"数据库错误: {e}")

# ==========================================
# 场景 B: 安全代码 (对应考点:预编译/参数化查询)
# ==========================================
def secure_login(username_input):
    conn = setup_db()
    cursor = conn.cursor()
    
    # 考点核心:使用 ? 占位符,数据库引擎会将输入视为纯数据,而非代码
    query = "SELECT * FROM users WHERE username = ?"
    print(f"[安全检测] 执行参数化查询")
    
    cursor.execute(query, (username_input,))
    result = cursor.fetchone()
    
    if result:
        print(f"登录成功!用户: {result}")
    else:
        print("登录失败")

# 执行测试
print("--- 测试 SQL 注入 ---")
attack_payload = "admin' OR '1'='1"
vulnerable_login(attack_payload) # 成功绕过

print("\n--- 测试 参数化防御 ---")
secure_login(attack_payload) # 登录失败

考点四:IPv6 安全与 IPSec 协议

【个人观点】
IPv6 是 2021 年软考的加分项。很多人只知道 IPv6 地址长,却忘了它最大的亮点——IPSec 是原生支持的(不像 IPv4 是外挂的)。AH 和 ESP 的区别是必考题。

【代码实现】
虽然我们很难用 Python 写一个完整的内核级网络协议栈,但我们可以定义一个类结构来记忆 AH 和 ESP 的区别。

from abc import ABC, abstractmethod

class IPSec_Protocol(ABC):
    """
    对应考点:IPSec 协议簇
    """
    def __init__(self):
        self.icv_header = "完整性检查值" # 用于防篡改

    @abstractmethod
    def encrypt_payload(self):
        pass

    @abstractmethod
    def provide_authentication(self):
        pass

class AH_Protocol(IPSec_Protocol):
    """
    对应考点:AH (Authentication Header)
    1. 提供数据源认证和完整性
    2. 不加密数据(明文传输)
    3. 保护 IP 头部(不可变部分)
    """
    def encrypt_payload(self):
        return "不加密 (NO Encryption)"

    def provide_authentication(self):
        return "提供认证与完整性"

class ESP_Protocol(IPSec_Protocol):
    """
    对应考点:ESP (Encapsulating Security Payload)
    1. 提供加密、认证、完整性
    2. 加密数据(密文传输)
    3. 不保护 IP 头部
    """
    def encrypt_payload(self):
        return "加密 (Encryption)"

    def provide_authentication(self):
        return "提供认证、完整性 + 保密性"

# 考点速记:如果想保密,必须选 ESP;如果想防篡改但不介意内容泄露,可选 AH。
ah = AH_Protocol()
esp = ESP_Protocol()

print(f"AH 功能: 加密={ah.encrypt_payload()}, 认证={ah.provide_authentication()}")
print(f"ESP 功能: 加密={esp.encrypt_payload()}, 认证={esp.provide_authentication()}")

总结

通过代码来梳理 2021 软考信息安全工程师的核心考点,你会发现:

  • PKI 是一种对象关系;
  • MAC 模型 是一组 if-else 的条件判断;
  • SQL 注入 是字符串格式化的副作用;
  • IPSec 是接口的不同实现。

代码是逻辑的最小单元。当你在考场上看到题目时,不妨在脑海中运行这几段代码。这不仅能帮你选出正确答案,更能让你理解安全工程师的职责——我们是数字世界的架构师,用逻辑构建秩序,用代码抵御混沌。

希望这份速记手册能助你一臂之力!

新建对话

思考

联网