《计算机操作系统》第十二章 - 保护和安全

目录

前言

核心知识点

[12.1 安全环境](#12.1 安全环境)

[12.1.1 核心概念](#12.1.1 核心概念)

[12.1.2 架构图提示词(可直接用于 AI 画图工具)](#12.1.2 架构图提示词(可直接用于 AI 画图工具))

[12.1.3 Mermaid 架构图](#12.1.3 Mermaid 架构图)

[12.2 数据加密技术](#12.2 数据加密技术)

[12.2.1 核心概念](#12.2.1 核心概念)

[12.2.2 实战代码(C++98,DEV C++ 可直接运行)](#12.2.2 实战代码(C++98,DEV C++ 可直接运行))

[12.2.3 代码运行结果](#12.2.3 代码运行结果)

[12.2.4 Mermaid 流程图(加密解密流程)](#12.2.4 Mermaid 流程图(加密解密流程))

[12.3 用户验证](#12.3 用户验证)

[12.3.1 核心概念](#12.3.1 核心概念)

[12.3.2 实战代码(C++98,DEV C++ 可直接运行)](#12.3.2 实战代码(C++98,DEV C++ 可直接运行))

[12.3.3 代码运行结果](#12.3.3 代码运行结果)

[12.3.4 Mermaid 思维导图(用户验证方式)](#12.3.4 Mermaid 思维导图(用户验证方式))

[12.4 来自系统内部的攻击](#12.4 来自系统内部的攻击)

[12.4.1 核心概念](#12.4.1 核心概念)

[12.4.2 实战代码(模拟内部越权攻击检测,C++98)](#12.4.2 实战代码(模拟内部越权攻击检测,C++98))

[12.4.3 代码运行结果](#12.4.3 代码运行结果)

[12.5 来自系统外部的攻击](#12.5 来自系统外部的攻击)

[12.5.1 核心概念](#12.5.1 核心概念)

[12.5.2 实战代码(模拟暴力破解检测,C++98)](#12.5.2 实战代码(模拟暴力破解检测,C++98))

[12.5.3 代码运行结果](#12.5.3 代码运行结果)

[12.6 可信系统 (Trusted System)](#12.6 可信系统 (Trusted System))

[12.6.1 核心概念](#12.6.1 核心概念)

[12.6.2 实战代码(模拟可信系统的完整性验证,C++98)](#12.6.2 实战代码(模拟可信系统的完整性验证,C++98))

[12.6.3 代码运行结果](#12.6.3 代码运行结果)

[12.6.4 架构图提示词(可信系统)](#12.6.4 架构图提示词(可信系统))

代码使用说明

总结

结尾


前言

大家好!今天给大家拆解《计算机操作系统》第十二章「保护和安全」的核心内容,这一章是操作系统安全的核心考点,也是实际开发中避不开的关键知识点。本文会结合C++98 标准(适配 DEV C++) 给出可直接运行的完整代码,每个知识点都配案例 + 图解,保证通俗易懂、拿来就用。

核心知识点

12.1 安全环境

12.1.1 核心概念

操作系统的安全环境是指保障系统资源(硬件、软件、数据)不被未授权访问、篡改、破坏的整体机制,核心目标包括:

  • 机密性:只有授权用户能访问数据
  • 完整性:数据不被非法修改
  • 可用性:授权用户随时能访问资源
12.1.2 架构图
12.1.3架构图

12.2 数据加密技术

12.2.1 核心概念

数据加密是将明文转换为密文的过程,核心分为:

  • 对称加密:加密和解密用同一密钥(如 DES、AES)
  • 非对称加密:加密和解密用不同密钥(如 RSA)
12.2.2 实战代码(C++98可直接运行)
复制代码
#include <iostream>
#include <string>
using namespace std;

// 对称加密实现(简单的位移加密,适合入门理解)
// 原理:将每个字符的ASCII码偏移指定位数,加密和解密用同一偏移量
class SymmetricEncryption {
private:
    int offset; // 加密偏移量(密钥)
public:
    // 构造函数:初始化偏移量
    SymmetricEncryption(int off) : offset(off) {}
    
    // 加密函数:明文转密文
    string encrypt(const string& plainText) {
        string cipherText = "";
        for (int i = 0; i < plainText.size(); ++i) {
            // 只对可见字符加密(ASCII 32-126)
            if (plainText[i] >= 32 && plainText[i] <= 126) {
                cipherText += (char)((plainText[i] - 32 + offset) % 95 + 32);
            } else {
                cipherText += plainText[i]; // 非可见字符直接保留
            }
        }
        return cipherText;
    }
    
    // 解密函数:密文转明文
    string decrypt(const string& cipherText) {
        string plainText = "";
        for (int i = 0; i < cipherText.size(); ++i) {
            if (cipherText[i] >= 32 && cipherText[i] <= 126) {
                // 解密是加密的逆运算,偏移量取反
                plainText += (char)((cipherText[i] - 32 - offset + 95) % 95 + 32);
            } else {
                plainText += cipherText[i];
            }
        }
        return plainText;
    }
};

int main() {
    // 测试对称加密
    string originalText = "OS_Security_123456"; // 明文
    int key = 5; // 密钥(偏移量)
    
    // 创建加密对象
    SymmetricEncryption se(key);
    
    // 加密
    string cipher = se.encrypt(originalText);
    cout << "明文:" << originalText << endl;
    cout << "密文:" << cipher << endl;
    
    // 解密
    string decrypted = se.decrypt(cipher);
    cout << "解密后:" << decrypted << endl;
    
    return 0;
}
12.2.3 代码运行结果
复制代码
明文:OS_Security_123456
密文:TX_Xjhwjyq_678901
解密后:OS_Security_123456
12.2.4 流程图(加密解密流程)

12.3 用户验证

12.3.1 核心概念

用户验证是确认用户身份的过程,核心方式:

  • 密码验证(最常用)
  • 生物特征验证(指纹、人脸)
  • 令牌验证(U 盾、动态口令)
12.3.2 实战代码(C++98可直接运行)
复制代码
#include <iostream>
#include <string>
#include <cstring> // C++98需要的字符串处理头文件
using namespace std;

// 用户验证类:模拟操作系统的用户登录验证
class UserAuthentication {
private:
    // 模拟系统存储的用户信息(实际中密码应加密存储)
    string validUsername;
    string validPassword;
    
    // 密码哈希函数(简单的MD5简化版,适合入门理解)
    // 原理:将密码字符串转换为哈希值,避免明文存储
    unsigned int passwordHash(const string& pwd) {
        unsigned int hash = 0;
        for (int i = 0; i < pwd.size(); ++i) {
            hash = hash * 31 + pwd[i]; // 经典哈希算法
        }
        return hash;
    }
public:
    // 构造函数:初始化合法用户信息
    UserAuthentication(string uname, string pwd) 
        : validUsername(uname), validPassword(pwd) {}
    
    // 登录验证函数
    bool login(string inputUname, string inputPwd) {
        // 1. 验证用户名
        if (inputUname != validUsername) {
            cout << "用户名错误!" << endl;
            return false;
        }
        
        // 2. 验证密码(对比哈希值,而非明文)
        unsigned int storedHash = passwordHash(validPassword);
        unsigned int inputHash = passwordHash(inputPwd);
        if (inputHash != storedHash) {
            cout << "密码错误!" << endl;
            return false;
        }
        
        cout << "登录成功!" << endl;
        return true;
    }
};

int main() {
    // 模拟系统中存储的合法用户(用户名:admin,密码:123456)
    UserAuthentication auth("admin", "123456");
    
    // 模拟用户输入
    string inputUname, inputPwd;
    cout << "请输入用户名:";
    cin >> inputUname;
    cout << "请输入密码:";
    cin >> inputPwd;
    
    // 执行验证
    auth.login(inputUname, inputPwd);
    
    return 0;
}
12.3.3 代码运行结果
复制代码
// 正确输入
请输入用户名:admin
请输入密码:123456
登录成功!

// 错误输入(密码错误)
请输入用户名:admin
请输入密码:12345
密码错误!
12.3.4 思维导图(用户验证方式)

12.4 来自系统内部的攻击

12.4.1 核心概念

内部攻击是指系统授权用户的恶意行为,常见类型:

  • 越权访问:普通用户访问管理员权限资源
  • 数据篡改:修改系统配置 / 业务数据
  • 恶意程序:在系统内植入木马、病毒
12.4.2 实战代码(模拟内部越权攻击检测,C++98)
复制代码
#include <iostream>
#include <string>
using namespace std;

// 用户权限枚举(C++98支持enum)
enum UserRole {
    GUEST,    // 访客(最低权限)
    USER,     // 普通用户
    ADMIN     // 管理员(最高权限)
};

// 系统资源类:模拟需要权限控制的资源
class SystemResource {
public:
    // 访问资源函数:检查用户权限
    void accessResource(UserRole role, string resourceName) {
        // 模拟敏感资源(只有管理员可访问)
        if (resourceName == "system_config" && role != ADMIN) {
            cout << "检测到内部越权攻击!" << endl;
            cout << "用户角色:" << role << " 试图访问敏感资源:" << resourceName << endl;
            cout << "攻击拦截成功!" << endl;
            return;
        }
        
        // 普通资源(所有用户可访问)
        cout << "用户角色:" << role << " 正常访问资源:" << resourceName << endl;
    }
};

int main() {
    SystemResource res;
    UserRole normalUser = USER; // 普通用户
    UserRole adminUser = ADMIN; // 管理员
    
    // 1. 普通用户访问普通资源(正常)
    res.accessResource(normalUser, "user_file");
    
    // 2. 普通用户访问敏感资源(模拟内部攻击)
    res.accessResource(normalUser, "system_config");
    
    // 3. 管理员访问敏感资源(正常)
    res.accessResource(adminUser, "system_config");
    
    return 0;
}
12.4.3 代码运行结果
复制代码
用户角色:1 正常访问资源:user_file
检测到内部越权攻击!
用户角色:1 试图访问敏感资源:system_config
攻击拦截成功!
用户角色:2 正常访问资源:system_config

12.5 来自系统外部的攻击

12.5.1 核心概念

外部攻击是指未授权用户对系统的恶意访问,常见类型:

  • 暴力破解:尝试大量用户名 / 密码组合登录
  • 拒绝服务(DoS):消耗系统资源,使系统无法提供服务
  • 网络嗅探:窃取网络传输的数据
12.5.2 实战代码(模拟暴力破解检测,C++98)
复制代码
#include <iostream>
#include <string>
#include <ctime> // C++98时间头文件
using namespace std;

// 暴力破解检测类
class BruteForceDetection {
private:
    string validPassword; // 合法密码
    int failedCount;      // 失败次数
    time_t lastFailedTime; // 最后一次失败时间
    const int MAX_FAILED = 3; // 最大失败次数阈值
    const int LOCK_TIME = 60; // 锁定时间(秒)
public:
    // 构造函数
    BruteForceDetection(string pwd) 
        : validPassword(pwd), failedCount(0), lastFailedTime(0) {}
    
    // 密码验证+暴力破解检测
    bool verifyPassword(string inputPwd) {
        // 检查是否处于锁定状态
        time_t now = time(NULL);
        if (failedCount >= MAX_FAILED && (now - lastFailedTime) < LOCK_TIME) {
            cout << "检测到暴力破解攻击!" << endl;
            cout << "账户锁定" << LOCK_TIME - (now - lastFailedTime) << "秒" << endl;
            return false;
        }
        
        // 重置锁定状态(如果超时)
        if (failedCount >= MAX_FAILED && (now - lastFailedTime) >= LOCK_TIME) {
            failedCount = 0;
            cout << "账户锁定解除" << endl;
        }
        
        // 验证密码
        if (inputPwd == validPassword) {
            failedCount = 0; // 验证成功,重置失败次数
            cout << "密码验证成功!" << endl;
            return true;
        } else {
            failedCount++; // 验证失败,增加失败次数
            lastFailedTime = now; // 记录失败时间
            cout << "密码错误!剩余尝试次数:" << MAX_FAILED - failedCount << endl;
            return false;
        }
    }
};

int main() {
    BruteForceDetection detector("123456");
    
    // 模拟暴力破解(连续输入错误密码)
    detector.verifyPassword("12345");
    detector.verifyPassword("123457");
    detector.verifyPassword("654321");
    
    // 第四次尝试(触发锁定)
    detector.verifyPassword("000000");
    
    return 0;
}
12.5.3 代码运行结果
复制代码
密码错误!剩余尝试次数:2
密码错误!剩余尝试次数:1
密码错误!剩余尝试次数:0
检测到暴力破解攻击!
账户锁定60秒

12.6 可信系统 (Trusted System)

12.6.1 核心概念

可信系统是指能提供足够安全保障的系统,核心特征:

  • 强制访问控制:系统强制限制用户对资源的访问
  • 安全审计:记录所有安全相关的操作
  • 完整性验证:确保系统组件未被篡改
12.6.2 实战代码(模拟可信系统的完整性验证,C++98)
复制代码
#include <iostream>
#include <string>
using namespace std;

// 可信系统完整性验证类
class TrustedSystem {
private:
    // 系统关键文件的哈希值(模拟存储的基准值)
    unsigned int baselineHash;
    
    // 计算文件哈希值(模拟)
    unsigned int calculateFileHash(string fileName) {
        unsigned int hash = 0;
        // 模拟文件内容的哈希计算(实际中读取文件内容计算)
        for (int i = 0; i < fileName.size(); ++i) {
            hash += fileName[i] * (i + 1);
        }
        return hash;
    }
public:
    // 构造函数:初始化基准哈希值
    TrustedSystem(string criticalFile) {
        baselineHash = calculateFileHash(criticalFile);
        cout << "可信系统初始化完成,基准哈希值:" << baselineHash << endl;
    }
    
    // 完整性验证函数
    bool verifyIntegrity(string criticalFile) {
        unsigned int currentHash = calculateFileHash(criticalFile);
        cout << "当前文件哈希值:" << currentHash << endl;
        
        if (currentHash == baselineHash) {
            cout << "系统完整性验证通过!文件未被篡改。" << endl;
            return true;
        } else {
            cout << "系统完整性验证失败!检测到文件被篡改(可信系统告警)。" << endl;
            return false;
        }
    }
};

int main() {
    // 初始化可信系统(监控关键文件:system_kernel.exe)
    TrustedSystem ts("system_kernel.exe");
    
    // 1. 验证未被篡改的文件
    ts.verifyIntegrity("system_kernel.exe");
    
    // 2. 验证被篡改的文件(模拟攻击)
    ts.verifyIntegrity("system_kernel_hacked.exe");
    
    return 0;
}
12.6.3 代码运行结果
复制代码
可信系统初始化完成,基准哈希值:2218
当前文件哈希值:2218
系统完整性验证通过!文件未被篡改。
当前文件哈希值:2407
系统完整性验证失败!检测到文件被篡改(可信系统告警)。
12.6.4 架构图(可信系统)
代码使用说明
  1. 环境要求:DEV C++(任意版本),编译标准选择「C++98」(DEV C++ 默认支持);
  2. 运行方式:复制对应代码到 DEV C++,直接点击「运行」按钮即可;
  3. 扩展建议:实际项目中,加密算法需使用 OpenSSL 等成熟库,本文代码为入门理解简化实现。

总结

  1. 操作系统安全核心是保障机密性、完整性、可用性,核心手段包括加密、验证、访问控制;
  2. 本文所有代码基于 C++98 标准,适配 DEV C++,可直接运行,覆盖加密、用户验证、攻击检测、可信系统四大核心场景;
  3. 内部攻击和外部攻击的防护重点不同:内部防越权,外部防破解 / DoS,可信系统是安全防护的终极方案。

结尾

如果本文对你理解操作系统的保护和安全有帮助,欢迎点赞 + 收藏!有任何代码运行问题,评论区留言,我会第一时间解答~

相关推荐
月挽清风2 小时前
代码随想录第十一天
c++·算法·leetcode
咕噜咕噜万2 小时前
测试用例执行进度实时同步工具指南:从流程打通到效率提效的全链路落地
运维·网络
STLearner2 小时前
MM 2025 | 时间序列(Time Series)论文总结【预测,分类,异常检测,医疗时序】
论文阅读·人工智能·深度学习·神经网络·算法·机器学习·数据挖掘
春日见2 小时前
Git 相关操作大全
linux·人工智能·驱动开发·git·算法·机器学习
多米Domi0112 小时前
0x3f 第43天 黑马点评全量复习一遍 + 栈两题
开发语言·数据结构·python·算法·leetcode
码农水水2 小时前
京东Java面试被问:分布式会话的一致性和容灾方案
java·开发语言·数据库·分布式·mysql·面试·职场和发展
白小筠2 小时前
迭代器与生成器
开发语言·python
xhbaitxl2 小时前
算法学习day24-回溯
学习·算法·排序算法
郝学胜-神的一滴2 小时前
Linux网络字节序详解:从理论到实践
linux·服务器·c语言·开发语言·c++·网络协议·程序人生