目录
第二章 从口令系统说起
2.1 身份鉴别常见手段及例子
2.2 多因子认证
2.3 计时攻击
2.4 口令机制
2.5 假托和钓鱼
第三章 安全协议
3.1 认证协议
3.2 安全协议攻击
3.3 密钥分配协议
3.4 课后作业
第四章 访问控制
4.1 概念
4.2 控制访问三要素
4.3 控制访问基本原则
4.4 访问控制每层应用
4.5 经典访问控制策略
4.6 课后习题
4.7 常见突破访问控制手段
第五章 多级安全
5.1 BLP模型
5.2 Biba模型
第二章 从口令系统说起
2.1 身份鉴别常见手段及例子
-
知道什么:口令
-
拥有什么:汽车钥匙 or 加密狗
-
唯一特征:指纹 or 虹膜
2.2 多因子认证
多因子认证是指在进行身份验证时,需要提供两个或以上的验证因素,以提高系统的安全性和防范恶意攻击。这些因素可以是以下几种类型之一:
-
知道的事情:例如用户名+密码。
-
拥有的物品:例如手机验证码和校园卡刷卡。
-
生理特征:例如人脸识别。
2.3 计时攻击
计时攻击(Timing attack)是一种利用计算机程序执行时间的差异,推断出密钥或其他敏感信息的攻击方式。该攻击方式主要利用了程序中某些部分的执行时间和输入数据的关系,通过多次尝试不同的输入数据,对比它们的执行时间来推断出正确的数据或密钥。
这是一个程序比较输入密码和正确密码的程序示例
def compare_password(correct_password, user_password):
# 密码长度是否一致
if len(correct_password) != len(user_password):
return False
# 逐个字符比较密码是否一致
for i in range(len(user_password)):
if correct_password[i] != user_password[i]:
return False
return True
2.3.1 攻击示例
可以看出,攻击者可以利用程序中比较密码长度是否一致的代码段,推断正确密码的长度。以下是一个模拟计时攻击的示例代码:
correct_password = "xxxxxxxx" # 8个x
# 暴力破解密码,统计每个长度可能的密码尝试所耗费的时间
for i in range(1, 256):
user_password = "a" * i
start_time = time.time()
compare_password(correct_password, user_password)
end_time = time.time()
print("测试密码长度 ", i, " 所耗费时间: ", end_time - start_time)
依次尝试所有可能长度的密码,然后统计每个长度可能的密码尝试所花费的时间。攻击者可以根据运行时间来推断正确的密码长度,从而缩小猜测范围。
2.3.2 攻击防御
如果需要防御计时攻击也是不难的,我们可以前后加上 time.sleep(random.uniform(0, 0.1))
,就可以让攻击者无所适从
def compare_password(correct_password: str, user_password: str) -> bool:
# 随机时间*2
time.sleep(random.uniform(0, 0.1))
time.sleep(random.uniform(0, 0.1))
# 比较长度
if len(correct_password) != len(user_password):
return False
# 随机时间*3
time.sleep(random.uniform(0, 0.1))
time.sleep(random.uniform(0, 0.1))
time.sleep(random.uniform(0, 0.1))
for a, b in zip(correct_password, user_password):
if ord(a) ^ ord(b) != 0:
return False
return True
2.4 口令机制
口令是指在计算机系统中,由用户自己设定的一段字符串,用于验证用户身份合法性的一种方式。通过口令验证,可以有效增强计算机系统的安全性。常见的口令包括密码、PIN码。
口令系统是指基于口令验证技术的计算机安全系统。它通过要求用户输入正确的口令来验证用户的身份,从而允许或拒绝用户对计算机系统中资源的访问,口令系统是计算机安全的重要组成部分。
2.4.1 公式及含义
在口令机制的强度中 P=LR/S 公式中:
密码最大存活期L: lifetime
登录尝试率R: login attempt rate
密码空间大小S: size of space
猜测攻击概率:P=LR/S
常见的增强口令和口令系统方法,可以有效的增加攻击者成本。常见方法不难想到、查到,方法如下:
-
双重验证。现在Google,Github都以手机端APP验证为首选的口令认证方式,这确实是避免了很多的安全问题。
-
缩短密码最大存活期L:密码的存活期越长,攻击者越有机会进行猜测攻击。因此,缩短密码的存活期可以有效减少攻击者的机会,提高攻击成本。
-
限制登录尝试次数R:限制用户在一定时间内可以进行的登录尝试次数,例如智慧安大密码输入错误最大次数为15次,安徽大学教务系统为5次。限制登录尝试次数可以阻止攻击者对口令进行暴力破解,增加攻击者成本。
-
增大密码空间大小S:增大密码空间大小可以使攻击者在猜测密码时需要更多的时间和计算资源,从而增加攻击者成本。我们可以通过使用更复杂的密码组合,如数字、字母、符号等,来增大密码空间大小。也可以通过避免使用常见密码。
2.4.2 Hash+salt安全性分析
Hash+salt是一种常用的密码存储方法,其中,Hash函数用于将明文密码转化为一段固定长度的哈希值,而salt则是一段随机字符串,用于增加哈希值的随机性和独立性。当用户注册时,系统将将原始密码与salt值组合,并通过Hash函数生成哈希值,并将salt和哈希值一起保存到数据库中。当用户进行登录时,系统使用相同的salt值和哈希函数来处理输入的密码,并将结果与保存的哈希值进行比较。如果结果一致,则证明用户提供的密码是正确的。
这样的密码存储方式虽然不能避免暴力破解,但可以防御彩虹表攻击和重放攻击。
2.4.3 防御
单台设备破解,每秒尝试100次——错误达到10次后,每5min才能尝试一次
控制僵尸网络破解——统计,加入黑名单;多因素身份验证
2.5 假托和钓鱼
2.5.1 概念与实例
假托:一种制造虚假情形,使人吐露不愿泄露的信息的手段。该方法通常预含对特殊情景专用术语的研究,以建立合情合理的假象。(自称某某工作人员)
钓鱼:一种企图从电子通讯中,透过伪装成信誉卓著的法人媒体以获得如用户名、密码和信用卡明细等个人敏感信息的犯罪诈骗过程。(钓鱼网站)
2.5.2 防范措施
浏览器厂商、xx管家:钓鱼警告工具栏。
检查SSL锁和url英语的精确性。
双因素认证;双通道身份认证。
第三章 安全协议
3.1 认证协议
3.1.1 口令协议
最简单的认证协议。口令/密码,PIN都是典型例子。
3.1.2 单向认证
发送序列号+认证块,认证块包括序列号+Nonce,Nonce每个人是唯一的。
认证过程:
-
获取序号𝑇
-
解密 {𝑇, 𝑁}
-
验证 𝑇
-
验证 𝑁
Nonce的实现上:
-
随机数:伪随机函数,但实际可能存在规律,规律破解则协议不安全
-
计数器:协议未完成(或攻击)导致不一致
-
从第三方收到的随机质询:如何获得?网络是否鲁棒/可靠?
质询/响应协议:
认证方发送质询(随机数) <-----> 被认证方发送认证块(包括质询随机数)
口令生成器:
-
登录界面提供一个随机数
-
将该随机数与PIN一同输入口令生成器, 得到登录口令
-
键入登录口令
IFF协议(Identify Friend or Foe):雷达向战机发出质询,战机必须回应正确应答,否则会被当做敌机。
3.2 安全协议攻击
3.2.1 重放攻击
例如车钥匙远程开门,攻击者使用抢夺器获取开锁器的广播并重放。
重放攻击的防御方式即是加入时间戳,使得信号有一个有效期。
3.2.2 中间人攻击
如上图,白飞机为敌机,黑飞机为战斗机。安哥拉服务器向战斗机发出质询,战斗机用密钥K加密N,返回给服务器{N}_k。南非空军向敌机质询时,由于敌机没有密钥K,所以将密钥K转发给安哥拉服务器,安哥拉服务器返回的{N}_k再转发给南非空军服务器,敌机即可认证战斗机身份。
中间人攻击很好的防御方式即使用加密技术,让中间人拿不到任何有效信息。或者使用安全套接字或者传输层安全协议,保护网络通信安全性。
3.3 密钥分配协议
3.3.1 基本密钥分配
A、B想要进行通信,A即向S发送A和B。服务器返回,T是时间戳。
A通过K_{AS}解密第一块,获得K_{AB},将第二块消息和使用K_{AB}加密后的通信消息M发给B。B用自己的K_{BS}解密,获得K_{AB},将消息用K_{AB}解密出来。
但A可以使用重放攻击获取服务器的信任,因此要增加时间戳。
3.3.2 Needham-Schroeder协议
3.3.3 Kerberos协议
3.4 课后作业
1.阅读下述安全协议,并回答后续问题
A→S:A,NA,{A,B,NA,Password}`KAS`
S→A:{A,B,NA + 1,KAB}`KAS`
S→B:{A,B,NA + 2,KAB}`KBS`
A→B:A,{A,B,NA + 2}KAB
B→A:{NA + 3}KAB
3.4.1 问题1
请分析该协议的目的,以及如何实现了该目的。其中password是用户A在服务器S注册时预留的登录密码。
Step1:A→S:A,NA,{A,B,NA,Password}KAS
A向S发送自己的:标识符A、随机数NA
、与S共享的密钥KAS
加密的消息。
加密消息中包含:用户A的标识符、用户B的标识符、随机数NA、用户A在服务器S注册时预留的登录密码。
Step2:S→A:{A,B,NA + 1,KAB}KAS
服务器S收到A发送的消息后,用KAS
解密消息,验证密码是否正确。
如果密码正确,服务器S生成一个新的随机数NA+1
,并用KAS
加密消息{A,B,NA+1,KAB}
,将其发送给A。A收到后用KAS
解密消息。
Step3:S→B:{A,B,NA + 2,KAB}KBS
服务器S再生成一个新的随机数NA+2
,并使用自己与B共享的密钥KBS
加密消息{A,B,NA+2,KAB}
,将其发送给B。B收到后用KBS
解密消息。
Step4:A→B:A,{A,B,NA + 2}KAB
用户A收到服务器S的消息后,用KAS
解密消息,得到新的随机数NA+1
和A与B的共享密钥KAB
,向B发送A的标识符、用KAB
加密后的消息{A,B,NA+2}
。
Step5:B→A:{NA + 3}KAB
用户B收到用户A的消息后,使用与A共享的密钥KAB
解密消息,得到随机数NA+2
,并向A发送加密后的消息{NA+3}KAB
,表示已经收到并成功解密了消息。
分析后不难看出,整个协议的目的即为:在服务器S的帮助下,让A、B之间能够进行通信。
-
首先,A发送给服务器一段消息,其中包含可以验证身份的密码;
-
接着,如果密码正确服务器会回给A
KAB
,同时也会把KAB
发送给B一份。 -
然后,A向B发送使用
KAB
加密后的密文NA + 2
,B回给AKAB
加密后的密文NA + 3
,这样就证明了AB彼此间能够安全的通信。
3.4.2 问题2
如果服务器S受到了脱库攻击影响,用户的password泄露了,会带来什么影响?
如果是服务器受到了脱库攻击,并不会造成很严重的问题。因为正常人的服务器里,密码都不会存明文。即便是最简单的哈希加密,服务器里也只会存哈希加密后的明文,攻击者很难从中获得用户的私钥。
第四章 访问控制
4.1 概念
访问控制是在身份认证的基础上,依据授权对提出的资源访问请求加以控制,他是系统安全防范和保护的主要策略,它可以限制对关键资源的访问,防止非法用户的侵入或合法用户的不慎操作所造成的破坏。
4.2 控制访问三要素
-
客体(Object): 接受其他实体访问的被动实体。可以被操作的信息、资源、对象都可以认为是客体,例如信息、文件,网络硬件设施。
-
主体(Subject): 提出资源访问请求或要求的实体。 用户或其它任何代理用户行为的实体,例如计算机资源,如管理员、合法用户。
-
控制策略(Policy):确定主体是否对客体拥有访问能力的规则。 从数学角度来看,访问控制本质上是一个矩阵,行表示资源,列表示用户,行和列的交叉点表示某个用户对某个资源的访问权限(读、 写、执行、修改、删除等)。
4.3 控制访问基本原则
最小特权原则:最小特权原则是指应限定网络中每个主体所必须的最小特权,确保可能的事故、错误、网络部件的篡改等原因造成的损失最小。
多人负责原则:即授权分散化,对于关键的任务必须在功能上进行划分,由多人来共同承担,保证没有任何个人具有完成任务的全部授权或信息。
职责分离原则:指将不同的责任分派给不同的人员以期达到互相牵制,消除一个人执行两项不相容的工作的风险。例如收款员、出纳员、审计员应由不同的人担任。
4.4 访问控制每层应用
-
应用层:可实施灵活,丰富和复杂的安全策略
-
中间件:维护基本的保护特性(簿记系统,数据库系统)
-
操作系统:对操作系统级的资源实施保护(文件,网络等)
-
硬件:进程的物理保护(处理器和内存管理硬件)
4.5 经典访问控制策略
4.5.1 自主访问控制
允许用户自己对客体将已有的权限赋予给其他主体,也可以撤销自己赋予给其他主体的权限。
矩阵结构分为三个主要的表:
-
访问控制矩阵
-
访问控制列表
-
权能表
矩阵的局限性:
-
大小为主体数量×客体数量,容易造成空间浪费
-
搜索权限效率低
-
扩展性差
优化办法or解决办法:
-
按行和列进行矩阵拆分
-
将同类用户分为一个用户组
4.5.2 强制访问控制
见第五章
4.6 课后习题
4.6.1 访问控制矩阵
为了保证数据安全,系统管理员可对不同的文件针对不同的用户/用户组设置不同的权限。现假设系统中的不同用户/组对不同文件的权限如下矩阵。请据此回答问题。
-
请结合上述矩阵,指出主体和客体在这里分别指什么。
-
采用访问控制矩阵进行权限管理,当文件、用户数量较多时,存在什么问题?
-
针对2中的问题,采用不少于2种方式改进本题中的访问控制矩阵,并画出改进后的访问控制矩阵。
Q1:矩阵中的主体和个体:
主体:root、user1、user2、user3
客体有:file1、file2、file3、file4
Q2:访问控制矩阵进行权限管理的局限性:
-
大小为主体数量×客体数量,容易造成空间浪费
-
搜索权限效率低
-
扩展性差
Q3:在用户、文件数量越来越多时,访问控制列表(ACLs)、基于角色的访问控制(RBAC)是更好的权限管理方法。
访问控制列表(ACLs)是一种将资源(如文件、目录或网络对象)和用户权限之间的关系存储在列表中的方法。它为每个资源分配了一个列表,其中包含了所有被授权访问该资源的用户和他们的权限。这样,管理员只需要针对每个资源设置权限,而无需在整个系统中进行权限分配。这可以减少权限管理的复杂度,并提高安全性。
一个用户对多个文件——>全能表;一个文件对多个用户——>访问控制列表。
基于角色的访问控制(RBAC)是一种将用户和权限之间的关系存储在角色上的方法,而不是直接存储在用户上。这种模型将用户分组为不同的角色,并将权限分配给这些角色,而不是直接分配给用户。当用户加入或离开某个角色时,他的权限也会随之改变,从而简化了权限管理过程。
4.6.2 权能表
用户\文件 | file3 | file4 |
---|---|---|
root | 可读、可写 | 可读、可写 |
用户\文件 | file1 | file2 |
---|---|---|
user1 | 可读、可写 | 可读 |
用户\文件 | file2 | file3 | file4 |
---|---|---|---|
user2 | 可读、可写 | 可写 | 可读 |
用户\文件 | file2 | file3 | file4 |
---|---|---|---|
user3 | 可读、可写 | 可读 | 可读 |
4.6.3 访问控制列表
文件\用户 | user1 |
---|---|
file1 | 可读、可写 |
文件\用户 | user1 | user2 |
---|---|---|
file2 | 可读 | 可读、可写 |
文件\用户 | root | user2 | user3 |
---|---|---|---|
file3 | 可读、可写 | 可写 | 可写 |
文件\用户 | root | user2 | user3 |
---|---|---|---|
file4 | 可读、可写 | 可写 | 可读 |
4.6.4 RBAC
按照算法思想,将权限存储在角色,而非直接存储在用户上,再给每个用户分配一个角色实现权限管理。我们不难发现可以将user2、user3当做一个角色,将root、user1各设一个角色,改进后的矩阵如下:
角色\文件 | file1 | file2 | file3 | file4 |
---|---|---|---|---|
root | 可读、可写 | 可读、可写 | ||
user1 | 可读、可写 | 可读 | ||
角色组(user2、user3) | 可读、可写 | 可写 | 可读 |
4.7 常见突破访问控制手段
-
SQL注入
-
缓冲区溢出漏洞
第五章 多级安全
建立安全模型的方法:
-
信息流模型
-
访问控制模型
5.1 BLP模型
5.1.1 模型构建
不能下写、不能上读,保持数据的机密性。
例子:军事、商务、外交的机密性强场景。下级可以给上级进行汇报,但下级不能读取上级的作战计划。
5.1.2 隐通道问题
时间隐通道:高密存在一个木马病毒希望发给低密。每隔时间固定间隔访问低密的文件夹,访问即发送1,不访问发送0
存储隐通道:通过信道指针的移动,访问指针左边空间为1,访问右边为0
5.2 Biba模型
5.2.1 模型构建
不能上写、不能下读,保持数据的完整性。
例子:铁路旅客信息系统可以读取轨道信令但不可写