0%

信息安全考研基础

前言

本篇博客不是技术流的,是针对本人的院校发布的考研大纲提供的信息安全方面的知识大纲所写的基础知识总结。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1、信息安全基础
(1) 信息安全基本特征
(2) 信息安全体系结构
(3) 信息安全等级与标准
2、密钥管理
(1) 密钥管理原理
(2) 密钥分配方案
3、PKI
(1) PKI基本概念和原理
(2) 数字证书概念和原理
4、常见安全设备的基本概念及原理、类型
(1) 防火墙
(2) 入侵检测
(3) VPN
5、密码学基础
(1) 对称密码算法原理及应用
(2) 非对称密码算法原理及应用

可以看到一共有五个部分啊,我们每个部分的各种知识都放进来,方便看看。同时也是对大纲的一种理解加深。

信息安全基础

信息安全的基本特征

保密性(confidentiality):信息加密、解密;信息划分密级,对用户分配不同权限,对不同权限的用户访问的对象进行访问控制;防止硬件辐射泄露、网络截获、窃听等

完整性(integrity):严格控制对系统中数据的写访问。只允许许可的当事人进行更改

可用性(availability):可以保证合法用户在需要时可以访问信息及相关资产。在坚持严格的访问控制机制的条件下,为用户提供方便和快速的访问接口。提供安全性的访问工具。即使在突发事件下,依然能够保障数据和服务的正常使用,例如可防范病毒及各种恶意代码攻击包括DDos攻击,可进行灾难备份

口诀:保完用

网络安全的四层含义

1
2
3
4
• 运行系统安全:系统本身
• 网络上系统信息的安全:系统权限
• 网络上信息传播的安全:防止有害信息传播
• 网络上信息内容的安全:防止利用安全漏洞进行窃听,冒充和诈骗

网络安全结构层次

1
2
3
物理安全
安全控制
安全服务

网络信息安全策略

• 物理安全策略:保护计算机系统等硬件设备面手攻击,验证身份和使用权限

• 访问控制策略:网络安全防范和保护的主要策略。保证网络资源不被非法使用和访问
入网访问控制
网络权限控制
目录级安全控制
属性安全控制
网络服务器安全控制
网络检测和锁定控制
网络端口和节点的安全控制

• 防火墙控制

• 信息加密策略:保护网上传输的数据

• 网络安全管理策略

口诀:物访防信安

ISO/OSI安全体系3个组成

1
ISO:国际标准化组织

OSI:开放系统互连通信参考模型
安全服务:5类,认证,访问控制,数据保密性,数据完整性,不可否认性
安全机制:8类,加密,数字签名,访问控制,数据完整性,鉴别交换,业务填充,路由控制,公证
安全管理:3类,系统安全管理,安全服务管理,安全机制管理

网络安全体系2个模型

PDRR:Protection, Detection, Response, Recovery
保护,检测,响应,恢复

PPDR: Policy, Protection, Detection, Response
安全策略,防护,检测,响应

信息系统安全5个等级

1
2
3
4
5
• 自主保护级
• 系统审计保护级
• 安全标记保护级
• 结构化保护级
• 访问验证保护级

口诀:自系安结访

安全评测认证体系

TCSEC(可信任计算机标准评估准则):现行的网络安全准则,分为3个部分

• 简介和一般模型
• 安全功能要求
• 安全保证要求

7种评估保证级:(功结功系半半形)
◦ 1:评估保证级别1(EAL1):功能测试
◦ 2:EAL2:结构测试
◦ 3:功能测试和校验
◦ 4:系统地设计,测试和评审
◦ 5:半形式化设计和测试
◦ 6:半形式化验证的设计和测试
◦ 7:形式化验证的设计和测试

密钥管理

密码学基础

image-20231008141959237

image-20231008142004143

image-20231008142009253

密钥类型

image-20231008142036789

会话密钥:保护传输数据(数据加密密钥),保护文件(文件密钥),供通信双方使用(称为专用密钥),使用对称密码算法生成。

