国密技术在物联网项目中的应用之理论篇

本系列文章将从理论、工具和实战三个方面,分享在物联网开发项目中使用国密技术的一些心得。
1、理论篇
1.1、基础知识
1.1.1、算法、密钥和加密方式
通常把用于解决复杂问题的步骤,称之为算法(algorithm)。在密码运算中,由算法生成密钥,由密钥实现不同的加密方式。
常见的加密算法可以分为三类,对称加密算法、公钥密码算法(又称作非对称密码算法)和杂凑算法。
在这里插入图片描述

由对称加密算法生成的密钥称为对称密钥,某些场景下,也称作会话密钥。对称加密方式是指在加密和解密两个过程中使用同一个密钥,也被称作单密钥加密。
在这里插入图片描述

由非对称加密算法生成的用于加密/解密的密钥对称为加密密钥对,密钥对包含公钥和私钥。非对称加密方式是指在加密和解密两个过程中使用不同的密钥。一般来说,在加密过程中使用公钥,在解密过程中使用私钥。公钥是可以向全网公开的,而私钥则需要用户自己保存。
在这里插入图片描述

杂凑算法是一种保证数据完整性的密码技术,可以有效的防止数据被篡改。
总结:对称加密方式的加解密效率高,但在非安全信道中通讯时,密钥交换的安全性不能保障。非对称加密方式的加解密效率低,但可以保证密钥安全性。在实际应用时,往往是配合使用,例如在SSL协议中,握手阶段采用非对称加密方式,双方一旦握手成功,通过协商出的对称加密算法生成会话密钥,进入对称加密方式,后续的通信数据都会使用该会话密钥来加密和解密传输的数据。
1.1.2、国际标准密码算法
国际标准密码算法是指被广泛接受和采用的密码学算法,其设计和标准化由国际组织或国际标准化机构负责。国际标准密码算法主要有AES、DES、3DES、RSA、SHA256等。
 AES:美国标准,对称密码算法。
 DES:美国标准,对称密码算法,安全性不强已弃用。
 3DES:DES算法的加强版本,实际安全级别低于理论安全级别。
 RSA:应用最广的非对称密码算法,基于大整数分解难题。
 SHA256:美国标准,属于密码散列函数算法,本质就是哈希函数。
1.1.3、中国商用密码算法
中国商用密码算法是指由中国国家密码管理局制定并推广使用的密码学算法,也称作国密算法。ZUC、SM2、SM3、SM4、SM9等一系列商用密码算法构成了我国完整的密码算法体系,特别是,SM2/SM3/SM9密码算法被采纳为ISO/IEC国际标准,为促进国际密码学发展和保障应用安全提供了中国方案。
 ZUC算法:也称作祖冲之算法,属于对称密码算法中的序列密码。
 SM4算法:属于对称密码算法中的分组密码。
 SM2算法:全称为SM2椭圆曲线公钥密码算法,非对称密码算法。
 SM3算法:全称为SM3密码杂凑算法。
 SM9算法:全称为SM9标识密码算法。
1.1.4、商用密码产品认证
商用密码产品认证是指对商用密码产品的安全性、可靠性和兼容性等方面进行检测、评估和认证的过程。通过认证的商用密码产品将获得相应的认证证书,以证明其具备一定的市场竞争力和消费者信赖度。
进行商用密码产品认证经常会提到一个名词“边界”,比如你的产品在已公布的35类商用密码产品中属于哪一种?再比如,产品需要配合平台或者其他工具一起使用,本次认证的产品主体又是什么?如果边界划分不清楚,会大大增加认证的复杂度和成功率。认证涉及到的材料如下所示:
在这里插入图片描述

申请商用密码产品认证,需要选择权威认证机构,如果是第一次申请,对技术文档和流程不熟悉,可以向认证机构购买额外的辅导服务,保证技术方案是安全可行的。当然了,后续的认证服务也是收费的。

