APP下载

基于OpenSSL的SM2与RSA自动切换算法的设计

2018-02-07贾冀芳张立新廖明耀

计算机工程与应用 2018年3期
关键词:服务端套件新建

贾冀芳,张立新,廖明耀

北京中电普华信息技术有限公司 研发事业部,北京 100192

1 引言

我国政府高度重视密码算法国产化升级改造工作[1]。国家电网公司也高度重视基础软硬件的自主、安全、可控工作。在安全中间件项目中使用SSL/TLS协议实现HTTPS的安全访问。但是,SSL/TLS协议使用的密码算法套件全部是国外密码算法,不符合自主、安全、可控的要求[2-3]。因此,决定使用国家商用密码算法(以下简称:国密算法)[4]替换国外通用密码算法(以下简称:通用密码算法)实现SSL/TLS协议。新的问题出现:国密算法的速度要比同安全级别的通用密码算法的速度慢,不能满足大并发、高性能用户的需求。为平衡性能与安全性两方面的需求:在满足性能的前提下,有效提高系统的安全性,在OpenSSL上设计一种能够根据当前每秒新建SSL/TLS连接数,自动选择SM2或RSA[5]的算法。即SSL/TLS连接既可以使用提前配置好的密码算法套件,也可以在握手过程中根据当前每秒新建连接数自动选择密码算法套件。

2 背景概述

2.1 研究背景

安全中间件系统由客户端和服务端两部分组成:客户端是支持基于国密算法和通用密码算法SSL/TLS协议的浏览器。服务端包括支持基于国密算法和通用密码算法SSL/TLS协议的Web服务器和WebService服务器以及数据库。用户使用浏览器发起https访问请求,服务端和用户端进行基于SSL/TLS协议的证书认证(双向认证可选)、加密传输访问请求与响应数据。安全中间件系统中的SSL/TLS协议既支持通用密码算法也支持国密算法。系统组成架构如图1所示。

图1 基于国密算法的应用服务器中间件组成架构

2.2 研究现状

SSL/TLS协议的安全性和性能包括握手协议和记录协议的安全性和性能。其中,记录协议使用对称密码算法,而国外通用对称密码算法与国家商用对称密码算法在密钥长度相等的情况下性能相当、安全性也相当(不考虑后门)。因此,SSL/TLS协议的安全性和性能主要取决于握手协议的安全性和性能[4]。

基于握手协议主要采用非对称密码算法实现,其安全性主要取决于非对称密码算法的安全性。握手协议通常使用的非对称密码算法是RSA。为了在密钥长度相当的情况下提高握手协议的安全性,有研究使用ECC(椭圆曲线加密算法)算法替换RSA算法[6-7]。我国政府为实现信息安全的自主、可控,要求用国产SM2(由国家保密局根据ECC加解密原理推出的椭圆曲线密码算法)算法替换RSA。密钥长度为233的SM2或ECC算法与密钥长度为2 240的RSA算法的安全强度一样是112级。具体安全级别对照表如表1所示[5]。

表1 SM2/ECC、RSA及对称密码算法安全级别对照表

性能方面,与握手协议中4个阶段、13次交互相比[5],非对称密码算法的性能对握手协议性能的影响更显著。在实际应用中,由于SSL/TLS协议常常应用在实时场景中,对性能要求较高。因此,选择高性能的非对称密码算法就显得更加重要[6]。

ECC算法与RSA相比,虽然在相同密钥长度下安全性更高,但是性能却低于RSA[8-9]。ECC在密钥长度不高于283位时的签名时长是RSA的平均6.7倍,验签时长是RSA的平均53倍[10]。

在CPU Intel P4 2.0 GHz、内存512 MB的PC机上对长度为100 KB的文本文件进行签名与验签测试,具体性能数据请参见文献[10]。

