跳转到主要内容
Chinese, Simplified

你如何测试数亿行代码或数百亿个晶体管?这很难。但是当你实施加密时,它会更难。

今天的加密技术并不容易理解。它经常对数千位值进行复杂的计算。并且它经常使用随机数进行某些计算。

例如,当您生成加密密钥时,您需要生成大量随机(实际上是伪随机)位。如果某个键看起来不像随机位,则攻击者可能更容易猜测它。这意味着您的加密技术不能提供尽可能多的安全性,这很糟糕。

这就是为什么它如此复杂,以及一些简化测试加密软件测试的技巧。

 

已知与随机值


如果您正在测试实现加密的硬件,则使用随机值会使测试更加困难。测试复杂的东西很难,如果你不能用很多已知的输入输出对进行测试,那就更难了。如果您的输入在每次进行测试时都会发生变化,就像您使用随机数一样,测试可能几乎是不可能的。

要解决此问题,大多数(可能是所有)实现加密的硬件都有办法绕过其随机数生成器的输出并在测试中使用已知值。

这种未记录的特征在硬件中令人惊讶地普遍。从1996年5月到1998年8月,Dobb博士的杂志甚至还有“未记载的角落”,这是一个描述其中一些内容的专栏。

最近的例子包括rosenbridge后门,其中微处理器的未记录功能可以让任何应用程序获得操作系统的root访问权限。另一个备受瞩目的问题是使用英特尔的内部信号架构可视化(VISA)来监控其他芯片正在做什么,实质上是为黑客提供了一个逻辑分析仪,可用于探测其他芯片的运行。

这些未记录的功能(可称为“后门”)可能存在于实现使用随机数的加密技术的所有硬件中。这基本上就是全部。

可以使硬件在其中断开或禁用绕过随机数使用的方式,但聪明的黑客可能能够找到重新启用后门的方法。或者在发货之前它可能不会被禁用。

这是一个可能无法避免的权衡:如果你想测试你的硬件,你可能还需要在其中引入一个后门,这意味着它可能不像你想要的那样安全。 。

 

情况正在恶化


假设你可以穿越时间,也许正如H.G. Wells在The Time Machine中描述的那样。如果我们可以跳到22世纪并与那些使用当时流行的技术的工程师交谈,那么他们很可能会熟悉我们今天如何测试硬件和软件。

不幸的是,这可能是因为我们测试技术的能力跟不上我们构建技术的能力,我们的许多失败可能最终会成为22世纪教科书中的案例研究。

回到网络时代,我工作的公司每三个开发工程师就有一个测试工程师。今天,这个比例更像是每个开发工程师的一名测试工程师。在过去的20年里,测试肯定变得更加困难和昂贵,并且它看起来不会很快变得容易。

在过去的几十年中,软件中使用的代码行数急剧增加。当我离开研究生院并获得我在科技行业的第一份工作时,有传说中的应用程序的故事使用了100万行代码。

这些可能是杜撰的。我从来没有见过任何与这些怪物一起工作过的人。可能情况是,100万行代码与标记为“rex quondam rexque futurus”(“曾经和未来的国王”)的墓碑一样神秘,并且只是为了吓唬新工程师。

 

百万俱乐部


今天,拥有一百万行代码的应用程序真的不那么令人兴奋。大约12年前,当我们在我曾经工作过的初创公司进行第一次安全源代码审查时,我有点惊讶地发现我们用来解析XML的第三方库之一的源代码包含超过100万行。

很容易找到目前使用数亿行代码的情况。在2016年国际消费电子展上,福特汽车公司指出,目前已有超过1.5亿行代码进入其F-150皮卡。高端汽车可能拥有更多,几乎肯定超过2亿线。如今拥有数百万行代码并不是什么大不了的事。

硬件变得越来越复杂。在互联网泡沫破灭之前,我记得英特尔如何能够制造包含310万个晶体管的奔腾处理器。

今天,制造了包括数百亿个晶体管的集成电路。如果你想到这一点,那就太惊人了:数十亿的组件,所有这些组件的工作方式大致与他们应该的一样。这是科幻小说作家亚瑟·C·克拉克告诉我们的那种足够先进的技术,与魔术无法区分。

为什么测试软件更容易


在某些方面,软件比硬件更容易测试。在调试模式下编译代码使测试更容易,一旦完成调试,在发布模式下编译相对容易。

但要确保正确实施加密仍然非常困难。加密算法的中间结果和输出通常看起来像数百甚至数千个随机位,这使得调试实现它们的代码变得棘手。

你永远不会得到像“This String”这样的东西作为加密算法的中间结果。相反,你会得到更像:

"0x7649abac8119b246cee98e9b12e9197d8964e0b149c10b7b682e6e39aaeb731c." 

啊。

 

简化测试的方法


幸运的是,这个问题有一个简单的解决方案:不要编写自己的加密软件!如果你现在参加大学课程大致是Crypto 101,你将学习加密算法如何工作以及为什么它们是安全的。然后你会被告知永远不要自己尝试这个,因为做错事的可能性太大了。

相反,请使用已经验证过标准的现有加密库,例如美国政府的 FIPS 140-2, "Security Requirements for Cryptographic Modules."。这不一定很难或很昂贵。例如,OpenSSL的一个版本已经获得了FIPS 140-2验证。

不幸的是,很多人没有使用Crypto 101类,最终试图实现他们自己的加密算法版本。这很难做对。尝试这样做真的不是一个好主意。

因此,要注意实现加密的硬件,因为可测试性可能会在其中加入后门。从来没有,永远不会实现加密,因为有一个可以使用的已知良好的解决方案。

原文:https://techbeacon.com/security/how-test-encrypted-apps-right-way

本文:

讨论:请加入知识星球或者小红圈【首席架构师圈】

Article
知识星球
 
微信公众号
 
视频号