1.1.5、柯克霍夫原则
科克霍夫原则(也称科克霍夫假说) 是奥古斯特·柯克霍夫于19世纪提出的密码理论,具体内容如下:
即使除密钥外的整个系统的一切都是公开的,这个密码体制也必
须是安全的。即使攻击者知道系统中的加密算法和解密算法,此系统
也必须是安全的。
柯克霍夫原则认为,“一个安全保护系统的安全性不在于它的算
法对于对手来说是保密的,而是应在于它所选择的密钥对于对手来说
是保密的”。柯克霍夫原则告诉我们,系统的安全性依赖于密钥的安
全性,而不依赖于算法的保密性。在大多数民用场合,算法应公开并
接受公众的检验。

1.1.6、序列化、TLV和ASN.1
一般来说,数据的处理有两种情况,一种是数据存储,比如我们常见的结构体、数组或者文件等;另外一种就是数据传输,数据在网络中传输时,实际上传输的就是比特流。那么接收方如何解析这些收到的比特流呢?这时候就需要对数据进行序列化,把相应的数据转化成可以自解释的比特流。所以,序列化是把对象数据转换成字节流的一种规则,反序列化就是序列化的逆向。
总之,序列化最终的目的是为了实现对象可以跨平台存储和网络传输,这一点在分布式、大数据量系统设计里的需求尤为显著。
很多语言都有自带的序列化方法,比如Java的Serializable接口,Python的pickle模块等等。不依赖语言的序列化方式有JSON、XML和CSV等等,其中JSON是时下最流行的一种序列化方案。
TLV全称为Tag_Length_Value,是一种数据结构,用于在通信协议中传输数据。其中,Tag是指数据的类型,Length是指数据的长度,Value是指数据的值。使用TLV编码/解码数据帧时,需要注意Length的编码格式有两类,一类是不定长方式(IndefineForm),一类是定长方式(DefineForm)。其中,定长方式按照长度是否超过一个八位,又分为短形式和长形式两种。一个TLV编码的数据帧格式如下:
在这里插入图片描述

这里重点介绍下ASN.1标准,ASN.1被称作密码学专用语言,我们需要对它有一定的了解。ASN.1全称为Abstract Syntax Notation One,抽象文法描述语言,它是一种跨平台的数据序列化的接口描述语言。ASN.1使用抽象语法对各种编程语言定义的数据类型进行了重新定义,它有五种编码规则,我们此次的项目中会比较多的接触 DER编码规则。在后续的工具篇,我们会分享几个实用工具用来分析使用ASN.1标准编码的文件。这里给出一个简单的SM2签名值使用ASN.1标准的DER编码分析示例:

在这里插入图片描述

1.1.7、数字证书与PKI
前面介绍了密钥的知识,密钥用来加密通信数据,但这并不能完整的保证通信安全,因为它无法解决双方的身份问题,容易遭受中间人攻击,从而出现公钥被掉包,信息泄露的问题。如下图所示:
在这里插入图片描述

要解决双方的信任问题,由此引入了数字证书。数字证书又称公钥证书或身份证书,是一种由可信第三方机构颁发的电子身份证书,是互联网或物联网安全的重要组成部分
X.509基于ASN.1标准,由国际电信联盟的标准化部门定义,它是数字证书的一种标准格式。X.509证书包含公钥、标识信息(主机名、组织或个人)、证书颁发结构签名或自签名等信息,它已经应用在包括TLS/SSL在内的众多网络协议里,同时它也应用在很多非在线应用场景里,比如电子签名服务。有关X.509证书的详细描述请参考文档RFC3280。
在X.509里,组织机构通过发起证书签名请求(CSR)来得到一份经过签名的证书。因为发起的证书签名请求的语法规范符合RFC2986:PKCS#10,所以证书签名请求又被称作P10请求。
仅仅制定证书的规范还不足以支持公钥的实际运用,还需要制定其他的规范来配合使用,例如证书应该由谁来颁发、如何颁发、如何作废以及相互之间如何交换等等。故此,公钥基础设施应运而生,它是为了能够更有效地运用公钥而制定的一系列规范和规格的总称,按照其英文(Public-Key Infrastructure)缩写而简称为PKI。PKI的组成要素主要有三个:用户(使用PKI的人)、认证机构(颁发证书的人)和仓库(保存证书的数据库)。
数字证书与PKI是当前互联网环境下安全通信的基石,解决了不安全的网络环境下通信双方的身份与公钥的信任问题。以下是一个数字证书的应用场景:

在这里插入图片描述

1.1.8、SKF接口库和SDF接口库
针对支持国密算法USB KEY设备的应用,国家颁布了一个行业标准《智能密码钥匙应用接口规范》(GM/T0016-2012),市面上销售的国密算法的USB KEY设备也都(其实也是必须)支持这个接口规范。因此,只要根据这个规范开发的应用程序,就可以兼容使用不同厂家及品牌的USB KEY产品。由于此规范中函数名称都以SKF开头,所以我们一般把按照此规范提供的设备开发接口库叫做SKF库或SKF接口。
同理,SDF接口是指按照《密码设备应用接口规范》(GM/T0018-2012)提供的设备开发接口库。
1.1.9、数字信封
数字信封(digital envelope),一种数据结构,包含用对称密钥加密的密文和用公钥加密的该对称密钥。这是《GMZ 0001-2013密码术语》中的定义。为了便于理解,我们也可以称之为一种综合了对称和非对称密码技术的方法。数字信封的生成和解开图示如下:
在这里插入图片描述

在《GM/T 0014-2012数字证书认证系统密码协议规范》中规定,凡基于RSA算法的数字信封报文格式见PKCS#7,凡基于SM2算法的数字信封报文格式见GM/T 0010。

1.2、加密算法库
加密算法库有很多,这里不再一一列出,仅仅说明我们在项目中具体考察使用过的加密算法库。在我们具体项目中,最终在平台端选择了使用BC库,在设备端使用MbedTLS库。
1.2.1、OpenSSL——C/C++
OpenSSL是一个包含安全套接字层和传输层安全协议的开源软件库,它几乎成为安全领域的事实标准,Apache使用它加密HTTPS,OpenSSH使用它加密SSH。OpenSSL对国际标准密码算法的支持比较完整,但仅支持部分国密算法。
项目地址:https://www.openssl.org/
OpenSSL中文文档:https://open-ssl.cn/

