Zzangg  

第7章 安全信道

7.1安全信道的性质

大致定义:A与B间安全的连接

7.1.1角色

双向连接,同时有不对称(区别)
存在攻击者,可以读取并操纵内容
存储可看作向未来发送数据

7.1.2密钥

要求:
    只有 Alice 和 Bob 知道密钥 K。
    每次安全信道被初始化时,就会更新密钥 K。
安全信道的设计要达到128 位的安全性需要256 位长度

7.1.3消息或字节流

考虑离散数据流
密码学家视角:没有可靠的通信协议,通信意义上的可靠协议智能反丢失,且不能防止攻击者在数据流里修改、插入、(移除?)数据等主动攻击

7.1.4安全性质

隐私性:除了消息mi,的长度和发送时间外,Eve无法得到有关消息mi的任何其他信息
准确顺序:即使 Eve通过操纵正在传输的数据对信道进行攻击,Bob接收到的消息序列m'1,m'2,⋯必须是序列m'1,m'2,⋯的子序列。并且Bob很清楚地获悉他收到的是哪一个子序列(子序列就是从原序列中去掉0个或更多的元素后得到的序列)。

7.2认证与加密的顺序

先加密,后认证

原因:
    先加密更安全,MAC能修补加密函数的某些缺陷
    丢弃消息更有效,更能应对DoS类攻击

先认证,后加密

原因:
    由于要先突破加密,对MAC的攻击更困难,而加密函数更为坚固
    Horton原则:要对消息的含义进行认证,而不是对消息本身进行认证。后认证会引发风险

同时加密和认证,将结果组合起来

原因:能够提高性能,但MAC有可能泄露消息的隐私信息

7.3安全信道设计概述

7.3.1消息编号

特性:单调增加且唯一
作用:
    为加密算法提供需要的IV;
    拒绝重放的消息;
    判断在通信过程中丢失了哪些消息;
    以正确的顺序接收消息。
惯例:
    32位长度:可满足大多数应用
    从1计数:N种可能中有N-1个作为编号,0作为编码已用完(3)

7.3.2认证

采用用HMAC-SHA-256作为认证函数
Mac值a可计算如下ai:=MAC(i||l(xi)||ximi),其中l(xi)可以帮助准确地解析区域

7.3.3加密

使用CTR模式下的AES,且将瞬时值的处理内嵌(将消息编码作为唯一瞬时值)

密钥流由k0,k1,⋯组成,对瞬时值为i的消息,密钥流定义为∶k0,k1,⋯k236-1=E(K,0||i||0)||E(K,1||i||0)||…||E(K,232-1||i||0)||

每个明文分组由32 位的分组编号、32位的消息编号以及64 位的0组成

7.3.4组织格式

由于Bob需要知道消息编号,所以消息应由编码为 32 位整数的i(其中最低有效字节在前)与加密后的mi和 ai组成……i不加密!

7.4详细设计

7.4.1初始化

初始化算法包含建立密钥和建立消息编号

函数 InitializeSecureChannel
输入∶ K 256 位的信道密钥
	  R 角色说明,确定参与方是 Alice 还是 Bob
输出∶ S 安全信道的状态
首先计算所需要的4个密钥。这4个密钥是没有长度或以零终止的ASCII字符串。
KeySendEnc 	← SHA-256 (K"Enc Alice to Bob")
KeyRecEnc 	← SHA-256 (K"Enc Bob to Alice")
KeySendAuth ← SHA-256 (K"Auth Alice to Bob")
KeyRecAuth	← SHA-256(K"Enc Bob to Alice")
#如果参与方是 Bob,交换加密密钥和解密密钥。
if R= "Bob" then
	swap(KeySendEng, KeyRecEnc)
	swap (KeySendAuth, KeyRecAuth)