密钥加密密钥:对会话密钥或下层密钥进行保护,也称为次主密钥,二级密钥。

主密钥

基本密钥(初始密钥\用户密钥):用户选定或系统分配,可在较长时间一对用户所专用。

密钥分配

以下仅考虑在对称密码技术中的密钥分配

集中式密钥分配体质

需要密钥分配中心(KDC)或密钥转递中心(KTC)
典型代表是Kerboros协议

image-20231008142841165 image-20231008142852127

分布式密钥分配体制

image-20231008143246713

PKI技术

基础知识

概念:PKI(Public Key Infrastructure):公钥基础设施,支持公开密钥管理并提供真实性保密性完整性可追究性服务的基础设施

PKI提供的几种安全服务及对应的技术:向一个实体确认另一个实体是自己。使用数字签名实现

• 完整性:向一个实体确保数据没有被修改。使用数字签名和消息认证码(MAC),MAC使用对称分组密码或密码杂凑函数
• 机密性:向一个实体确保除了接收者,无人可读懂数据的关键部分。采用对称密码加密,需要建立密钥交换和密钥传输协议
• 不可否认性:使用数字签名实现

应用PKI的几种协议:
• IPSec:处在网络层,架设VPN
• S/MIME:处在应用层,安全的电子邮件协议
• SSL:处在传输层,保证浏览器和服务器之间的加密通信

PKI的基本组成

完整的PKI系统必须具有权威认证机构(CA)、数字证书库、密钥备份及恢复系统、证书作废系统、应用接口(API)等基本构成部分,构建PKI也将围绕着这五大系统来着手构建。

认证机构(CA):即数字证书的申请及签发机关,CA必须具备权威性的特征;

数字证书库:用于存储已签发的数字证书及公钥,用户可由此获得所需的其他用户的证书及公钥;

密钥备份及恢复系统:如果用户丢失了用于解密数据的密钥,则数据将无法被解密,这将造成合法数据丢失。为避免这种情况,PKI提供备份与恢复密钥的机制。但须注意,密钥的备份与恢复必须由可信的机构来完成。并且,密钥备份与恢复只能针对解密密钥,签名私钥为确保其唯一性而不能够作备份。

证书作废系统:证书作废处理系统是PKI的一个必备的组件。与日常生活中的各种身份证件一样,证书有效期以内也可能需要作废,原因可能是密钥介质丢失或用户身份变更等。为实现这一点,PKI必须提供作废证书的一系列机制。

应用接口(API):PKI的价值在于使用户能够方便地使用加密、数字签名等安全服务,因此一个完整的PKI必须提供良好的应用接口系统,使得各种各样的应用能够以安全、一致、可信的方式与PKI交互,确保安全网络环境的完整性和易用性。

通常来说,CA是证书的签发机构,它是PKI的核心。众所周知,构建密码服务系统的核心内容是如何实现密钥管理。公钥体制涉及到一对密钥(即私钥和公钥),私钥只由用户独立掌握,无须在网上传输,而公钥则是公开的,需要在网上传送,故公钥体制的密钥管理主要是针对公钥的管理问题,目前较好的解决方案是数字证书机制。

数字证书

数字证书是公开密钥体系的一种密钥管理媒介它是一种权威性的电子文档,形同网络计算环境中的一种身份证,用于证明某一主体(如人、服务器等)的身份以及其公开密钥的合法性,又称为数字ID。数字证书简称证书,它是一个经证书授权中心CA数字签名的文件,包含拥有者的公钥及相关身份信息。数字证书技术解决了数字签名技术中无法确定公钥是指定拥有者的问题。

证书结构

image-20231008150155370

证书类型

自签名证书:自签名证书又称为根证书,是自己颁发给自己的证书,即证书中的颁发者和主体名相同。
CA证书:CA自身的证书。如果PKI系统中没有多层级CA,CA证书就是自签名证书;如果有多层级CA,则会形成一个CA层次结构,最上层的CA是根CA,它拥有一个CA“自签名”的证书。
本地证书:CA颁发给申请者的证书。
设备本地证书:设备根据CA证书给自己颁发的证书,证书中的颁发者名称是CA服务器的名称。