1.2.2、GMSSL——C/C++
GmSSL是支持国密算法和标准的OpenSSL分支,增加了对国密SM2/SM3/SM4算法和ECIES、CPK、ZUC算法的支持,实现了这些算法与EVP API和命令行工具的集成。GmSSL 由北京大学信息安全实验室 (http://infosec.pku.edu.cn) 开发和维护。
GMSSL底层提供了SDF和SKF引擎接口,可以很方便的和USB-Key设备对接。
项目地址:http://gmssl.org/

1.2.3、MbedTLS——C
MbedTLS(前身PolarSSL)是一个开源的SSL/TLS算法库,最早由ARM公司开源和维护,现在已经移交TrustedFirmware 社区维护,由Linaro公司管理。
核心SSL库使用C语言编写,并实现SLL功能,且没有外部依赖;最小完整的TLS堆栈需要60KB的程序空间和64KB的RAM,比较适合小型嵌入式设备。MbedTLS不支持国密算法,如果想使用国密算法,需要自行扩展。
项目地址:https://github.com/Mbed-TLS

1.2.4、Bouncy Castle——JAVA平台
Bouncy Castle 是一种用于 Java 平台的开放源码的轻量级密码术包。它支持大量的密码术算法,并提供 JCE 1.2.1 的实现。Bouncy Castle 是轻量级的,从 J2SE 1.4 到 J2ME(包括 MIDP)平台,它都可以运行,它是在 MIDP 上运行的唯一完整的密码术包。BC库支持完整的国密算法。
项目地址:https://www.bouncycastle.org/

1.3、硬件加密和软件加密
这里不讨论硬件加密和软件加密在安全上的区别,仅从应用的角度讨论二者的差异和使用。硬件加密指使用安全芯片进行密码运算的操作;软件加密是指采用加密算法库进行密码运算的操作。按照应用场景的不同,安全芯片的使用又分为作为算法引擎使用和作为USB-Key使用。
1.3.1、安全芯片作为算法引擎使用
在MCU作为主控场景下,此时的安全芯片更多的是作为硬件算法引擎使用,一方面是因为安全芯片厂家提供的接口库几乎都是基于Linux的,另一方面MCU的资源很少,难以支撑运行像GMSSL之类的。此时,最好的处理方式是把安全芯片作为算法引擎使用。
作为算法引擎使用时,常规做法是为安全芯片编写驱动,应用层调用驱动提供的密码运算接口节课。在此次的项目中,为了便于扩展,我们采用分层思想,为安全芯片编写的驱动包含硬件驱动层(实现SPI/I2C驱动等)、传输层(发送接收逻辑)和会话层(封装密码运算接口)。
笔者使用过国内不少的安全芯片,其中宏思的安全芯片资料比较齐全,会向用户提供写好的安全芯片驱动demo,大大降低了开发难度和节省了项目时间。
1.3.2、安全芯片作为USB-Key使用。
在使用SOC作为主控的场景下,安全芯片作为USB-Key是更好的选择。安装好安全芯片厂商提供的USB驱动,再加载接口库就可以直接使用了。
笔者在使用时只遇到了一个问题,原因是数据类型错误,后来是通过查看help命令参数说明解决了这个问题。这里也为大家分享一下,具体命令是“-authkey”,如下图所示:
在这里插入图片描述

1.3.3、软件加密
如果要使用国密算法,建议在Linux平台下安装GmSSL库,先基于命令快速上手、熟悉国密算法的基本使用。由于我们项目中的测试环境采用的GmSSL库,所以后续的介绍也会以GmSSL为主。
抛开安全因素不谈,软件加密与硬件加密的最大区别在于数据格式的不同,软件加密往往会在计算结果中添加说明标识或者数据补位,而硬件加密则不会改动结果。
以SM2公钥来举例说明二者的区别,在《GM/T 0009-2012 SM2密码算法使用规范》中,规定SM2公钥的长度为64字节,由x和y分量组成,分量长度为32字节。但是在使用软件算法库生成的SM2公钥中,长度为65字节,如下图所示:
在这里插入图片描述

这里的“04”标识表示未压缩公钥,如果公钥经过压缩,标识可能为“02”或者“03”。除此之外,在SM2加解密时,当公钥x分量第一个字节值大于0x80时,需要补位0x00;在SM2签名时,若签名结果R或者S的第一个字节的最高位为1,则也要补位0x00等情况。在软件加密与硬件加密需要交互时,尤其要注意这一点。
1.4、参考标准和书籍
无规矩不成方圆,安全设计重中之重的密码算法也是有着相应的参考标准作为依据。网络上的大佬已经做了整理,为我们省去不少找资料的时间,直接上链接。
中华人民共和国密码行业标准(GM/T)文本汇总:
https://github.com/guanzhi/GM-Standards

RFC中文翻译网站:
https://rfc2cn.com/

参考书籍:
《图解密码技术》(人民邮电出版社)
《商用密码:应用与安全性评估》(电子工业出版社)
《密码技术与物联网安全:mbedtls开发实战》(机械工业出版社)

备注:
相关参考文件已打包,可在本人上传的资源中免费下载https://download.csdn.net/download/simon_zhangss/89236234

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值