mbed-TLS库最初是作为称为Polar SSL的商业库开发的。2015年,Polar被ARM收购,Polar SSL库被纳入ARM的Mbed IoT平台内的安全组件。然后,将Polar SSL库重命名为mbed-TLS,并免费提供了Apache V2.0许可或GPL v2许可的商业和非商业用途。
密码库需要提供一系列安全服务,以使我们能够设计安全的系统。这些服务中最明显的是用于确保用户数据机密性的密码。虽然支持多种密码,但是当前的最佳实践是使用高级加密标准(AES)。我们还需要确保数据的完整性,这是通过哈希算法,尤其是由美国国家科学技术研究院(NIST)发布的安全哈希算法(SHA)系列来完成的。
不再建议使用原始的SHA-1算法,并且任何新系统都应至少使用SHA-2。我们还需要提供不可否认性,如果发送了一条消息,我们需要确定是谁发送的。如果两个用户可以事先同意密码,那么我们可以使用消息认证码(MAC),这将同意数据的完整性和来源。也可以使用公共密钥密码系统对消息进行签名。这在RSA系统中尤其优雅,但也有专用系统,例如数字签名算法(DSA)。
随机数生成
许多安全协议的基石之一是加密强度高的随机数生成器。一个典型的系统将通过将真实的随机数据(熵)收集到一个熵池中来工作。对于实时通信来说,此过程通常太慢,因此,将熵池中的随机值用作伪随机数生成器的种子值。
虽然mbed-TLS库提供了一系列伪随机数生成器,但设计人员是否支持将随机值收集到熵池中。
那么,如何知道您是否有足够好的随机数生成器呢?幸运的是,美国国家科学技术研究所提供了一个统计测试套件,其中包含十五个测试,可用于验证您的随机数生成器。
除了广泛的密码算法之外,mbed-TLS库还包括一组抽象层,这些抽象层为每个安全服务提供了高级API。例如,这允许您开发一个系统,其中安装了一定范围的密码,同时使用通用API从安装的套件中选择密码算法,然后使用抽象的API加密和解密数据,而与基础密码算法无关。
现在,大多数主要的芯片供应商都提供了基于Cortex-M的微控制器,其中包括加密处理器。通常,该密码处理器将提供对称密码,哈希和MAC算法的硬件实现。
mbedTLS库提供了一系列软件挂钩,可以启用这些挂钩来使用硬件加密处理器来代替软件算法。
顾名思义,mbed-TLS库旨在支持传输层安全协议。TLS协议的关键部分是使用公共密钥加密来协商会话密钥。使用最广泛的公钥密码是RSA非对称密码。尽管mbed-TLS支持此功能,但由于密钥尺寸非常大且需要进行计算,因此它不是最适合小型微控制器的系统。幸运的是,可以使用椭圆曲线密码术来实现RSA的替代方法,例如Diffie Hillman密钥协议。
使用椭圆曲线代替线性数字线可减少所需的密钥大小和总体计算量。为了获得与具有128位密钥的AES密码相同的安全级别,要求RSA系统的密钥大小超过3000位,而Diffe Hellman系统的椭圆曲线实现方案仅需要256位密钥大小。简单的方法是在可能的情况下使用椭圆曲线密码术。
在初始TLS握手期间,将以X.509证书的形式交换参与者的公钥。证书由以“抽象语法符号1”(ASN.1)格式存储的用户数据组成,并使用一组“专有编码规则”(DER),以确保存在一种唯一的方式来对证书数据进行编码。创建DER二进制数据后,然后将其转换为base 64,并以ASCII字符形式存储在“隐私增强邮件(.pem)”文件中。如果您正在运行自己的网站,则必须生成自己的证书,并由受信任的证书颁发机构对其进行签名。但是,如果您要设计自己的封闭系统,则可以创建和管理自己的证书。mbed-TLS库包含用于创建和读取X.509证书的源代码和命令行工具。
另一个有用的工具是XCA。这是一个易于使用的Windows或OS X应用程序,允许您创建签名并管理自己的X.509证书,并且在开发或管理小型系统时非常有用。
TLS协议中使用的所有加密算法都是为通用计算机(例如PC和服务器)设计的,因此,它们对于小型微控制器不是理想的选择。NSA在2013年发布了两个新的分组密码家族,分别称为Simon和Speck。
这些密码是专门为非常受限的设备而设计的,这些设备通常是用户作为物联网中的节点。
“ Speck”密码被设计为软件实现,而“ Simon”密码已针对硬件实现进行了优化。当前有可用的参考实现,并且计划将这两个密码添加到mbed-TLS的未来版本中。
mbed-TLS库主要与安全通信有关,并且是ARM更广泛的安全计划的一部分。ARM平台安全体系结构是一个框架,旨在使开发人员能够分析安全威胁,然后设计并实施适当的体系结构。
尽管这是相当新的东西,但它可以补充具有信任区安全技术的新一代ARMv8-M(Cortex-M23和Cortex-M33)微控制器。