证书认证过程

  1. 证书拆封:使用CA的公钥验证证书的数字签名,验证证书是否为CA所颁发
  2. 序列号验证:验证证书的真伪
  3. 有效期验证
  4. 撤销列表查询

常见安全设备的基本概念及原理、类型

防火墙

内网:防火墙内的网络
外网:防火墙外的网络
受信主机和非受信主机分别指内网和外网的主机
内网中需要向外提供服务的服务器放在的网段即为非军事化区

NAT
工作在传输层
作用:解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机

防火墙的结构

屏蔽路由器

image-20231008143955460

双宿主防火墙

image-20231008144140749

屏蔽主机防火墙

image-20231008144202131

屏蔽子网防火墙

image-20231008144233974

防火墙类型

数据包过滤路由器,代理网关(应用层网关),状态检测
包过滤是在网络层拦截所有信息流,代理在应用层实现防火墙的功能
代理服务安全性>包过滤,应用层的防火墙性能会有明显下降,故代理服务性能<包过滤

image-20231008144622628

入侵检测系统(IDS)

基于误用(特征)的入侵检测
将入侵行为按照某种方式进行特征编码,与模式数据库中的内容进行模式匹配,从而发现入侵行为
优点:只需要收集相关的数据集合,减小系统负担
缺点:需要不断升级网络入侵和系统误用模式数据库,不能检测未知的入侵方式

基于异常的入侵检测
对计算机或网络资源进行统计分析,定义一组系统正常情况的阈值,将系统运行时的数值与阈值相比较,判断是否被入侵
优点:可检测到未知或更复杂的入侵
缺点:误报,漏报率高,不适应用户行为的突然改变

VPN

这个曾经考过了,em。。只能说再考的概率稍微小点,但是还是得背下来。

VPN的概念和特点

VPN:虚拟专用网。通过一个公用网络建立一个临时的、安全的连接,是一条穿过混乱的公用网络的安全、稳定的隧道

特点
• 安全保障:在公用网络上建立一个逻辑的,点对点的连接(建立一个隧道),并使用加密技术对隧道加密
• 服务质量保证:流量预测和流量控制策略,防止阻塞发生
• 可扩充性和灵活性:支持通过IntranetExtranet的任何类型的数据流
• 可管理性

隧道技术

隧道技术是指通过使用互联网络的基础设施在网络之间传递数据的一种方式
被封装的数据包在公共互联网络上传递时所经过的逻辑路径称为隧道
隧道技术包括 数据封装-传输-解包 的全过程

不同层的隧道协议

• 数据链路层:PPTP,L2TP,L2F
• 网络层:IPSec
• 运输层:SSL
• 应用层:set

VPN的4种建立方式

• Host 对 Host:主机要支持IPSec,VPN网关不需支持
• Host 对 VPN网关:均需支持IPSec
• VPN 对 VPN网关:主机不需支持IPSec,VPN网关需支持
• Remote User 对 VPN网关:均需支持IPSec

密码学基础

对称加密算法

对称加密算法是一种使用同一个密钥进行加密和解密的算法。加密和解密过程使用相同的密钥,因此也被称为“共享密钥加密算法”或“单密钥加密算法”。

原理

对称加密算法的原理是通过对数据进行按位异或、替换、置换等运算,将明文转换为密文。在解密时,使用相同的密钥对密文进行逆向运算,将密文恢复为明文。

对称加密算法的工作方式包括分组密码和流密码两种。分组密码将明文分成固定长度的数据块进行加密,而流密码将明文和密钥作为输入,逐位产生密文。

image-20231008150727026

非对称加密算法

加密和解密所用的密钥是不一样的,所以叫“非对称”。
非对称加密算法的这两个密钥,一个称为公钥,一个称为私钥。

常见的有:RSA、ECC

2018年真题解析

网安的概念还有几十页要背,好好背一下好了。唉,考研是真的好痛苦啊。