同样,SM2算法与RSA相比,在相同安全级别下,RSA性能高于SM2。在相同计算环境下,256位的SM2性能是2 048位的RSA的0.32倍。256位SM2的签名速度是2 048位RSA的9倍,256位SM2的验签速度是2 048位RSA的0.056倍,加密速度与验签速度相当,解密速度与签名速度相当。

表2 SM2与RSA性能对照表 次·s-1

在SSL/TLS产品中,在相同计算环境下,基于SM2的SSL/TLS协议的每秒新建连接数是基于RSA的大约0.3倍。SSL/TLS连接性能对照表如表3所示。

表3 SM2_SSL/TLS与RSA_SSL/TLS性能对照表

2.3 问题分析

在相同计算环境下,SM2算法实现的SSL/TLS握手协议的性能是RSA算法的0.3倍。在高并发的要求下,SM2算法不能满足用户对高性能的需求。针对这一问题,在SSL/TLS握手协议过程中设计一种算法可以在国密SM2算法与通用RSA算法之间自由切换,以实现在满足高性能要求的前提下有效提高系统的安全性。

以开源Openssl库为基础,设计一种自动切换算法:当用SM2建立的SSL/TLS每秒新建连接数不能满足用户需求时,系统自动切换到RSA算法,用RSA算法建立SSL/TLS连接,提高每秒新建连接数以满足用户性能需求。

与现有用SM2实现SSL/TLS握手协议相比,自动切换算法能有效提高系统的性能,规避SM2性能低的弱点。与现有用RSA实现SSL/TLS握手协议相比,自动切换算法能有效提高系统的安全性。自动切换算法可以在高性能和高安全性之间达到平衡,在满足高性能需求的前提下尽最大可能提高系统的安全性。

3 系统设计

假设,性能需求是SSL/TLS每秒新建连接数为6 000。根据卫士通SAG3000的性能指标,用SM2算法每秒新建数为3 000,不能满足性能需求。用RSA算法每秒新建连接数为9 000,能满足性能需求,但是不能有效提高安全性。因为RSA是国外算法,不能自主、可控。SM2与RSA自动切换算法指先用SM2算法建立SSL/TLS连接,当SM2的每秒连接数达到3 000时,自动切换到RSA算法,用RSA算法建立SSL/TLS连接,当RSA的每秒新建连接数达到9 000时,再重新切换回SM2算法,此时平均每秒连接数为6 000,满足性能要求。这样在高性能的要求下有效提高了系统的安全性。

具体设计如下:在OpenSSL1.0.2版本上设计SM2与RSA的自动切换算法。首先,设置SM2的每秒新建连接数上限为3 000,RSA的每秒新建连接数上限为9 000。当SM2的每秒新建连接数达到3 000时,则系统选择RSA算法建立SSL/TLS连接,当RSA的每秒新建连接数达到9 000时,则系统重新选择SM2算法建立SSL/TLS连接。

3.1 数据结构

在SSL/TLS服务端设置8个全局变量:(1)SM2的当前新建连接数:SM2_conn_num,记录当前SM2建立的连接数;(2)SM2计时器:SM2_timer,记录建立SM2连接所用时间。(3)SM2当前每秒新建连接数:SM2_conn_num_persec=SM2_conn_num/SM2_timer,记录当前SM2每秒新建连接数。(4)RSA的当前新建连接数:RSA_conn_num,记录当前RSA建立的连接数。(5)RSA计时器:RSA_timmer,记录建立RSA连接所用时间。(6)RSA当前每秒新建连接数:RSA_conn_num_persec=RSA_conn_num/:RSA_timmer,记录当前每秒新建连接数。(7)当前连接计时器:curr_conn_timer记录建立当前连接所用时间。(8)当前密码算法:curr_cipher,记录当前使用的是SM2还是RSA。

int SM2_conn_num;/*SM2当前新建连接数*/

int SM2_timer;/*SM2计时器*/

int SM2_conn_num_persec/*SM2当前每秒新建连接数*/