fi
#将发送和接收的计数器置0。发送计数器是发送的最后一个消息的编号,接收计数器是接收的最后一个消息的编号。
(MsgCntSend,MsgCntRec) ←-(0,0)
#将状态打包
S←-(KeySendEne,
	KeyRecEnc,
	KeySendAuth,
	KeyReAuth,
	MsgCntSend,
	MsgCntRec)
return S

还应存在清除状态信息S的函数来清除内存

7.4.2发送消息

此模块以会话状态、要发送的消息以及用于认证的附加数据为输入,输出准备发送的已加密和认证的消息。接收者必须拥有相同的附加数据以进行认证检查

函数 SendMessage
输入∶	S 安全会话状态
	  m 要发送的消息
	  x 用于认证的附加数据
输出∶ r 发送给接收者的数据
首先检查消息编号并更新。
assert MsgCntSend < 2^32- 1
MsgCntSend ← MsgCotSend + 1
i ← MsgCntSend
#计算认证码,l(x)和i 都用 4 个字节编码,最低有效字节在前。
a←HMAC-SHA-256(KeySendAuth, i||l(x)||x||m)
t←m||a
#生成密钥流。分组密码的每个明文分组由4个字节的计数器、4个字节的i以及8个全0字节组成,整数的最低有效字节在前。E是使用 256 位密钥的AES 加密算法。
K ←KeySendEnc
k ←E(0||i||0)←E(0||i||0)·⋯
#形成最终的文本。i用 4个字节编码,最低有效字节在前。
t ←- i||(t⊕First-l(r)-Bytes(k)) 
return t

检测消息计算器是否达到最大值

将i与加密和认证的消息一起发送

如要填充,请在解密时验证

7.4.3接收消息

输入有SendMessage算法计算出来的经加密和认证后的消息,以及用于认证的附加数据x

函数 ReceiveMessage
输入∶	  S 安全会话状态
 		t 接收者收到的数据
		x 用于认证的附加数据