临时存答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
一、单选题
1.A 2.C 3.A 4.D 5.A
6.C 7.B 8.C 9.C 10.B
//正确答案BCADA DBCCB 错两个,得16分
二、判断题
对对对错对
错错错对错
//我的就是正确答案!得20分
三、程序分析题
21.
程序功能:判断每个字母分别出现了几次,不区分大小写
程序运行结果:
A-2
E-1
G-1
H-1
I-2
K-1
M-1
O-2
P-1
R-2
S-3
T-3
//全对10分!
22.
程序功能:判断数组中成绩最高的学生和成绩最低的学生,并分别输出分数最大的学生和分数最小的学生的姓名和成绩。
程序运行结果:
Max is:Wanghai,93
Min is:Liuhong,62
//全对10分!
23.
程序功能:将一个正整数倒置
程序运行结果:result:54321
//全对10分!

四、程序设计题

24.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
int main(){
int i,j;
int re;
for(j=1;j<=9;j++){
for(i=1;i<=j;i++){
re=j*i;
printf("%d*%d=%d ",j,i,re);
}
printf("\n");
}
return 0;
}

//能完成功能,我就算25分吧

25.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<stdio.h>
int main() {
struct person {
char name[20];
int sex;//男人为0,女人为1
int age;
}arr[100];
int i = 0;
while (i < 100) {
printf("请输入第%d位人的姓名,性别(其中男人为0,女人为1)和年龄:\n", i+1);
scanf("%s%d%d", &arr[i].name, &arr[i].sex, &arr[i].age);
i++;
}//接收

struct person tee[100], adult[100], old[100];
int t = 0; int a = 0; int o = 0;
for (i = 0; i < 100; i++) {
if (( - 1 < arr[i].age) && (arr[i].age< 30)) {
tee[t] = arr[i];
t++;
}
if ((29 < arr[i].age) && (arr[i].age < 60)) {
adult[a] = arr[i];
a++;
}
if (arr[i].age >= 60) {
old[o] = arr[i];
o++;
}
}
printf("年轻人有%d,中年人有%d,老年人有%d", t, a, o);
return 0;
}

//能完成功能,我就算25分吧

26.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<stdio.h>
#include<string.h>
int main() {
char arr1[50];
char arr2[50];
int i = 0;
int j = 0;
printf("请输入字符串1\n");
gets_s(arr1);

char a = '0';
char b = '9';
while (arr1[i] != '\0') {
if ((arr1[i] >= a) && (arr1[i] <= b)) {
arr1[i] == a;
}
if (arr1[i] != a) {
arr2[j] = arr1[i];
j++;
i++;
}
else {
i++;
}
}

int lenth = 0;
lenth = strlen(arr2);
printf("字符串2为:");
for (i = 0; i < lenth; i++) {
printf("%c", arr2[i]);
}
return 0;
}

未完成,我直接算0分好吧

这次总分116分!重点其实就是编程题,我要是最后一个编程题对了,基本上就是130分左右,但是好难啊,我两次编程题都没写对,所以要对编程题进行针对性的训练。

解析

填空题

1

image-20231004182136763

这道题我都能选错是我没想到的,脑子抽了。。

逻辑或是有一个是真的就是真的,所以选B

2

image-20231004182611730

选C

3

image-20231004182625830

选A

C语言源文件后缀名是“.c”,编译(就是将源代码转换为机器语言。编译器的输出结果成为目标代码,存放它们的文件称为目标文件)生成的文件后缀名是“.obj”,连接后可执行文件的后缀名是“.exe”。
而最后的cpp后缀,是c++的源文件。

4

image-20231004182933228

最后一个只是单纯的表达式,并不具备赋值的功能。
选D

5

image-20231004183005784

这个是老生常谈了,选A

6

image-20231004183026483

这个我还是真是触及到知识盲区了,我一直以为是3能省略,结果是全部都可以省略,但表达式之间的间隔符 ( 分号 )不能缺省。for(;;)的功能就和while(1)一样了
选D

7

image-20231004183740621