int RSA_conn_num;/*RSA当前新建连接数*/

int RSA_timmer;/*RSA连接计时器*/

int RSA_conn_num_persec;/*RSA当前每秒新建连接数*/

int curr_conn_timmer;/*当前连接计时器*/

bool curr_cipher;/*当前使用的密码算法*/

3.2 算法

SSL/TLS服务端默认加密套件设置为SM2+SM3+SM4,curr_cipher默认设为SM2。服务端收到SSL/TLS客户端发来的Client Hello消息时,先检查当前SM2每秒新建连接数是否等于或大于3 000(SM2_conn_num_persec≥3 000)并且当前RSA每秒新建连接数是否小于9 000(RSA_conn_num_persec<9 000),如果是,则服务端重新设置密码套件为RSA+SHA1+AES256。并将该密码套件信息通过服务端的ServerHello消息发送给客户端。同时将SM2_conn_num_persec重新设为0,将当前密码算法curr_cipher设为RSA。否则(SM2_conn_num_persec<3 000 or RSA_conn_com_persec≥9 000),服务端使用默认的加密套件SM2+SM3+SM4,并将该加密套件信息通过服务端的ServerHello发送给客户端。同时将RSA_conn_num_persec重新设为0,将当前密码算法curr_cipher设为SM2。客户端和服务端继续后续的SSL/TLS握手协议。当握手协议完成,如果当前使用的密码算法是SM2,则计算SM2当前每秒新建连接数(SM2_conn_num_persec)。如果当前使用的密码算法是RSA,则计算RSA当前每秒新建连接数(RSA_conn_num_persec)。

主算法框架如图2所示。

握手算法框架如图3所示。

图3 握手算法框架

密码套件切换算法框架如图4所示。

图4 密码切换算法框架

4 关键技术

4.1 握手协议

SM2与RSA的自动切换算法在SSL/TLS握手协议中实现。SSL/TLS握手协议是客户端和服务端建立SSL连接时使用的第一个子协议,握手协议包括客户端与服务端之间的一系列消息。该协议允许服务端和客户端双向身份认证,协商加密算法和摘要算法以及对称加密密钥,用来加密在SSL记录中发送的数据[11]。握手协议是在应用数据传输之前使用的。握手协议的4个阶段如图5[12]。

图5 SSL/TLS握手过程

第一阶段——建立安全能力

SSL握手的第一阶段(图6)启动逻辑连接,建立这个连接的安全能力。首先客户端向服务端发出ClientHello消息并等待服务端响应,随后服务端向客户端返回ServerHello消息,对ClientHello消息中的信息进行确认。

图6 SSL/TLS握手协议阶段一

ClientHello消息包括:(1)Version:客户端可以支持的SSL最高版本号;(2)Random:用于生成主秘密的客户端随机数;(3)Session id:确定会话的会话ID;(4)Cipher suite:客户端可以支持的密码套件列表;(5)Compression method:客户端可以支持的压缩算法列表[11]。

服务端用ServerHello信息应答客户端,包括下列内容:(1)Version:SSL版本号,取客户端支持的最高版本号和服务端支持的最高版本号中的较低者;(2)Random:用于生成主秘密的服务端随机数;(3)Session id会话ID;(4)Cipher suite:根据 SM2_conn_num_persec≥3 000 and RSA_conn_num_persec<9 000,选择密码套件,如果是,则从客户端的密码套件列表中选择与服务端相匹配的RSA相关密码套件,否则(SM2_conn_num_persec<3 000 or RSA_conn_num_persec≥9 000)从客户端的密码套件列表中选择与服务端相匹配的SM2相关密码套件,(5)Compression method:从客户端的压缩方法列表中选择压缩方法。

这个阶段之后,客户端和服务端知道了下列内容:(1)SSL版本;(2)密钥交换、签名、验签和加密算法;(3)压缩方法;(4)用来生成密钥的两个随机数。

该阶段的消息结构如下:

