7&&8

第七章 安全信道

一、安全信道的性质

定义(不是一个正式的定义):Alice和Bob之间建立的一个安全的连接。

性质1:双向性:多数的连接都是双向的,Alice给Bob发送消息,Bob也同样会给Alice发送消息。

性质2:不对称性:在实际系统中,可能一方是客户端另一个则是服务器,或者更简单地采用发起者(发起安全连接的一方)和响应者。

二、密钥

要实现安全的信道,必须有一个共享的密钥

对密钥有如下要求:

(1)只有Alice 和 Bob 知道密钥K。

(2)每次安全信道被初始化时,就会更新密钥K。

会话密钥:每次会话所用的密钥K称为会话密钥。(每次建立安全信道时都需要重新建立一个合适的唯一密钥K)

三、消息或字节流

几乎所有的系统在密码层都使用离散消息系统。

底层传输系统是不可靠:

假设实现Alice和Bob之间传递消息的底层传输系统是不可靠的。(TCP是可靠的,但从密码学的角度看,它不能抵御主动攻击。从攻击对手的角度来看,根本没有可靠的通信协议)

四、安全性质

(1)除了消息的长度和发送时间外,Eve无法得到有关消息的任何其他信息。

(2)即使Eve通过操纵正在传输的数据对信道进行攻击,Bob接收到的消息序列必须是序列的子序列。并且Bob很清楚地获悉他收到的是哪一个子序列(子序列就是从原序列中去掉0个或更多的元素后得到的序列)。

五、认证与加密的顺序

三种顺序:

(1)先加密,然后再对密文进行认证(加密然后认证);

优势:理论结果表明,根据安全加密和认证的某些特定定义,先加密的方案是安全的,而其他方法是不安全的;可以更有效地丢弃伪造消息。

(2)先认证,然后再对消息和MAC值进行加密(认证然后加密);

优势:在大多数情况下,相比看到通信内容所造成的损害,修改通信数据是灾难性的攻击;Horton原则,即要对消息的含义进行认证,而对密文进行认证破坏了这个原则,从而就产生了缺陷。不是对消息本身进行认证。

(3)同时加密消息和认证数据,然后将两个结果组合(如连接)起来(加密同时认证)

优势:并行地进行,在某些情况下该方法可以提高性能。

六、安全信道设计概述

1.消息编号

消息编号可用于为加密算法提供需要的IV;无须存储大量数据即可让Bob拒绝重放的消息;Bob可用来判断在通信过程中丢失了哪些消息;保证Bob以正确的顺序接收消息。为此,消息编号必须单调增加(后面的消息必须有较大的消息编号)而且是唯一的(没有两个消息的编号是相同的)。

我们的安全信道设计中采用32位长度的消息编号,第一个消息的编号为1。消息编号必须是唯一的,所以不允许将它重置为0。

2.认证

一个MAC作为认证函数。用HMAC-SHA-256,使用它全部256位输出。

MAC值a可以计算如下:

3.加密

安全信道设计的加密算法使用CTR模式下的AES算法。

采用消息编码作为CTR模式需要的唯一瞬时值,仍然不会将生成瞬时值的生成交外部系统,建议不要直接使用CTR模式。

