信息安全原理复习重点
本文首发于GitHub
2024年吉林大学信息安全原理真题
ECB
- 什么是ECB?
- ECB安全吗?为什么?
- 什么是CBC?
- CBC安全吗?为什么?
彩虹表
- 什么是彩虹表?
- 攻击者怎么用彩虹表攻击?
- 如何防御?
数字证书
用户想访问A网站,攻击者使用以下方式诱导A访问假网站会发生什么:
- 攻击者沿用A网站的数字证书;
- 攻击者创建一个假证书;
- 攻击者使用自己网站的真实证书。
Kerberos协议
- timestamp和lifetime对于安全有用吗?为什么?
- 攻击者仿造ticket去欺骗TGS可行吗?
- 攻击者截获别人的ticket去欺骗TGS可行吗?
缓冲区溢出
说明scanf("%s", buff)
有什么漏洞。
老师强调的重点
密码学 Cryptography
对称密钥 symmetric key encryption
对称密钥加密即单密钥加密,在加密时有以下优点:
- 速度快,易于加密
- 算法简单,计算资源消耗少
- 适用于大规模数据传输
当然,相对于非对称密钥加密,也有相应的缺点:
- 对称加密需要发送和存储密钥,在传输中一旦密钥泄露,则安全性大幅下降
- 密钥必须双方事先共享,否则需要依赖其他协议传输密钥
- 无法实现数字签名
实际应用中常常两种加密混合使用,称为混合加密。
加密模式(0929作业)
ECB
简单的块加密
因为相同明文通过相同密钥可得到相同密文,存在一定漏洞,所以通过添加参数(IV)的方法修改每一次加密的明文或密钥,从而得到无规律的密文。
初始向量IV, Initialization Vector.
需要保证以下特质
1.以明文存储或传输
2.不应重复使用
3.不可预测
CBC
明文P与向量V异或后再加密得到密文C。
由于V需要由密文得到,因此加密不可并行,但解密可并行
CFB
向量V加密后与明文P异或得到密文C。
实际上变成了流加密,而且最后的数据块也不需要填充了,很适合加密实时数据
同样的,由于V需要由密文得到,因此加密不可并行,但解密可并行
OFB
向量V加密后与明文P异或得到密文C。
与CFB相同,但加密的向量实际只依赖上个向量,最终都依赖于IV,所以加密解密都是可并行的
CTR
向量V加密后与明文P异或得到密文C。
nonce和其他模式的IV一样,计数器counter从000...000累加
很明显,加密解密都可并行
数字签名与数字证书
在传输密钥时容易遭到中间人攻击,从而无法确定对方用户身份和密钥的安全性。因此在传输密钥时常常使用证书将密钥与用户身份绑定。
数字签名 Digital Signature
数字签名是一种能产生与真实签名相同效果的协议: 它是一种只有发送者才能做的标记,但其他人可以很容易地识别出它属于发送者。
A digital signature is a protocol that produces the same effect as a real signature: It is a mark that only the sender can make, but other people can easily recognize as belonging to the sender.
一般情况下使用自己的私钥签名,别人使用公钥验证。
数字证书 digital certificate
证书颁发机构(CA)是权威的,有了CA的签名,大家就会认可你的数据是真的。
一份证书的构成:
自己的name, addr, public key, hash value, 上层的签名,上层的证书
证书颁发机构:受信任方,负责验证用户身份,然后将验证身份与公钥绑定。
Certificate Authority (CA): a trusted party, responsible for verifying the identity of users, and then bind the verified identity to a public keys.
数字证书:证明内含的公开密钥确实属于该文件所述身份的文件。
Digital Certificates: A document certifying that the public key included inside does belong to the identity described in the document.
当用户想访问A网站,攻击者用B网站攻击的三种攻击方式(1025作业)
- 攻击者使用A网站的真实证书。由于证书中有CA机构的签名,攻击者的网站无法伪造完全一样的签名,从而被浏览器识破(网站和真证书对不上)
- 攻击者创建一个假证书。由于浏览器无法识别该证书,一般会询问用户是否进入网站(众所周知,用户一般都是坚持访问的)
- 攻击者使用自己网站的真实证书。由于证书是真的,和网站也对得上,浏览器会通过验证。这种情况一般是网址相似,用户通过对比网址可判断网站是假的
身份验证与访问控制 Authentication & Access Control
身份识别 Identification 指声明一个人是谁
身份验证 Authentication 指通过某种手段证明某人是他声明的身份。
身份验证:salt(1101作业)
通常使用密码口令进行身份验证,然而,总有用户使用弱口令,给attacker可乘之机。
因此通常使用散列函数对口令处理,但是困难的口令各式各样,简单的口令千篇一律
当用户设置的口令过于简单时,攻击者提前将各种简单的口令和他们的散列值提前计算,保存得到彩虹表,从而进行攻击。即使使用SHA等加密方法,也可以通过多个散列值的对比找到较弱的口令来攻击。
因此可以通过在口令上加入各不相同的salt(类似加密模式中的IV),使加密后的散列值各不相同,从而加大攻击者攻击的难度。明文的salt比如用户名、时间戳,也可以用密文salt来增强口令。
多次散列化也能有效增大口令破解难度
访问控制:Kerberos协议(1108作业)
主要使用密钥分发中心KDC(Key Distribution Center)实现访问控制
用户向KDC发送TGT请求(实际上就是登录服务器),KDC返回一个会话密钥 \(K_{c, tgs}\) 和票据 \(T_{c,tgs}\),用于和TGS通信。
KDC返回信息结构如下
用户得到票据后想要使用某服务时,向TGS发送请求,附带TGT和authenticator,TGS使用TGT解密出会话密钥,用这个密钥加密一个新的服务票据和会话密钥。
使用tgs的key加密的票据TGT(Ticket-Granting Ticket)结构如下
用户使用tgs发的票据使用对应服务。
访问服务时使用的authenticator结构如下
authenticator能够保证:
- 客户端知道密钥
- 票据是新的、有效的
编程与程序安全 Programs & Programming
程序都有缺陷,由此可以被恶意利用,一个经典的缺陷是缓冲区溢出(Buffer Overflow)。
缓冲区溢出(1115作业)
- 程序在执行时会在栈空间分配一个固定大小的缓冲区用于存储数据。
- 当用户或程序向缓冲区写入数据时,如果没有检查数据的长度,可能会写入超出预定大小的数据。超出缓冲区的数据将覆盖相邻的内存空间,可能会修改其他数据结构、变量,甚至控制流相关的关键内容,如返回地址、函数指针等。
- 如果攻击者故意设计输入数据,使得缓冲区溢出的部分覆盖了程序的返回地址,从而使程序跳转到攻击者的恶意代码并执行。
预防措施
地址随机化 ASLR (Address Space Layout Randomization)
随机化堆栈的起始位置,即每次在内存中加载代码时,堆栈地址都会发生变化,从而难以猜测内存中的堆栈地址,进而难以猜测 %ebp 地址和恶意代码地址
栈保护 Stack-Guard
使用一个保护值canary检测栈溢出是否发生,通常将canary放在缓冲区和返回地址之间,如果发生栈溢出,就会覆盖canary值,从而检测到栈溢出。
笔者认为的其他重点
CIA(0913作业)
confidentiality 保密性
integrity 完整性
availability 可用性
信息传递的四种攻击手段
流加密和块加密的比较(0927作业)
流加密:
- 变换速度快。每个符号单独加密,无需等待其他符号
- 低错误传播。错误只影响字符本身
块加密:
- 高扩散。明文信息分散到整个加密块中。
- 免疫符号插入。符号块长度固定,一旦插入可以立刻发现。
- 相同明文得到相同密文。容易看出明文特征。
错误检测码 Error Detecting Code
一般使用hash算法,由原文易得哈希值,反过来十分困难,且原文发生改变时,哈希值也发生改变
散列函数的特点:单向性、抗碰撞性
常用的one-way hash functions
- MD series
- SHA series
信息验证码 Message Authentication Code(MAC)
使用key和hash可以达到信息验证的目的(1018作业)
重放攻击
在交易等场景,将信息进行重放也会造成破坏,一般使用添加时间戳的方法解决
Needham-Schroeder Protocol 双向鉴别协议
其对应场景如下所示
程序运行时的栈变化
#include <cstdio>
void foo(){
return ;
}
int main() {
char buff[10];
scanf("%s", buff);
foo();
return 0;
}
main:
push %ebp ; 保存旧的基址指针
mov %esp, %ebp ; 设置新的基址指针,%ebp指向栈帧
sub $0x10, %esp ; 为局部变量buff[10]分配空间
; 执行 scanf("%s", buff)
push $buff ; 压入参数,buff数组的地址
call scanf ; 调用scanf函数
add $0x4, %esp ; 调用返回后恢复栈
; 执行 foo()
call foo ; 调用foo函数
; 结束 main
mov $0, %eax ; 函数返回值为0
leave ; 恢复栈帧
ret ; 返回
并非重点(?)
凯撒密码Caesar Cipher
每个字母按字母表顺序移动
Vigenere密码
每个字母按key顺序移动,key可以是单词,也可以是一串神秘数字
各种其他密码(0920作业)
DES:数据加密标准,用密钥加密,因安全性不够,后来出现了double DES, triple DES,再后来使用了AES
公钥和私钥的历史沿革,早期选取key的数学方法
RSA的数学方法
密钥交换协议(1011作业)
hash的应用:检测文件是否完整,不泄露秘密情况下发布秘密,密码验证,salt,可信的时间戳
hash chain, Block chain
哈希碰撞攻击(很难)
Kerberos干的是认证Authentication的活,一般不干授权Authorization的活。也可以干,可以往ticket里放
除了文字密码还有图形密码,五花八门,还有指纹等各种玩意
免责声明
仅为个人笔记,不提供备考建议和指南