ClientHello消息[11]

版本主从随机数时间 随机字节会话ID长度ID加密套件列表长度 套件列表压缩方法列表长度 方法列表

ServerHello消息[11]

?

第二阶段—— 服务端身份认证与密钥交换

服务端启动SSL握手第二阶段,服务端是本阶段所有消息的唯一发送方,客户端是所有消息的唯一接收方。该阶段分为4步(如图7):(1)发送服务端证书:服务端将数字证书和到根CA的整个证书链发给客户端,使客户端能用服务端证书中的公钥认证服务端身份;(2)服务端密钥交换(可选):这里视密钥交换算法而定,如果选择的是RSA或SM2算法,则不需要发送密钥交换消息;(3)客户端证书请求(如果要求客户端身份认证):服务端要求客户端证书;(4)服务端握手完成:第二阶段结束。

图7 SSL/TLS握手协议阶段二

这个阶段的前面的(1)证书 和(2)服务端密钥交换是基于密钥交换算法的。而在SSL中密钥交换算法有以下几种:无效(没有密钥交换)、RSA、SM2、匿名Diffie-Hellman、暂 时 Diffie-Hellman、固 定 Diffie-Hellman、Fortezza。

在阶段一客户端与服务端协商的过程中已经确定使用哪种密钥交换算法。如果协商过程中确定使用RSA交换密钥,那么过程如图8。

图8 阶段二服务端RSA证书及密钥交换消息

服务端在它的第一个消息中,发送服务端RSA加密/解密公钥证书。服务端公钥证书是客户端用来验证服务端身份的。服务端第二个消息是空的。

如果在阶段一客户端与服务端协商确定的是使用SM2交换密钥,那么过程如图9。

图9 阶段二服务端SM2证书及密钥交换消息

服务端在它的第一个消息中,发送服务端SM2公钥证书。该证书是客户端用来验证服务端身份的。服务端第二个消息是空的[13]。

该阶段的消息格式如下所示:

证书Certificate消息[11]

?

密钥交换KeyExchange消息

第三阶段——客户端身份认证与密钥交换

客户端启动SSL/TLS握手第三阶段,该阶段分为三步:(1)客户端证书(如果要求客户端身份认证):为了证明客户端的身份,客户端要发送自己的证书信息给服务端,这是可选的。(2)客户端密钥交换KeyExchange:这里客户端生成预主密钥(Pre-master-secret),并用服务端公钥对其加密,最后发送给服务端。(3)客户端证书验证certificate_verify(如果要求客户端身份认证):客户端对从第一条消息以来的所有握手消息的HMAC值用私钥进行签名,并发送给服务端,服务端用客户端公钥验证签名。

不要求客户端认证的密钥交换过程如图10所示。

图10 阶段三客户端密钥交换消息

需要客户端身份认证的密钥交换过程如图11。

图11 阶段三客户端证书及密钥交换消息

第四阶段——完成

客户端启动SSL/TLS握手第四阶段,使握手协议结束。该阶段分为4步,如图12所示。

图12 阶段四客户端证书及密钥交换消息

客户端发送ChangeCipherSpec告诉服务端,接下来的消息将采用新协商的密码套件和密钥进行通信。客户端发送Finished消息给服务端。该消息是客户端对所有握手消息和计算出来的主密钥MasterSecret进行消息摘要,并将摘要发送给服务端,服务端在本地进行相同的消息摘要计算,与接收到的客户端发送过来的消息摘要进行比较,如果相等,则确认没有任何握手消息被篡改过。这是第一条使用新的密码套件进行加密传输的消息。