密钥流由![img](file:///C:\Users\LHP\AppData\Local\Temp\ksohtml\wpsEED1.tmp.jpg)组成,对瞬时值为i的消息,密钥流定义为:

4.组织格式

发送的消息将由编码为32位整数的i(其中最低有效字节在前)与加密后的
组成。

七、详细设计

双向信道:将信道定义为双向的。

1.初始化

(1)两个主函数:建立密钥和建立消息编号。

(2)信道密钥导出4个附属密钥:Alice 给Bob 发送消息所用的加密密钥和认证密钥,Bob给Alice发送消息所用的加密密钥和认证密钥。

2.发送消息

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

由于MsgCntSend被修改了,因此会话状态要更新。需要再次强调的是:这是至关重要的,因为消息编号必须唯一。

3.接收消息

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

在认证码被验证之前,ReceiveMessage 函数不能泄露关于密钥流和明文消息的任何信息。

危险在于攻击者可以发送一个伪造的消息(带有不正确的MAC值),但他可以从接收者发布出来的数据中得到密钥流。

八、消息的顺序

接收者要确保接收的消息编号严格地递增,这可以保证任何一个消息都不会被接收两次,但如果消息流在传输时改变了顺序,一些有效的消息将会丢失。

九、备选方案

1.OCB模式

最知名、最早的组合模式为OCB模式。这个模式的效率非常高,每一个明文分组都并行地进行处理,这对高速硬件是非常有吸引力的。但是由于一些专利的存在限制了OCB模式的应用。

2.CCM模式

将CTR模式加密和CBC-MAC认证结合起来的方案,通过仔细设计使得在CTR模式和CBC-MAC中使用相同密钥。与OCB相比,CCM需要两倍的计算量去加密和认证一个消息。

3.CWC模式

CWC基于CTR模式来提供加密功能,在底层采用全域散列函数来实现认证。CWC模式对全域散列函数的使用使得CWC可以完全并行化,但是不存在专利问题。

4.GMAC

GMAC消息认证方案实际上就是GCM模式中输入消息为空串时的情形。

使用:建议只是在128位长度的认证标签的情况下使用GCM;在OCB、CCM、CWC、GCM以及其他一些类似模式本身无法实现完全的安全信道,它们只提供了加密/认证功能,并且每个包需要一个密钥和唯一的瞬时值。

问题:如果攻击者只是去破坏或干扰信道中传递的信号(比如说在传递的信息中插入随机片段)而不在意信道中传输的具体内容,那么这种攻击手段还能避免吗?

第八章 实现上的问题I

实现加密系统最大问题:木桶原理的最脆弱环节。

一、规范

(1)需求规范:需求规范是关于程序应当完成的功能的非正式描述。

(2)功能规范:功能规范对程序的行为进行详尽的细节定义。

(3)实现设计:这个文件有很多命名,它指定了程序内部的工作方式,包括了所有无法从。

二、测试和修复

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

如果发现一个程序中的错误,首先实现一个检测这个错误的测试,并验证它能够检测出这个错误。然后修正这个错误,并确保测试程序不能再检测到这个错误。最后,继续在每一个后续版本上运行这个测试程序,以确保这个错误不再出现。

一旦发现了一个错误,找出引发这个错误的原因,同时全面检查程序,看在程序的其他地方是否还有类似的错误。

对发现的每一个错误进行跟踪。对错误进行简单的统计分析可以显示程序的哪一部分容易有错误,或哪一类错误会经常发生等等,这种反馈对一个质量控制系统来说是必要的。

三、不严谨的态度

人们对程序中的错误有着不可置信的不严谨的态度。

四、如何着手

千万不要以为你只需要一个好的程序员或很多次代码审查工作,或是经过ISO9001认证的开发过程,或者是完全的测试,甚至是以上描述的这些加起来,就足够了。

编写正确的程序的成本长期来看是划算的。

五、制作安全的软件

要求:缺失某些功能。也就是攻击者无论采取什么措施,它都不可能做X。

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

六、保守秘密

两类秘密信息:密钥和数据。这两类秘密信息都是瞬时的,不需要长期存储。数据只有在处理每个消息的时候存储,而密钥也仅仅在安全信道的持续期间存储。

七、清除状态

编写安全软件的基本规则:立即将不再使用的数据清除。数据保存的时间越长,其他人获取数据的机会就越大。

C++:每一个对象都有一个析构函数,这个析构函数可以清除状态。

C语言:通过调用memset 函数完成清除状态。

JAVA:至少保证finalization函数可以在程序退出时运行。

在C++语言中,至少在理论上可以编写一个在不再使用时清除所有状态的程序,但它的很多其他特性使得它并不适用于编写安全软件。Java使得清除状态变得很困难。

八、文件交换

虚拟内存系统可以从我们的程序所占用的内存空间中获取一些数据,并写入磁盘上的交换文件,而我们的程序却没有被告知或者注意到。

一旦计算机崩溃或者关机,这些数据仍然保存在磁盘上。问题在于并没有清除交换文件的机制,因此这些数据就会永远地存留在磁盘上。

解决:以使用系统调用,通知虚拟内存系统使指定的部分内存不被交换出去;锁定占用的所有内存。

九、高速缓冲存储器

现代计算机不是仅有一类内存,而是使用了有层次结构的内存。

高速缓冲存储器保存了一些数据的副本,其中包括秘密数据的副本,这对安全性来说很重要。问题是当我们试图清除秘密数据时,清除操作可能不会正常地发生。

在某些环境下,高速缓冲存储器知道特定的内存单元已经被修改,可能是被多CPU系统中其他CPU修改的。

十、内存保留数据

在内存里可以简单地重写数据并不能删除数据。

如果相同的数据存入SRAM(静态RAM)内存的同一单元一段时间,那么该数据将变成这个内存单元所优先的通电状态。由于DRAM的电容放电的方式,这些存储的数据可能在电源断电后仍然存在一段时间,甚至是在内存冷却后还存在。

*冷启动攻击*:可以在重新启动计算机后将内存中的密钥恢复。

*解决方案*:Boojum:设m是我们要存储的数据,代替原来的直接存储数据m,我们生成一个随机数R,然后存储R和。h是一个散列函数。这两个值被存储在内存的不同单元,最好不要靠得太近。其中的诀窍是以一定的时间间隔有规律地改变R,例如1秒,我们生成新的随机数,并将存储的数据更新为
。这样可以保证写入内存里的每一位都是随机的位序列。若要清除内存,只需用0替换m写入即可。

*局限性*:这种方法并不能保证内存被清除。

十一、其他程序的访问

计算机里的其他程序也可能会访问这些数据。一个危险来自于有特权的用户,称为超级用户或管理员。

十二、数据完整性

计算机里的其他程序也可能会访问这些数据。一个危险来自于有特权的用户,称为超级用户或管理员。

十三、需要做的工作

创建包括密码函数的程序库非常困难。保护秘密数据的安全要涉及对主程序的修改。

十四、代码质量

简洁性:复杂性是安全性的一大敌人,因此,任何安全性设计都要力争做到简洁。

模块化:模块化就是将系统分成一些模块,然后分别设计、分析、实现每一个模块。

模块的接口应尽量简单易懂,它的行为应该和用户合理的预期一致。

模块化是我们处理复杂系统的唯一有效的方法,因此它很重要。

断言:断言是改善代码质量的有用工具。

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

任何时候,在可以对系统内部的一致性进行检查时,就应该增加一项断言。捕捉尽可能多的可以捕捉到的错误,不论是你自己的还是其他程序员的。由断言发现的错误不会导致安全漏洞。

缓冲区溢出:不要使用C或C++。不论使用哪种语言,不要关闭对数组边界的检查。

测试:广泛的测试总是好的开发过程的一部分,测试可以帮助我们发现程序中的隐含错误,但对发现安全漏洞却没什么作用。

两类测试:第一类是由模块功能规范产生的一组通用测试集。第二类测试集是由模块程序员自己开发出来的测试程序,用来测试对程序实现的限制。

十五、测信道攻击

当攻击者有另外一个关于这个系统的信息通道时,就会发生这类攻击。

重要的侧信道攻击:时间攻击和RF辐射攻击。

posted @ 2022-03-27 20:54  氧气2019  阅读(722)  评论(0)    收藏  举报