嵌入式系统的安全性
本文作者:admin
点击:
2009-08-11 00:00
前言:
简介
与大多数人一样,我经常会担心个人资料储存在那些不安全的系统上,这将导致个人信息可能遭到窃取。这些可能造成数据失窃的系统包含各种装置,如信用卡扫描仪、收款机系统、医疗系统,以及其他非零售的装置。然而,除了上述这些系统之外,仍有相当多其他装置都会储存重要数据,如果没有妥善保护这些数据,可能就会威胁到日常生活。这些装置包括如电梯控制、交通号志系统、电力网络等等。上述这些系统内部的所有通信都需要针对数据的重要性采取不同层级的保护。
明显的保护方法
对于维护嵌入式系统安全,我个人最青睐的保护方式包含了一个最基本的概念,即实体安全性。也就是说,如果你认为这些系统包含了重要的信息需要特别保护,并且将这些信息封锁对外的通信,则可大幅减少遗失数据的风险。简单来说,就是将嵌入式控制器以及其他关键任务系统放在一个上锁的房间或是安全的封闭环境中执行。这种保护措施可以应用在许多系统上,并让系统可以受到控制,但因为仍采用开放式网络,因此容易造成系统运行效率下降、网络壅塞以及容易遭到拦截等问题。无论是采用实体网络或是无线网络,都可以采取这种保护模式,但也都会遇到相同的问题。对于提高安全性来说,我个人认为还是应该采用实体网络,有几种简单的方法可以保护通信的安全,让入侵时使用的关键数据几乎毫无用处。
公钥加密如 RSA (该名称来自麻省理工学院三位发明者名字前缀, Rivest、Shamir 和Adleman 来命名) 和椭圆曲线密码学(Elliptic curve cryptography)不但可以提供较佳的保护,并确保运作的正确性。这些方法广泛用于电子商务和其他需要高阶加密的应用程序中。不过,此类架构的运算需求相当大,虽然可为嵌入式系统提供最安全的通信,但需要付出的代价太高,并不见得适合于嵌入式系统应用。目前有好几种技术可以用来将数据进行“混乱(hash)”处理,因此可以在储存和传送数据的软件和硬件中加入此技术,使信息更加难以拦截。
在嵌入式系统保护数据最简单的方法就是在数据的储存或传递时使用循环码 (Rolling Code) 来进行保护。循环码的应用已经存在很长的一段时间 (例如第二次世界大战期间的 Enigma 密码机),并已应用在许多装置中,举凡从车库门遥控器到门禁卡等等。现代循环码加密的工作原理是使用序列位移缓存器搭配 XOR 函数来产生具有决定性的虚拟随机数码,但是难以利用逆向工程 (请参阅图1)进行译码。输入至 XOR 函数的数据就是目前将传送 (或加密) 的位。该函数是完全可逆的,只要在一开始将已知的初始种子值锁到缓存器即可。正如同其他的加密方案,这种技术需要对数据进行填补,以使其长度足够而不致于泄露密钥。此外,过长的讯息和虚拟随机码的产生器模式可能会泄露密钥。而且由于此类加密的限制,网络内的大部分封包流量都将下降。
时间变异密码
数据安全性的重点之一是要确保密钥不会泄露。即使采用公钥加密模式,如果泄露了私钥,系统还是会被破解。想要确保密钥永不泄露的一种简单方式是持续发布新的密钥。要持续发布新的密钥,最好的方法是使用目前的时间。如果每个装置都知道要在某一时间抛弃旧的密钥,并开始使用新的密钥,则会很难针对密钥进行逆向工程,因为这些密钥随时都有过期的可能。这个保护模式的简单应用就是饭店的房间卡。房间的门锁是以程序设计方式来接受已编码的钥匙卡,但只有在入住的期间有效。电子锁内部的时钟将会废止密钥 (即使没有其他人使用房间),或对锁进行重新编码。它会让卡片密钥在设定的期间外成为无效的密钥。
现在,剩下的问题是如何确保每个人都知道现在的时间。有几种方法可以达到这个目的。其一就是与主要时钟进行同步,这需要使用一种通信协议来保持目前的时间。可以根据密钥更新的频率来决定要采用哪一种通信协议,举例来说,这可能只是一个内含时间信息 (例如NTP 或网络时间通信协议) 的简单定期封包,或是更准确的通信协议,例如 IEEE1588 精确时间通信协议 (Precision Time Protocol,PTP)。PTP 提供的准确度非常高,其中移除了 GPS 接收器或铯时钟在每个节点的需求。以太网络物理层装置 (如美国国家半导体的 DP83640) 会内建此功能,并且可以搭配任何媒体访问控制器 (MAC) 一起运作。
藉由使用已同步的时钟,可以透过使用虚拟随机数码 (例如基于循环码的虚拟随机数码) 的密钥产生器经常更新密钥。因此每一秒钟都会产生新的种子,同时在该期间内传送的所有封包都会使用该种子 (请参阅图2)。唯一的问题是封包的传送不具决定性。在大型的网络基础架构或因特网上,封包送达的实际时间会有很大的差别,因此需要一种机制来确保晚到的封包不会遭到拒绝。
我们可以使用滑动窗口相关性的方法来达成这个目标。也就是说,加密的封包应该在加密传送的数据中内嵌校验总和检查码,以验证其内容正确性。此外,该封包的“存活时间”值将会设为窗口的尺寸 (时间)。因此,当接收到某个封包时,解密引擎会知道本地时钟的目前时间。接着会尝试使用本地时间对封包进行译码。如果解密失败,则解密算法会往回移动一个窗口的阶段时间,并尝试再次对封包的内容进行解密。理论上,这应该只需要针对两地的时间延迟进行一到二次的同步化,但实务上最多会尝试进行 10~20 次的同步处理。
如果封包无法解密,则表示传送者无效,而且封包将被丢弃。由于种子值的频繁变动,因此几乎无法实时对信息解密,或者由于种子值持续改变,使得封包与封包间的数据不具关联性。此外,可以将这个功能内建到通信软件堆栈中,或直接内建在硬件中,使得逆向工程变得非常困难。即使知道所采用的方法,但由于缺少固定的种子值,将使得数据的解密变得极为困难。
结论
除了金融业之外,并非所有嵌入式系统都需要使用加密来保护数据,更令人感兴趣的是非常容易实作之混乱方案的强度。 藉由使用简单的密码和使用随着时间改变的密钥技术,就可以大幅提高关键嵌入式系统的安全性。设计人员可以在韧体或软件中采用这些方案,并将加密算法加入 FPGA 或 CPLD 中,这将使得密码破解变得更加困难。