第1章 物联网安全概述
1.1 本章主要内容
本章将介绍物联网安全相关基础知识。物联网安全和互联网安全既有联系又有区别,本章开始部分将简单介绍两者的区别与联系。物联网安全离不开密码技术,6种主要的密码技术是本书讨论的重点内容。本章还简单介绍了mbedtls,它是本书涉及的主要安全组件,mbedtls的具体使用方法将在其他章逐步展开。为了更好地理解密码学基础知识,本章还介绍了OpenSSL,它是互联网安全方面的“瑞士军刀”。
1.2 物联网安全基础
1.2.1 物联网安全与互联网安全
当前,我们生活在一个互联网的世界中,互联网应用非常普及,并对我们的生活方式产生了深远影响。现在,我们依赖智能手机和个人电脑进行通信、购买商品和支付账单等活动,智能手机和个人电脑已经深入我们工作和生活的方方面面。互联网应用的繁荣离不开各种各样的互联网协议,这些功能各异的互联网协议帮助智能手机和个人电脑与远程服务器交换数据,这些被传输的数据可能是一张图片、一段视频,也有可能是一个支付密码。在互联网世界中,人们在分享图片和视频的同时,账号和密码的安全可能并没有得到足够的重视。人们在最初设计互联网时并没有过多地考虑安全,像HTTP这样的核心互联网协议本质上也是不安全的。
随着互联网技术与应用的不断发展,互联网安全变得越来越重要。现在所有连接到互联网的智能手机和个人电脑都依赖传输层安全协议(Transport Layer Security,TLS),HTTP协议与安全传输层协议结合形成了全新的安全协议——HTTPS。2015年左右,国内业界发起了一场“全站HTTPS”运动,没过多久国内大多数知名网站都提供了HTTPS服务,人们可以更加放心地使用网络购物和电子支付。但HTTPS协议比非安全的HTTP协议更加复杂,它需要消耗更多的计算资源和内存资源。
互联网应用的蓬勃发展也促进了物联网应用的发展。近些年,出现了各种各样的物联网终端,这些物联网终端可以提供远程控制、场景联动和环境感知等功能。相比智能手机和个人电脑,物联网终端属于典型的受限制设备,这类设备往往无法提供充足的计算能力和内存空间,然而物联网应用的安全同样重要。那么,这些设备是否可以像智能手机一样使用HTTPS协议呢?本书其他章将介绍物联网如何借鉴互联网安全的成功经验,让终端设备可以像HTTPS那样安全地连接网络。
物联网安全与互联网安全既有交集又有差异,由于互联网安全发展较早,体系也更加成熟,所以物联网安全应借鉴互联网安全的成功经验,把TLS和HTTPS这样成熟的技术“移植”到受限制终端中。
1.2.2 物联网安全与密码学
互联网安全离不开密码学,物联网安全也同样离不开密码学,也就是说,密码学是互联网安全与物联网安全的基础。互联网安全更关注算法的安全强度,而物联网安全更关注算法的执行效率。密码学是应用数学的一个分支,密码学本身属于研究范畴,并不能直接用于工程实践,但是密码学提供的6种主要密码技术却是工程应用的“利器”,它们是单向散列函数、对称加密算法、消息认证码算法、公钥密码算法、数字签名算法和伪随机数生成器。为了满足不同的安全需求,可以将不同的密码技术进行排列组合。然而,密码技术还是不能直接使用的,所以国内外各种组织根据密码学工具的原理定义了各种标准,这些标准依赖密码学工具所提供的算法,把“公式”转化为“文档”。例如,单向散列函数包括MD5标准和SHA1标准,对称加密算法包括AES128、AES192和AES256等。为了实现物联网终端与服务器的安全通信,还需要把这些标准规范像搭积木一样整合在一起,所以,除了这些密码技术标准规范以外,还需要安全“框架”的支持。著名的安全框架包括TLS和DTLS等,这些安全“框架”定义了密码技术工具的组合方式和使用顺序。但TLS和DTLS这些框架依然处于“文档”层面,还需要通过代码实现TLS和DTLS所规定的内容。市面上有很多TLS/DTLS实现工具包,知名的工具包包括OpenSSL、wolfssl和mbedtls,其中OpenSSL常用于互联网应用,而mbedtls用于物联网应用。通过这些工具包最终才可以组成各种各样的物联网安全应用。物联网安全与密码技术的关系如图1-1所示。
图1-1 物联网安全与密码技术之间的关系
1.3 密码学安全常识
在系统讲解物联网安全应用之前,先介绍一个原则和4个人物。一个原则是柯克霍夫(Kerckhoffs)原则,4个人物分别是Alice、Bob、Eve与Mallory。
1.3.1 柯克霍夫原则
柯克霍夫原则(也称柯克霍夫假说)是奥古斯特·柯克霍夫(Auguste Kerckhoffs)于19世纪提出的密码理论,具体内容如下:
即使除密钥外的整个系统的一切都是公开的,这个密码体制也必须是安全的。即使攻击者知道系统中的加密算法和解密算法,此系统也必须是安全的。
柯克霍夫原则认为,“一个安全保护系统的安全性不在于它的算法对于对手来说是保密的,而是应在于它所选择的密钥对于对手来说是保密的”。柯克霍夫原则告诉我们,系统的安全性依赖于密钥的安全性,而不依赖于算法的保密性。在大多数民用场合,算法应公开并接受公众的检验。
《图解密码技术》一书指出了以下几点密码学安全常识:
·不要使用保密的密码算法。
·使用低强度密码比不进行任何加密更加危险。
·任何密码算法总有被破解的一天。
·密码只是信息安全的一部分。
1.3.2 Alice和Bob
为了方便描述物联网安全应用场景,本书依然沿用密码学中的两个重要人物Alice和Bob,通过Alice和Bob说明各种不同的应用场景。Alice和Bob只是信息交互的参与者,在物联网领域,Alice和Bob可能只是两个物联网终端的简称。Alice和Bob总是在不安全的通道中传递信息,并试图通过各种各样的密码技术工具保证信息的安全性。本书中,Alice使用一个女孩头像,而Bob使用一个男孩头像,如图1-2所示。Alice和Bob都非常善良,绝不会伪造或篡改消息。
图1-2 Alice和Bob
1.3.3 Eve和Mallory
由于Alice和Bob的信息交互是在不安全的通道中传输的,所以交互信息可能被窃听或攻击。在传统密码学经典教材中,窃听者一般被称为Eve,主动攻击者被称为Mallory。Alice、Bob、Mallory和Eve的关系如图1-3所示。
图1-3 Alice、Bob、Mallory和Eve的关系
1.4 mbedtls简介
mbedtls使开发人员可以非常轻松地在嵌入式产品中加入物联网安全功能。相比于OpenSSL这样的工具,mbedtls小巧灵活且易于使用。mbedtls具有多种多样的配置选项,这些配置选项可以帮助开发人员根据实际情况灵活地裁剪代码,降低对具体硬件平台的资源消耗。mbedtls提供的安全加密组件相对独立,开发者可以通过单个配置文件把单个功能加入应用中。另外,它还包括一个完整的抽象层实现,通过这个抽象层可提高代码的复用程度,降低开发难度。除了这些强大的功能之外,mbedtls还包括众多经过精心设计的测试用例,这些测试用例保证了mbedtls的稳定性和可靠性。总之,mbedtls足够小巧灵活,完全可以做到“开箱即用”。
从功能角度来看,mbedtls主要分为以下3个部分:
1)密码学工具箱实现。
2)X.509证书处理实现。
3)TLS/DTLS协议实现。
1.4.1 密码学工具箱
mbedtls的密码学工具箱部分具有针对对称加密算法、单向散列(又称消息摘要)和公钥加密的抽象层实现。另外,mbedtls还包含多个基于标准的随机数生成器和一个可自定义的熵池。所有的安全算法均以独立模块存在,任何一个模块都可以与其他模块解耦。这种轻耦合的设计方法便于用户对mbedtls进行裁剪,用户可以直接根据需求选取相应的头文件和源代码文件,并将其放入项目中。
1.对称加密算法
对称加密抽象层提供了对称加密和解密功能。它针对不同算法支持不同的加密模式,主要包括电子密码本(ECB)、密码块链接(CBC)、计数器模式(CTR)和密码反馈(CFB)等模式。mbedtls不仅提供AES、Blowfish和Camellia等最常用的算法,还提供DES和RC4等老旧或已弃用的算法。
2.单向散列与消息认证码算法
mbedtls针对单向散列算法提供了消息摘要抽象层,可提供单向散列功能和消息认证码功能(HMAC)。mbedtls不仅为SHA256、SHA512和RIPEMD-160等最常用的算法提供支持,还支持MD2、MD4、MD5和SHA1等老旧或已弃用的算法。
3.公钥算法与数字签名
公钥加密算法可搭配RSA算法或椭圆曲线算法,mbedtls在这些算法的基础上提供公钥算法抽象层。mbedtls公钥算法部分还提供多种密钥协商算法,例如Diffie-Hellman密钥协商算法(DH)和椭圆曲线密钥协商算法(ECDH)。另外,它也提供多种数字签名方法,例如RSA签名和椭圆曲线数字签名(ECDSA)。
4.随机数生成器
关于随机数生成器,mbedtls不但提供了熵池,还提供了符合CTR-DRBG与HMAC-DRBG标准的随机数生成器。mbedtls的熵池具有很强的灵活性,熵池既可从标准源收集也可以由应用程序提供。
1.4.2 TLS/DTLS协议
mbedtls提供TLS/DTLS客户端和服务器功能。mbedtls为当前所有的SSL和TLS/DTLS标准提供客户端和服务器端支持,这些标准包括SSL 3版本、TLS 1.0版本、TLS 1.1版本和TLS 1.2版本。mbedtls还支持大多数标准化协议扩展,如服务器名称指示(SNI)和会话票证。mbedtls支持常用的密钥交换方法和130多种不同的标准化密码套件。
1.4.3 X.509证书
SSL/TLS身份验证和一些其他协议都依赖X.509证书处理功能。mbedtls为X.509证书提供以下支持:
·X.509证书解析
·X.509证书吊销列表解析
·X.509(RSA/ECDSA)私钥解析
·X.509证书验证
另外,mbedtls还可以签发或创建证书,例如:
·X.509证书生成
·X.509(RSA/ECDSA)私钥生成
·X.509证书请求解析
·X.509证书请求生成
1.5 OpenSSL简介
OpenSSL是包含安全套接字层和传输层安全协议的开源软件库,它几乎成为安全领域的事实标准,大部分的服务器和客户端都使用OpenSSL,一些硬件加密算法的实现通常也需要使用OpenSSL的命令行工具进行验证。OpenSSL在本书中将作为辅助工具对密码学算法以及TLS/DTLS协议进行验证。本节剩余部分将描述OpenSSL的安装过程及多种命令行工具的使用方法。
1.5.1 源代码安装
虽然大多数发行版Linux系统中已经默认安装了OpenSSL,但为了统一环境,本节将描述如何在Ubuntu系统中以源码方式安装OpenSSL的指定版本。本节以OpenSSL 1.1.1版本为准。OpenSSL安装过程如下:
# 克隆OpenSSL代码到本地 $ git clone https://github.com/openssl/openssl # 切换到 1.1.1 分支 $ git checkout OpenSSL_1_1_1 # 配置工程,指定安装路径 $ ./config # 编译 $ make # 安装 $ sudo make install $ sudo ldconfig
安装成功后可以通过openssl version命令验证安装是否成功。
# 查看安装版本
$ openssl version
OpenSSL 1.1.1 11 Sep 2018
1.5.2 命令行工具简介
OpenSSL命令行工具分为3部分,分别为标准命令、摘要命令和加密命令。可以通过help命令查看OpenSSL支持的所有命令。
$ openssl help # 输出内容 Standard commands asn1parse ca ciphers cms crl crl2pkcs7 dgst dhparam dsa dsaparam ec ecparam # 省略部分输出 Message Digest commands (see the `dgst' command for more details) blake2b512 blake2s256 gost md4 md5 mdc2 rmd160 sha1 sha224 sha256 sha3-224 sha3-256 sha3-384 sha3-512 sha384 sha512 # 省略部分输出 Cipher commands (see the `enc' command for more details) aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb aes-256-cbc aes-256-ecb aria-128-cbc aria-128-cfb aria-128-cfb1 aria-128-cfb8 aria-128-ctr aria-128-ecb # 省略部分输出
1.5.3 摘要命令dgst
通过openssl dgst-help可以查看dgst命令的参数信息,也可以使用man dgst命令查看具体的使用方法。以下代码使用SHA256算法对字符串“abc”计算消息摘要。
# 准备测试样本,并写入file.txt文件中 $ echo -n abc > file.txt # 计算消息摘要 $ openssl dgst -sha256 -hex file.txt SHA256(file.txt)= ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
1.5.4 对称加密命令enc
目前OpenSSL版本支持多种对称加密算法,示例中将使用AES-128-CBC算法对明文“CBC has been the most commonly used mode of operation.”进行加密,加密过程默认使用PKCS#7进行填充,密钥为“06a9214036b8a15b512e03d534120006”,初始化向量IV为“3dafba429d9eb430b422da802c9fac41”。加解密过程如下,openssl enc命令描述如表1-1所示。
# 准备测试样本 $ echo -n CBC has been the most commonly used mode of operation. > file.txt # 执行AES-128-CBC加密 $ openssl enc -aes-128-cbc -e -in file.txt -out file.enc -K 06a9214036b8a15b512e03d534120006 -iv 3dafba429d9eb430b422da802c9fac41 # 查看加密结果 $ hexdump -C file.enc 00000000 4d df 90 12 d7 b3 89 87 45 a1 ed 98 60 eb 0f a2 |M.......E...`...| 00000010 fd 2b bd 80 d2 71 90 d7 2a 2f 24 0c 8f 37 2a 27 |.+...q..*/$..7*'| 00000020 63 74 62 96 dd c2 bf ce 7c 25 2b 6c d7 dd 4b a8 |ctb.....|%+l..K.| 00000030 57 7e 09 6d bd 80 24 c8 b4 c5 a1 16 0c a2 d3 f9 |W~.m..$.........| 00000040 # 执行AES-128-CBC解密 $ openssl enc -aes-128-cbc -d -in file.enc -out file.dec -K 06a9214036b8a15b512e03d534120006 -iv 3dafba429d9eb430b422da802c9fac41 # 查看解密结果 $ cat file.dec CBC has been the most commonly used mode of operation.
表1-1 openssl enc命令参数描述
1.5.5 SSL命令s_server
s_server是OpenSSL提供的SSL工具,该工具可用来搭建TLS/DTLS服务器,用于测试和调试TLS/DTLS客户端。s_server命令行参数很多,如表1-2所示。可以通过openssl s_server-help进行查看,同样也可以通过man s_server进行查看。
表1-2 openssl s_server命令参数描述
$ man s_server # 输出内容 NAME openssl-s_server, s_server - SSL/TLS server program SYNOPSIS openssl s_server [-help] [-port +int] [-accept val] [-unix val] [-4] [-6] [-unlink] [-context val] [-verify int] [-Verify int] [-cert infile] [-nameopt val] [-naccept +int] [-serverinfo val] [-certform PEM|DER] [-key infile] [-keyform format] [-pass val] [-dcert infile] [-dcertform PEM|DER] [-dkey infile] [-dkeyform PEM|DER] [-dpass val] [-nbio_test] [-crlf] [-debug] [-msg] [-msgfile outfile] [-state] // 省略部分内容
本节将通过一个示例说明s_server工具使用方法,示例中将使用命令行工具s_server搭建一个TLS服务器,然后使用浏览器连接该TLS服务器。
1.搭建TLS服务器
# 进入证书及HTML文件所在路径 $ cd 14_tls/tls_server # 运行TLS 服务器,等待客户端连接 $ openssl s_server --state -cert srv_cert.pem -key srv_privkey.pem -CAfile ca_cert.pem -port 443 -cipher ECDHE-ECDSA-AES256-GCM-SHA384 -WWW ./
2.浏览器访问
打开火狐浏览器,在网址栏输入https://localhost/index.html。由于服务器使用的是自签名证书,需要将证书添加到信任列表才能继续访问,依次单击【高级】【添加例外】【确认安全例外】即可,添加例外过程如图1-4所示。
图1-4 添加例外
完成上述设置后,看到如图1-5所示页面,则表示HTTPS服务器访问成功。
图1-5 服务器访问成功
连接成功后,服务器控制台会输出握手过程。
SSL_accept:before SSL initialization SSL_accept:before SSL initialization SSL_accept:SSLv3/TLS read client hello SSL_accept:SSLv3/TLS write server hello SSL_accept:SSLv3/TLS write certificate SSL_accept:SSLv3/TLS write key exchange SSL_accept:SSLv3/TLS write server done SSL_accept:SSLv3/TLS write server done SSL_accept:SSLv3/TLS read client key exchange SSL_accept:SSLv3/TLS read change cipher spec SSL_accept:SSLv3/TLS read finished SSL_accept:SSLv3/TLS write session ticket SSL_accept:SSLv3/TLS write change cipher spec SSL_accept:SSLv3/TLS write finished FILE:index.html
1.6 本章小结
物联网安全需要借鉴互联网安全的成熟经验,但绝不能生搬硬套。从柯克霍夫原则可知,密码系统的安全取决于密钥的安全而不是算法的安全,对于一般应用来说选择一个保密的算法往往得不偿失。密码学涉及非常多的数学知识,个人或公司一般很难独立开发新的密码学算法,建议在物联网安全应用中选择已有的安全算法。本章简单介绍了mbedtls和OpenSSL,OpenSSL是后续章的辅助工具,而mbedtls是后续章的主要安全工具。