判断长度当然使用strlen函数啦
选B

8

image-20231004183848474

老生常谈的问题了,不说了,选C

9

image-20231005133809796

定义结构体,太基础啦!首先必不可少的就是struct,后面的结构体名称和变量名都是可以省略的,然后前面的结构体名称是不能使用数组的,所以最后答案就选C

10

image-20231005134540301

首先是输入,所以排除A,如果要直接接收数组的话,scanf直接用数组名即可,gets也是直接用数组名即可,但是gets里面是不能打引号的,所以这道题选B

判断题

11

image-20231005135432175

对的

12

image-20231005135448133

对的

13

image-20231005135455889

对的

14

image-20231005135511505

错的,定义数组要使用方括号,定义函数的时候才使用圆括号,且圆括号中的形参也不能以数字开头。

15

image-20231005135554642

对的

16

image-20231005135608260

错的,应该如下,p=a

image-20231005135705681

17

image-20231005135725130

错误的,viod函数不需要return的返回值

18

image-20231005135745158

错误的,是按照从上到下执行的

19

image-20231005135815722

正确的

image-20231005140832833

viod指针就能做到这一点,但是后面却无法正确间接寻址,原因是void指针必须要进行转换之后,才能进行正确的引用

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <string.h>
#include<stdio.h>

int main() {
char arr[5] = "arrs";
int arr2[5] = { 1,2,3,4,5 };
void* p;
p = &arr[1]; // 指向字符数组的第二个元素
printf("%c\n", *(char*)p); // 打印字符数组的第二个元素
p = &arr2[1]; // 指向整数数组的第二个元素
printf("%d\n", *(int*)p); // 打印整数数组的第二个元素
return 0;
}

image-20231005141250833

20

image-20231005141318466

肯定是错误的啦,变量E等于1的时候才执行,而后面是变量E等于0的时候才执行.

程序分析题

21

image-20231005141535365

这些分析题我就不解释了,毕竟我都全对,直接看我之前写的答案就好了
值得注意的一点就是,程序中的printf必须要好好的看,避免漏过一些重要的输出内容。

22

image-20231005142350476

23

image-20231005142402355

编程题

不多解释了,前面两个看我的答案就可以了,现在说说第三个

24-25

image-20231005143304921

26

image-20231005143317971

我的思路是,首先接收字符串1和2,然后遍历字符串1,遇到0~9之间的元素就跳过,其他时候直接存入字符串2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <string.h>
#include<stdio.h>

int main() {
// 定义两个字符数组,arr1用于接收输入,arr2用于存储非数字字符
char arr1[50];
char arr2[50] = {""};

// 从用户那里获取字符串,并存入arr1
scanf("%s", arr1);

// 计算输入字符串的长度
int len = strlen(arr1);

// 初始化索引变量j
int j = 0;

// 遍历输入字符串中的每个字符
for (int i = 0; i < len; i++) {
// 如果当前字符是数字,则打印提示信息并跳过
if (arr1[i] >= '0' && arr1[i] <= '9') {
printf("排除%c!\n", arr1[i]);
}
else {
// 如果当前字符不是数字,则将其添加到arr2,并增加索引j
arr2[j] = arr1[i];
j++;
}
}

// 计算arr2的长度
int len2;
len2 = strlen(arr2);

// 打印出arr2中的所有字符
for (int i = 0; i < len; i++) {
printf("%c", arr2[i]);
}
}

image-20231005144842718

标准输入和输出、控制字符格式与运算符优先级

前言

2024的考研大纲中同样也增加了这样的三个内容标准输入和输出、控制字符格式与运算符优先级。于是在这里详细学习一下。不学不行啊,md数学太难了,难得我头都要炸了,必须把专业课好好学,缓解一下数学的压力才行。专业课考到120的话,其他的,科目压力就不是很大了。

标准输入和输出

首先了解标准输入和输出
标准输出:C语言标准输出是一个接口库函数,已经写好了实现,我们只需要去调用它,就可以实现从终端中打印出信息。其实就是类似printf
标准输入printfscanf 两个函数原型相同,但是 scanf 在用起来,还是有些让人抓狂的错误。标准输出就是库中定义的类似scanf