服务端验证完客户端发送的Finished消息后,向客户端发送ChangeCipherSpec消息,告诉客户端接下来的消息采用新协商的密码套件和密钥进行通信。服务端也向客户端发送Finished消息。该消息是服务端对所有握手消息和计算出来的主密钥MasterSecret进行消息摘要,并将摘要发送给客户端,客户端在本地进行相同的计算,并比较服务端发送过来的消息摘要,如果相等,则确认以上所有握手消息没有被篡改过。至此SSL握手阶段完成,SSL连接建立起来[14]。服务端如果使用的是SM2算法则重新计算SM2当前每秒新建连接数SM2_conn_num_persec,如果使用的是RSA算法则重新计算RSA当前每秒新建连接数RSA_conn_num_persec。服务端和客户端开始通过记录协议加密传输上层应用数据。

该阶段ChangeCipherSpec消息结构非常简单,只有一个值为1的字节。

该阶段Finished消息结构依据版本不同而不同。SSL v3.0的Finished结构含有两个字段md5_hash、sha_hash。如下所示[11]:

md5_hash sha_hash

TLS v1.0的Finished结构只含有一个字段sha_hash。如下所示[11]:

verify_data

4.2 记录协议

SSL记录是SSL协议发送和接收的基本单位。它与其他网络协议之间的关系如图13所示。

图13 SSL记录协议与其他网络协议之间的关系

SSL记录层协议实际上是一个简单的封装或者说是“打包”协议。记录可能是明文传送的,也可能是被加密传送的,具体需要看通信实体所处的阶段。

明文记录结构如下[15]所示:

密文记录如下所示。阴影的部分是经过加密的,而且是作为一个整体加密。记录头信息始终是明文传送。消息验证码HMAC确保消息的完整性。填充和填充长度只有在双方采用分组加密的情况下才会出现的字段。如果是采用序列加密,则不存在。填充的目的是使 Length(数据)+Length(HMAC)+Length(填充)+Length(填充长度)等于所使用分组加密算法的块大小的整数倍[15]。

?

5 实现过程

5.1 变量定义

根据3.1节设计的数据结构,在openssl的ssl.h文件中增加8个全局变量。

5.2 函数定义

(1)初始化新增全局变量。根据3.2节设计的算法。在openssl的S_socket.c文件中的do_server函数中初始化新增的全局变量。

(2)更新当前每秒连接数。在openssl的S_server.c文件中的sv_body函数中的i=init_ssl_connection(con)语句后更新当前每秒连接数。

(3)切换密码套件。在openssl的S3_lib.c文件中的ssl3_choose_cipher函数中的ret=sk_SSL_CIPHER_value(allow,ii)语句后,切换密码套件。

6 测试与结果

6.1 测试环境

测试环境包括硬件环境、软件环境、网络环境、测试工具,具体如表4所示。

表4 测试环境

6.2 测试方案

用LoadRunner11对SSL/TLS连接的性能进行测试。包括三组测试:第一组只使用SM2算法建立SSL/TLS连接;第二组只使用RSA算法建立SSL/TLS连接;第三组使用SM2与RSA自动切换算法建立SSL/TLS连接。

观察三组测试在并发用户数达到6 000时,SSL/TLS最高每秒新建连接数和平均每秒新建连接数。

测试步骤如下:并发用户数通过每台客户机模拟500个用户,12台客户机共模拟6 000个用户的方法实现。并发用户增长模式按照每台客户机每15 s增加5个用户,1 500 s(25 min)后达到500个并发用户,然后持续测试6 h。

第一组:只使用SM2算法的SSL连接性能如表5。

表5 SM2连接性数据

第二组:只使用RSA算法的SSL连接性能如表6。

表6 RSA连接性能数据

第三组:使用SM2与RSA自动切换算法的SSL连接性能如表7。

表7 SM2与RSA自动切换算法连接性能数据

6.3 测试结果

通过以上三组测试数据可以得出如下结论:SM2与RSA自动切换算法的SSL/TLS连接性能高于单独使用SM2算法的连接性能,但低于单独使用RSA算法的连接性能。但是其性能指标已达到需求。同时使用SM2与RSA自动切换算法的连接,在满足性能需求的前提下,有效提高了安全性。

