Spitojava:由SPI演算自动生成的java代码的密码协议
摘要:这项工作的目的是描述一个自动生成java代码实现在正式规范中描述的协议语言SPI演算的加密。Spitojava是SPI演算的一组工具的一部分,还包括一个预处理器,一个分析器和一个安全分析仪。后者可以较为正式地分析协议和检测协议的缺陷。当一个协议进行了分析并且对其已经达到的正确性有足够的信心,Spi2Java可以生成一个相应的正确的Java实现的协议,从而大大减少在编码阶段引入的安全缺陷的风险。
1简介
一个在现代计算机科学中最具挑战性的实际问题是如何保证设计和实现正确的安全协议。这样的协议扮演的角是实现安全目标,例如通过使用加密技术实现身份认证,保密性和完整性。出于这个原因,他们也被称为加密协议。
最近,许多研究工作一直致力于分析加密协议的逻辑正确性的问题(如[3] [6] [7] [2] [11]),而实现正确性的问题还没有被认为是这么多。其中一个可能的方法,从正式规范[7] [12] [9]实现自动生成以确保实施正确性。如果代码发生器是这样的,在生成的代码忠实地实现了本说明书和避免编程错误,可能会导致安全漏洞,实施正确的可取的。因此,如果源规范在逻辑上是正确的,那么它就实现了。在本文中我们将展示如何将这种方法可在框架中投入实践,其中目标代码语言是Java和密码协议在spi演算[1]中被指定,
这个过程代数规范语言专门为这种协议定制。
2SPI演算
该SPI演算在[1]中被定义为一个扩展π演算[8]与加密基元。它是一个为描述和分析加密协议而设计的过程代数语言。该SPI演算有两个基本的语言:术语,表示数据和流程,以代表的行为。在本文中,我们只介绍一些功能SPI演算,通过一个例子,由于有限的空间。图。Fig..1显示了SPI calculus1规范安德鲁[5]密钥交换协议。
本说明书是由两个过程描述命名为PA和PB,这代表了该协议的两个角。该研究过程所表示的相互作用场景:PA和PB同时运行的一个实例。发起者角的过程PA和研究所过程是由M数据参数化,且必须被发送。M作为一个参数明传,因为这是由安全分析工具[3]所需的。与睦相反,在其他协议参数都是隐式的。
Fig.1的左侧一栏显示交换的消息使用非正式的,直观的表示经常遇到在文献中,其中A→B:σ意味着A发送消息给B。中间一栏显示pA的SPI演算规范流程,而右边栏展示过程中PB的行为。安德鲁协议假定每个进程都有一个其中对称密钥存储的本地密钥库。由于密钥存储区明确参与协议,它必须在SPI演算中被建模。我们简单的建模策略是表示密钥存储作为单独的进程(在Fig.1中没有显示),其与相应的协议交互主要通过专用的通信信道(密钥-存储通道)。获取和存储密钥的操作被建模为在密钥存储通道有区别地输入和输出。更准确地说,一个密钥存储在一个允许其独特的标识的别名下的密钥存储区中。所以,检索存储的密钥的操作由下式表示KeyStore < xA > .KeyStore(kAB) 其中的KeyStore表示交互通道,XA是别名和kAB是摘录自密钥存储区保存的可变量。相应的存储操作是由语句KeyStore< XA,k1AB >说明,其中k1AB是必须根据该别名为xA被存储的密钥。注意密钥存储区的可见性是由运算符@所限制的,所以它被认为是私有的过程。在安德鲁协议运行的中,五种信息在pA和pB的通道cAB之间交换:1)pA的发送的pB
其标识符A和随机数Na。 pB收到的消息,并将这两个字段分别存储在变量xA和xNa中。2)pB从它的
本地密钥存储区中检索与PA共享的kAB,并建立一个新的密钥k1AB,与 xNa一起用kAB进行加密,并将结果发送给pA。pA接收到该消息,并通过从它的本地密钥存储区中检索出的KAB进行解密。通过计算被存储在xNa和xK1AB的明文(Na和k1AB)得到的两个字段和Na和xNA的值进行匹配检查。3)pA发送用共享密钥k1AB加密的随机数Na给 pB。pB解密该消息,并检查收到的随机数xnewNa和xNa之间的匹配。随后的pB将k1AB存储在其本地密钥库中的别名下,从而覆盖KAB。4)PB发送pA的一个新的随机数Nb。pA的接收随机数并在其本地密钥库中用k1AB取代kAB。现在的密钥就完全一致。5)pA的使用k1AB加密秘密信息M,并将其发送到的pB。pB收到的加密邮件,将其解密并存储M在变量x。
3工具架构
生成的代码为每个协议的角组织成一个独立的程序,并且这种方案在任何一个协议的新会话被执行时可以被激活。因此,Spi2Java在一个时间生成一个单一的协议角(例如Fig.1中的pA)。进程指定只有特定的实例场景(像Fig.1中的机构)是不相关的,并在代码生成时被忽略。
该Spi2Java程序是由两个模块组成:术语打印和描述检查部分和Java代码自动生成模块。所生成的代码是基于Java库的模块实现,在一个可配置的方式,可以发生在Spi演算描述的基本操作。Fig.2显示出在整个工具架构的数据流。
4术语打印和描述检查模块
Spi演算不是类型化的,所以术语打印及描述检查负责填补协议规范和实现关注的数据类型之间的信息差距。特别是,该功能块自动检查在协议的作用过程是否条件变量被持续地使用,而且如果这个检查
是
积极的,自动分配具体的Java类型给条件变量。
java源代码加密长期型分配是由一个算法与最专业的安全地代表它的Java类相关联的任何条件变量来执行。用户可以手动执行更专门类型的若干变量通过被读取的规范文件和通过该模块进行解释。手动指定一个更特殊类型是可能的,但不是必需的。例如,如果一个进程不能对术语进行任何操作除了把它送出来,消息类型是对于这个术语来说完全恰当的。
我们用组织三个专业化水平的类层次结构(图3只显示了一些类,由于空间有限,虽然Spi2Java处理所有的spi演算的功能)的,可以通过信道传送术语及另一种对于通信信道简单的层次结构,由于通道类依赖于应用传输库,并在过程中的作用(客户端/服务器)。因此,当它是一个通用的用于发送/接收消息或当它代表存储密钥和/或数字证书本地密钥库的接入点时可能是专业化的通信信道的密钥库通信信道,一个术语将作为通道类型。下面图3中是对类术语的含义的简要说明。消息是专业化程度较低的类型,因为它代表任何消息。每当算法是不能够为它确定一个更专业的类型时,一个术语的类型则为消息。名称是表示任何非结构性的spi演算术语(即SPI演算名称)的特殊类型的一部分。名称是由不能被实例化一个类来实现的,因为这个类的对象总是更专业具体的类的对象。名称可以是任何级别3类对象,但它甚至可以是一个新的用户定义派生类的对象。信道ID表示一个信道标识符。它对于为一个服
务器角打开一个新的通信信道发送在现有的信道上的信息是来说是有用的。SharedKeyT代表一个在对称加密系统中使用有密钥。NonceT表示一个随机选择的比特序列。标识符代表的一些以独特的方式标识一个实体的信息。例如,它可以被用作别名来标识存储在密钥库内部的一个密钥。HashT表示对某些数据应用加密散列函数后的结果。SharedKeyCiphered代表对一些数据的对称加密操作的结果。该操作可以是加密或解密。PairT表示的一对可能是异构类型的对象的容器。对象的元组被翻译,里面的程序,到嵌套配对对象。
5安全类库
安全类安全库提供了一组以灵活和可配置的方式实现类中的所有基本数据类型和加密操作可以抽象地表示在SPI演算。这个库作为对安全供应商,负责提供加密算法的具体实现的通用接口。被用于测试安全类和生成的代码是指那些和。这个库在很大程度上依赖于Java序列去构建数据包在通信信道发送和/或加密。安全类库,设计了特殊照顾,追求几个目标:1)有严格的对应关系,据此,各Spi演算的术语对应于一个Java类中的安全类库,如图Fig.3所示。请注意,每个SPI演算语句相当于一个简单的Java构造调用一个术语对象的方法。2)类和方法隐藏加
密算法行为和管理的内部复杂性。3)用户能够(通过一个特殊的类,其中常量可以修改)的方式来定制类的内部行为,为每个不同类型的加密操作选择安全提供程序,算法和相关参数。4)已经注意到,
实现了生成的代码效率,得益于类执行效率。5)每个类的实现一直保持尽可能接近它的抽象模型,并已经避免,可导致已知安全漏洞的编程错误。需要注意的是一个完整的遵循是无法实现的,因为所使用的加密技术是不完美的。事实上加密操作的实现只能近似于加密算法的理想化的行为。例如,假设完美的加密条件(完美加密)的不同消息的哈希值永远不会发生碰撞。
6传输层接口
安全类库包含三个接口,一个名为的channelID来表示一个信道标识符,ChannelT来表示一个通用的客户端/服务器通信通道,并SERVERT 代表通用服务器进程等待传入的客户端请求。所有这些类是与所使用的传输层库的相互作用点。以这种方式,为所生成的代码实现层独立。用户可以通过规范性文件来指定它。
传输层的类隐藏传输层管理和启用任何SPI演算的输入/输出操作到适当的Java代码的直接翻译。
7 java代码自动生成器
Java的自动生成提供了Java实现的SPI演算描述的协议的作用,并部分地被规范文件影响,用户可以指定几个实现选择,例如哪个角(客户端/服务器)必须分配给SPI演算的进程,什么条件都返回参数,哪些传输库必须被使用。生成的代码使用了it.polito.安全类和已选择的传输模块库提供的类和方法。
从SPI演算规范,以及相关的规范文件开始,代码生成器将Java协议的实现类写在协议文件中。代码生成器也产生一个应用程序框架(在应用程序文件之上)和其他一些对启动客户端应用程序/服务器有用的类文件,因为用户通常会使用的握手协议作为一个目标应用程序的前奏。该协议文件是由SPI演算的行为表达语法指导翻译生成的。更确切地说,Spi演算的语法树被访问,并为每个SPI演算的操作,前面有一个说明注解的产生的Java代码来实现它。后者增强了代码的可读性,使通信与SPI演算规范可见。图。4显示了最有意思的一段在协议文件中生成的安德鲁协议的pA的过程代码。返回对象由getReturnParameter(INTI)(这里没有显示)的方法检索。当一个错误异常产生发生时生成ClassCastExceptions。这可能发生在信息接收和反序列化操作。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论