首页 >> 网络技术 > 网络资讯 >> 详细内容
网络资讯 >> 正文
代码混淆——福音还是噩梦?
日期:2019/3/31 

互联网也许是很多人的 “温柔乡”,但从技术上讲,它其实是一个凶险的 “江湖”,任何“混” 得足够久的“老江湖”都不仅知道,很可能还亲自见识过各种恶意程序或恶意行为。拿我自己来说,就既受过网络攻击,也见过不止一个克隆我主页的网站。这些软件层面的侵害对我来说只是心情上的烦扰,对显著依赖互联网的个人、公司乃至政府部门来说,如何保护自己的软件可就是一个重要课题了。

保护软件有着双重意义:一是保护软件的知识产权 (intellectual property),防止被人盗用;二是保护软件中可能隐含的诸如技术漏洞等私密信息,防止被人利用。就保护思路而言,目前主要有两条:一条是加密 (encryption),另一条是代码混淆 (obfuscation)

两者的主要区别是前者需解密(decryption),后者则不需要——因为后者只是将代码换成普通人难以读懂、在计算机上却仍能运行, 且功能相同的形式,很多网站采用的JavaScript代码混淆就是很好的例子。本文将主要谈谈代码混淆。

由于无需解密,代码混淆使用起来比较方便。不过,目前的代码混淆对普通的“肉眼凡胎”虽宛如天书,却往往不足以阻挡训练有素的入侵者,或者用加州大学洛杉矶分校的计算机学家萨海 (Amit Sahai) 的话说,只是一种“减速路障”(speed bump),让入侵者多费几天时间而已,而非真正可靠。

那么,真正可靠的代码混淆是怎样的呢?从理论上讲,应该是具有完美“黑箱”(black box) 特色的, 即除了软件本身许可的输入和输出之外,不能让人窥视任何其他信息的。但不幸的是,2001年,刚才提到的萨海与几位同事证明了具有完美“黑箱”特色的代码混淆——就像很多其他“完美”的东西一样——是不可能实现的。不过,与这个坏消息同时,萨海等人提出了一种虽比“黑箱”稍弱,却比现有方法有效得多的代码混淆。这种代码混淆的基本特点是:两个软件只要输入和输出性质相同,经代码混淆后就会变得不可分辨。2007年,美国麻省理工学院和微软公司的几位研究者证明了这是理论上最好的代码混淆——当然,已被证明为不可能的完美“黑箱”除外。

接下来的问题是:这种“理论上最好的代码混淆”有可能实现吗?这个问题目前还没有完全确定的答案,但 2013 年,萨海等人提出了一种很有希望的实现手段。那种手段还具有一个额外优点,那就是所给出的代码混淆是建立在一种被称为“多线性拼图”(multilinear jigsaw puzzle) 的数学技巧之上的,而那种数学技巧很可能是极难破解的——对于普通黑客所能利用的计算资源来说,可能需要耗时数百年。如果说目前的代码混淆只是“减速路障”,那么这种新的代码混淆——用萨海的话说——就算得上是“铜墙铁壁”(iron wall)了。这种“铜墙铁壁”引起了很多研究者的兴趣,以至于在萨海等人的方法提出后短短6个月的时间里,标题中带有“代码混淆”一词的论文数目就超过了过去 17 年的总和。

但是且慢兴奋!这种“很有希望的实现手段”目前还有两个问题:一个是理论层面的,即“多线性拼图”这一数学技巧的破解难度尚未得到严格证明。另一个是实用层面的,即这种代码混淆还处于“纸上谈兵”阶段,因为混淆后的代码并不是能在现实计算机上运行的代码。不仅如此,这种代码混淆还会显著增加代码长度,从而哪怕能在现实计算机上运行,速度也会慢得多。这些都极大地制约了它的实用性。

而更麻烦的则是,那种“最好的代码混淆”也许好到了“物极必反”的境界。假如上面提到的问题全被解决了,那它无疑既是保护软件知识产权的屏障,也是掩盖软件漏洞的保护伞。但稍稍细想,就不难发觉这些功用全是双刃剑。比如它的屏障作用既有助于保护软件知识产权,也便于盗用软件知识产权,因为破解越困难,也就意味着盗用行为越难被发现和确认。又比如它的保护伞作用既可以掩盖软件漏洞,也可以隐藏恶意软件,因为破解越困难,也就越能隐藏“恶意”。因此,“最好的代码混淆” 若真能进入实用阶段,对普罗大众究竟是福音还是噩梦恐怕还很难说。