第三组测试,SM2算法与RSA算法自动切换过程如下:当SSL/TLS的每秒新建连接数小于3 000时,SSL/TLS新建连接采用SM2密码套件,当每秒新建连接数大于或等于3 000时,采用RSA密码套件建立连接。如果RSA的每秒新建连接数达到9 000时,系统再次选择SM2建立SSL/TLS连接。SM2与RSA密码套件切换如图14、15所示。

图14 测试结果:使用SM2密码套件

图15 测试结果:使用RSA密码套件

6.4 结论

通过实验和测试得出了在并发建立SSL连接过程中,当每秒新建SSL连接数小于3 000时,使用SM2密码套件进行握手,当每秒新建SSL连接数大于或等于3 000时,使用RSA密码套件进行握手。当每秒新建连接数大于或等于9 000时,系统再次切换到SM2密码套件。使得系统平均每秒新建连接数达到6 000,并在此期间尽可能多地使用SM2密码套件。

7 结束语

为SSL/TLS协议的安全性与性能同时满足用户的需求,鉴于国家商用密码算法(国密算法)的安全性强于通用密码算法、性能弱于通用密码算法的现状,在OpenSSL基础上实现的SM2与RSA自动切换的算法以实现在性能满足用户需求的情况下有效提高系统安全性的目标。

[1]GM/T 0024-2014SSL VPN技术规范[S].北京:中国标准出版社,2014.

[2]韩晓薇,乌力吉,王蓓蓓,等.抗简单功耗攻击的SM2原子算法[J].计算机研究与发展,2016,53(8):1850-1856.

[3]史汝辉.一种针对SM2解密算法的侧信道攻击方法[J].密码学报,2015,2(5):467-476.

[4]Aciiçmez O,Schindler W.A vulnerability in RSA implementations due to instruction cache analysis and its demonstration on OpenSSL[C]//Malkin T.CT-RSA,2008,4964:256-273.

[5]张永建.RSA算法和SM2算法的研究[D].江西赣州:江西理工大学,2015.

[6]王魁,李立新,余文涛,等.基于ECC算法的TLS协议设计与优化[J].计算机应用研究,2014(11):3486-3489.

[7]杨文军.基于ECC算法的SSL协议改进[J].南开大学学报:自然科学版,2016(2):8-14.

[8]Gueron S,Krasnov V.Fast prime field elliptic-curve cryptography with 256-bit primes[J].Journal of Cryptographic Engineering,2014,5(2):141-151.

[9]Bhala A S,Kshirsagar V P,Nagori M B.Performance comparison of elliptical curve and RSA digital signature on ARM7[C]//International Conference on Information&Network Technology,2011.

[10]Jansma N,Arrendondo B.Performance comparison of elliptic curve and RSA digital signatures[R].University of Michigan,2004:1-20.

[11]何福均.OpenSSL握手过程的测试与分析[D].武汉:华中科技大学,2008.

[12]殷杰.OpenSSL分析与测试[D].天津:天津大学,2008.

[13]吴永强,国密SSL安全通信协议的研究与实现[D].西安:西安电子科技大学,2014.

[14]牛永川.SM2椭圆曲线公钥密码算法的快速实现研究[D].济南:山东大学,2013.

[15]白忠海.基于双基底乘法器的SM2公钥密码算法研究与实现[D].哈尔滨:哈尔滨工业大学,2014.

猜你喜欢

服务端套件新建
Spin transport properties in ferromagnet/superconductor junctions on topological insulator
重庆三年新建农村公路6.26×10~4 km
基于维修费用的关键部套件分析
“龙吟套件”创作感悟
万紫蝶、梁新建作品
云存储中基于相似性的客户-服务端双端数据去重方法
新时期《移动Web服务端开发》课程教学改革的研究
曹曙东、温新建作品
在Windows Server 2008上创建应用
工业照明超频三天棚灯套件改造工程