输出∶   m 实际发送的消息
接收者收到的信息必须至少包含有4个字节的消息编号和32个字节的MAC域,这个检查保证以后对消息的分割可正常进行。
assert (1) ≥ 36
#将t分割为i、加密的消息和认证码。分割是确定的,因为i总是占用4个字节
i||t ←- 1
#生成密钥流,过程如同发送者。
K ←- KeyRecEnc
k ←- E((0||i||0)E(1||i||0)…
#解密消息和 MAC域并进行分割。分割是确定的,因为a总是占用 32个字节。
m||a ←t⊕First-l(r)-Bytes(k)
#重新计算认证码。l(x)和i都用 4个字节编码,最低有效字节在前。
a' ← HMAC-SHA-256(KeyRecAuth,i||l(x)||x||m)
if a'≠ a then
	destroy k,m
	return AuthenticationFailure
else if i ≤MsgCntRec then
	destroy k, m
	return MessageOrderError
fi
MsgCntRec ←-i
return m

收到大量错误包应检测系统

在返回错误信息前销毁数据k和m

7.4.4消息的顺序

接收者同发送者一样,通过修改MsgCntRec变量来更新状态S
解决颠倒问题
    通过修复传输层来防止消息顺序颠倒
    保留重放保护窗口,最新消息为c则保留c-31~c的位图,相当于计网中滑动窗口?
    当安全信道运行于可靠传输协议上时,丢包时就立即停止(表明行道出现了某种错误)

7.5备选方案

由于SHA-256的开销非常高,所以考虑使用一些专用的分组密码模式

OCB模式

效率很高,并行处理,但受限于专利

CCM模式

将CTR加密和CBC-MAC认证结合,但计算量是OCB的两倍

CWC模式

CTR加密,底层全域散列认证,并行处理效率高,改进模式GCM

7.6习题

7.1 在安全信道的设计中,我们提到消息编码不能重复。那么如果消息编码重复出现,会产生什么后果?

答:如果消息编码重复出现,不能判断是哪一条信息是应该放在此顺序的消息。

7.2 将本章设计的安全信道算法修改为使用先加密然后认证的顺序。

答:初始化部分不变

发送消息部分:

函数 SendMessage
输入∶ S 安全会话状态
m 要发送的消息
x 用于认证的附加数据
输出∶ r 发送给接收者的数据
首先检查消息编号并更新。
assert MsgCntSend < 2^32- 1
MsgCntSend ← MsgCotSend + 1
i ← MsgCntSend

生成密钥流并加密

K ←KeySendEnc
k ←E(0||i||0)←E(0||i||0)·⋯
t ←- m⊕(First-l(m)-Bytes(k))
a←HMAC-SHA-256(KeySendAuth, i||l(x)||x||t)
t ←- i||t||a
return t

接受消息部分:

函数 ReceiveMessage
输入∶ S 安全会话状态
t 接收者收到的数据
x 用于认证的附加数据
输出∶ m 实际发送的消息
接收者收到的信息必须至少包含有4个字节的消息编号和32个字节的MAC域,这个检查保证以后对消息的分割可正常进行。
assert (1) ≥ 36
i||t||a ←- t

重新计算认证码。l(x)和i都用 4个字节编码,最低有效字节在前。

a' ← HMAC-SHA-256(KeyRecAuth,i||l(x)||x||t)
if a'≠ a then
destroy k,m
return AuthenticationFailure
else if i ≤MsgCntRec then
destroy k, m
return MessageOrderError
fi

生成密钥流并解密

K ←- KeyRecEnc
k ←- E((0||i||0)E(1||i||0)…
m ← t⊕First-l(m)-Bytes(k)
MsgCntRec ←-i
return m

7.3 修改本章的安全信道算法,其中使用专用的单密钥模式来提供加密和认证。可以使用OCB、CCM、CWC或 GCM 作为黑盒。

7.4 试分析比较在安全信道设计中以不同顺序应用加密函数和认证函数的优缺点。

答:

先加密,后认证可通过MAC能修补加密函数的某些缺陷,并且丢弃消息更高效,更能应对DoS类攻击,但对于MAC的攻击难以预防
先认证,后加密可使对MAC的攻击更困难,想要获取MAC需要破解加密,可加密函数更为坚固,还不违背Horton原则,但如果认证的安全性依赖于加密的安全性,如果不得不采用一些有缺陷的加密函数,则难以保证安全
同时加密和认证能够提高性能,但MAC有可能泄露消息的隐私信息

7.5 试以一个安全信道的产品或系统为例,可与习题1.8中所分析的产品或系统相同。试根据1.12 节中提到的方法,这个产品或系统进行安全审查,但这里着重讨论与安全信道相关的隐私和安全问题

7.6 假设Alice 和Bob的通信过程使用本章中所设计的安全信道。Eve是在通信过程中的窃听者。Eve通过窃听加密信道上的通信可以获得何种类型的流量分析信息?试描述一种情况,其中通过流量分析导致的信息泄露是一种非常严重的隐私问题。

答:Eve可获得轻松获得消息编号。Eve可知晓两人活动的频率,还可通过消息编号的重置判断系统开启与连接时间,如果可以通过系统外观测,还可推断其他隐私。

第8章 实现上的问题I

木桶原理:寻找与实现有关的漏洞比寻找加密系统的弱点更容易
正确实现密码学的原因:
    让人们认识到安全性的隐患,以及正确实现安全性的重要性
    对加密系统的攻击不可见,危害性极大
    密码系统会得到长久的使用

8.1创建正确的程序

正确性:运行和规范完全一致

IT行业不知道如何写出正确的程序或模块

8.1.1规范

问题:功能规范文档缺失或缺乏,无法定义和检验正确性

程序规范三阶段:

    需求规范∶关于程序应当完成的功能的非正式描述。

    What而不是How,注重宏观结构,不注重实现细节

    功能规范∶功能规范对程序的行为进行详尽的细节定义。

    只对可在程序外部度量的部分进行规范。是测试已经完成的程序的基础,规范中的任意一项都可以|应该被测试。

    实现设计∶ 指定了程序内部的工作方式,包括了所有无法从外部进行测试的部分。

    好的实现设计通常将程序分成几个模块,并对各个模块的功能进行描述,好到描述可作为需求规范

8.1.2测试和修复

测试只能表现出错误的存在,但是不能够证明错误是不存在的

如果发现一个程序中的错误,首先实现一个检测这个错误的测试,并验证它能够检测出这个错误。然后修正这个错误,并确保测试程序不能再检测到这个错误。最后,继续在每一个后续版本上运行这个测试程序,以确保这个错误不再出现。
一旦发现了一个错误,找出引发这个错误的原因,同时全面检查程序。看在程序的其他地方是否还有类似的错误。
对发现的每一个错误进行跟踪。对错误进行简单的统计分析可以显示程序的哪—部分容易有错误,或哪一类错误会经常发生等等,这种反馈对一个质量控制系统来说是必要的。

8.1.3不严谨的态度

人们对程序中的错误有着不可置信的不严谨的态度,程序中的错误被认为是自然而然的事情。

8.1.4如何着手

参考航空工业:安全系统涉及行业里的每一个人;对几乎每一步操作都有非常严格的规则和过程;在出现故障的情况下有多种备用的方案。
编写正确程序成本高,但与潜在错误所付出的代价相比,长期来看划算

8.2制作安全的软件

标准的实现技术完全不适合于编写安全的代码。

正确的软件:按下按钮A,发生事件B
安全的软件:无论如何不会发生事件X

8.3保守秘密

我们需要防止秘密信息(密钥、数据)泄露,它们在内存中短期(瞬时?)存储

8.3.1清除状态

原则:立即将不再使用的数据清除
引申:在对存储介质失去控制之前,应该清除里面存储的信息

原因:数据保存的时间越长,其他人获取数据的机会就越大
方法:在库中依靠主程序清除秘密,如C++中对象的析构函数、Java中的finalization函数;最好在语言层面就能为清除数据提供支持
危险:使用库进行开发的程序员不好调用清除函数;编辑器优化后改变了函数执行过程;秘密信息已被垃圾回收程序处理而无法清除

8.3.2交换文件

虚拟内存系统原理:当运行一个程序时,并不是所有的数据都保存在内存里,其中有些被存在一个交换文件中,当试图访问那些不在内存中的数据时,程序就被中断,虚拟内存系统从交换文件中读出所需要的数据并放入内存,然后这个程序继续运行。另外,当需要更多的可用内存空间时,将会从被某个程序占用的内存空间中任取一块,并将这个程序写入交换文件。

8.3.3高速缓冲存储器

定义:存储量比较小但速度比较快的内存,在主存和CPU之间,保存了主内存中最近使用的数据的副本
原理:高速缓冲存储器保存了主内存中最近使用的数据的副本,如果 CPU要访问这些数据,它首先检查高速缓冲存储器。如果数据在高速缓冲存储器中,则 CPU 就会以相对较快的速度得到这些数据;如果数据不在高速缓冲存储器中,则 CPU就从主内存里读数据(相对较慢),并把数据的副本保存在高速缓冲存储器中方便以后使用。
风险:
    数据的修改在高速缓冲存储器中发生而没有写入主内存
    标记为无效数据却没清除

8.3.4内存保留数据

内存会驻留一些旧数据,重新通电后即可恢复部分或所有
SRAM(静态RAM)中:如果相同的数据存入内存的同一单元一段时间,那么该数据将变成这个内存单元所优先的通电状态。(类似烧屏)
DRAM(动态RAM)中:DRAM通过在非常小的电容器上存储一个小电荷来工作,电容器周围的绝缘材料将会受到产生的电场作用,导致这些材料发生变化,特别会引起杂质迁移。电容器不放电,数据不消失

8.3.5其他程序的访问

共享内存通常由两个程序设立以降低风险
调试器和超级用户都能够访问内存数据

8.3.6 数据完整性

传输中用MAC保证完整性,本地(使用操作系统)应保证硬件设施可靠

考虑到会处理大量数据,可使用ECC内存降低错误的可能性
应注意超级用户和调试器修改程序内存权力

8.3.7需要做的工作

操作系统和编程语言都不支持完全阻止泄露的功能,只能根据具体工作环境尽力而为

8.4代码质量

8.4.1简洁性

定义:消除不必要的选项和特性

目的:为减少复杂性而代理的威胁而简洁

不使用委员会提供的一致性设计,其加入的额外特性会增加复杂性
不为用户提供额外选项以保证默认的安全性,最多只提供安全or不安全
帮助用户做出最好的安全单一的模式选择

8.4.2模块化

定义:将系统分成一些模块,然后分别设计、分析、实现每一个模块

目的:可使复杂系统一管理

每一个模块都应只解决自己的问题,提供简单易懂的接口
可在单个模块的环境下分析原因,而不是牵一发而动全身
应确保任务可以大批量地完成,而且仅仅优化那些对程序可度量的性能产生重大影响的部分。

8.4.3断言

定义:每个模块都不能信任其他模块,并且始终检测参数的有效性,强迫限制调用顺序,并且拒绝执行不安全的操作

目的:捕捉尽可能多的错误

规范文档应带有每一个断言失败及对应的失败原因
任何时候,在可以对系统内部的一致性进行检查时,就应该增加一项断言。捕捉尽可能多的可以捕捉到的错误,
在实际系统中保留所有错误检查,使用户能够发现产生了错误结果

8.4.4缓冲区溢出

缓冲区溢出难以避免,所以不要使用允许缓冲区溢出的编程语言

8.4.5测试

目的:发现隐含错误而不是安全漏洞

测试集类型:

由模块功能规范产生的通用测试集

    应尽量覆盖模块间的所有功能

    理想方法:一人实现,一人测试

由模块程序员自己开发出来的测试程序,用来测试对程序实现的限制
    需要对模块内部设计有所了解

伪随机数测试:可用伪随机数快速生成测试序列
快速测试代码:用已知正确的结果检测输出来判断代码正确性

8.5侧信道攻击

必要性:对没有考虑侧信道的系统,侧信道攻击的成功率很大
抵抗方式:结合各自应对措施,包括软硬件
实际上侧信道攻击难以执行,(可能)只对智能卡有真正威胁

8.6一些其他的话

安全性不只与密码系统的设计有关,而是和系统的各个方面都有相关,它们各尽其责以实现系统的安全性

保证代码质量:考虑从开始开发到最终产品的时间,而不是开始开发到第一个有缺陷版本完成的时间

推荐书目:

MeGraw的《Software Security∶ Building Security In》

Howard和Lipne编写的《The Security Development Lifecycle》

Dowd、McDonald和Schuh的《The Art of Software Security Assessment; Identifying and Preventing Software Vulnerabilities》

8.7习题

8.1 结合个人计算机的硬件和软件配置,分析8.3 节中所提到的各类问题。

答:在升级电脑时,如果需要二手处理硬盘的话,我们需要考虑清空硬盘中的数据防止自己的隐私泄露。仅仅格式化清空硬盘是不够的,一些数据位还是会存在原地址上,只是标志位表示那些数据位位空而已。我们可以在格式化后在硬盘中反复拷贝大文件以刷掉原地址位置上可能存在的敏感数据。软件方面,不少浏览器和社交软件上都会自动存储用户的登录密码,就像是未清空的数据位容易被攻击者利用。而且由于人的记忆是有限的,总有密码重合的情况,攻击者在略尽推理后很容易得到过去甚至未来的密码。

posted on 2023-03-19 13:57  Zzangg  阅读(28)  评论(0编辑  收藏  举报