所谓标准输入输出,我们先理解为通过控制台来输入和显示内容,只要是个操作系统都会有控制台,这是最基本的人机交互方式,后面会详细讲解标准输入输出的概念。标准输入输出是C语言初学者第一个要越过的门槛,特别是printf()scanf()这两个格式化输入输出函数,由于格式定义复杂导致很多人望而却步,其实标准输入输出函数并不是C语言定义的标准,而是stdio库中定义的函数,每个编译器实现不尽相同

我们这篇文章只讲6个函数,printf,scanf,getchar,putchar,gets,puts

printfscanf

printf() 是一个C语言标准库中的函数,用于格式化输出数据到标准输出(通常指屏幕)。它可以将不同类型的值转换为字符串,并根据指定的格式字符串打印输出。

关于printf函数的运算顺序

image-20231002134154568

这是我在之前的C语言碎碎念博客中提到的。这点需要注意一下。

scanf() 是 C 语言标准库中的一个函数,用于从标准输入(通常指键盘输入)读取数据,并按照指定的格式进行解析。

这两个函数本身其实不是很重要,但是重要的是,他们的控制字符格式,以及各种控制字符格式对应的特性。这些我会在下面的控制字符格式中详细说明。

getchar()putchar()函数

当从控制台输入输出单个字符时这两个函数的确比printf()scanf()方便,因为不用编写格式控制符,特别是getchar(),对变量赋值时能返回输入字符,不需要赋值时能清空缓存,或者干脆放到末尾放置程序退出。

1
2
getchar:能在屏幕上输入一个字符。
putchar:它可以输出一个字符到屏幕上。

getchar的例子

image-20231002131951357

putchar的例子

image-20231002132140868

gets()和puts()

puts()最大的特点是自动在末尾添加换行符,虽然不能忠实反应输出内容,但是极大方便了行输出,对应的gets()会读取并自动丢弃缓存中换行符并且忽略字符串中间的空格符,极大方便了行输入。

puts的例子

image-20231002133015231

gets的例子(我的编译器版本太高了,已经没gets了,就写个程序得了)

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main() {
char str[50];

printf("Enter a string: ");
gets(str);

printf("You entered: %s\n", str);

return 0;
}

控制字符格式

这里面的讲究还是有很多的

type类型

在这里插入图片描述

flags

flags 规定输出样式,%后面可以跟 0 个或多个以下标志:

在这里插入图片描述

width

最小的输出宽度,用十进制数来表示输出的最小位数

在这里插入图片描述

precision 精度

在这里插入图片描述

length 长度修饰符

在这里插入图片描述

1
2
3
printf("%hd\n", 12345); //将数据以 short int 类型进行转换
printf("%ld\n", 12345); //将数据以 long int 类型进行转换
printf("%lld\n", 12345); //将数据以 long long int 类型进行转换

运算优先符

给出一个顺口溜把

C语言常用运算符的优先级口诀是:“单算关逻条赋逗”;
如果加入位运算符,完整口诀是:“单算移关与,异或逻条赋”。
■“单”表示单目运算符:逻辑非(!),按位取反(~),自增(++),自减(–),取地址(&),取值(*);
■“算”表示算术运算符:乘、除和求余(*,/,%)级别高于加减(+,-);
■“移”表示按位左移(<<)和位右移(>>);
■“关”表示关系运算符:大小关系(>,>=,<,<=)级别高于相等不相等关系(==,!=);
■“与”表示按位与(&);
■“异”表示按位异或(^);
■“或”表示按位或(|);
■“逻”表示逻辑运算符:逻辑与(&&)级别高于逻辑或(||);
■“条”表示条件运算符(? :);
■“赋”表示赋值运算符(=,+=,-=,*=,/=,%=,>>=,<<=,&=,^=, |=,!=);
◆另,逗号运算符(,) 级别最低,口诀中没有表述,需另加记忆..