密码设计中的安全漏洞

于增贵
(中国电子科技集团公司第三十研究所,成都0041)

【摘 要】 本文着重指出密码设计中常见的安全漏洞,阐明即使强加密算法,也可以采取绕过算法及利用设计、实现和设备上的失误使算法失败;描述针对通行字、硬件、信任模型、故障恢复系统和用户所进行的各种攻击;讨论攻击防止和攻击检测的重要性。结论是每一种系统都有可能被攻破,密码设计成功的关键是综合运用各种安全措施,堵塞各种安全漏洞。
【关键词】 密码 安全性 攻击 破译
1 引言
不少技术文献都喜欢用加密算法和密钥长度来衡量加密产品的优劣。无疑切中要害。算法可以用几句话来解释,而且方便相互比较,如“128比特密钥意味着安全性好”,“三重DES意味着保密性高,40比特密钥意味着保密性差”,“2048比特的RSA优于1024比特的RSA”。然而,实际情况并不是那么简单。
密钥较长并非总意味着保密性较好。密码算法好比门锁。多数门锁有4个金属销子,每个销子可处在10个位置的任一位置上。因此,只有10000种可能钥匙。小偷只要试验所有的10000种钥匙,则肯定能进入房间。经改进的锁有10个金属销子、便有100亿种可能钥匙,不过仍无法保证房间的安全。面对这种情况,小偷不会去试验每一种钥匙(强力攻击),也不会傻到去撬锁(针对算法的密码攻击)。他们可以捣毁窗户、踢破房门、乔装警察、武力抢劫钥匙持有者。盗窃团伙甚至可以运用电锯破坏房屋墙壁,摧毁房屋安全系统。对这些攻击,再好的锁也无济于事。
强密码在正确实现时的确非常强,但也不是万应灵药。在聚焦密码算法的同时,不应忽视其它安全问题,就象保护你的房屋不能单靠筑一道篱笆把它围起来,而是要靠在地上栽一个大桩,让对手一头撞在上面。
聪明的攻击者总是设法绕过密码算法。美国密执安州有一家Counterpane系统公司,多年来一直从事密码系统的设计、分析和破译工作。他们一边研究公开的算法和协议,一边将主要精力放在调查实际产品。他们设计和分析了一系列保护隐私、保证机密性、提供公平竞争和促进商贸的系统。他们用软件、分立硬件和介于二者之间的一切东西开展工作,不仅破译了他们自己拥有的算法,而且几乎总能找到绕过算法的攻击办法。他们无需试验每一种可能密钥、或甚至是寻找算法中的缺陷,而是利用算法设计、实现和设备中的关键之处。他们不时找到一种破译系统的新招,不过多数时间还是利用设计者惯犯的老毛病。
2 攻击密码设计
密码系统只能同它所依赖的加密算法、数字签名算法、单向散列函数和报文(消息)鉴别码一样强,破解它们中的任何一种,无异于破解整个密码系统。密码系统的强度总是同它最薄弱的环节一样强,这就是最著名的“木桶原理”。
用强材料可能构成弱结构。同样,用强加密算法和强协议也可能构成弱密码系统。不少系统不能正确使用密码而使密码形同虚设,例如不检查数值的大小,重复使用绝不该重复使用的参数等。加密算法不一定提供数据完整性;密钥交换协议未必保证双方收到相同密钥。最近的一项研究成果表明,有些(当然不是所有)使用相关加密密钥的系统是比较容易破译的,虽然每个单独密钥是安全的。安全远不是插入一种加密算法,甚至连卓越的工程师也不敢担保其实现是健全无瑕的。
随机数发生器是密码系统的另一个薄弱环节,好的随机数发生器很难设计,其安全性常依赖硬件和软件的特点。有人曾仔细地研究使用劣质发生器的产品,发现其密码不可谓不强,但如果随机数发生器产生弱密钥,则系统很容易被破译。还有些产品尽管使用安全的随机数发生器,但它们没有使用足够的随机性以保证密码的安全。
最近已发现若干针对随机数发生器的新攻击。令人吃惊的事情之一,是专用随机数发生器对一个用途也许是安全的,但对另一个用途恐怕就是不安全的。因此,把安全分析广义化是十分危险的。
一项研究成果涉及单个安全密码协议之间的交互作用,即已知一个安全协议,便可以构造出能破译第一个安全协议的另一个安全协议,条件是两个协议在同一设备上使用同一密钥。
3 攻击实现
不少系统因为实现错误而功亏一篑。有的系统不能保证在加密之后销毁明文,有的系统在系统失控时使用临时文件以防止数据丢失,或者使用虚拟存储器以提高可用存储。这些特征可能不经意地把明文留在硬驱动上,在极个别情况下,操作系统也可能把密钥留在硬驱动上。曾经有种产品使用通行字输入专用窗,甚至在窗关闭之后通行字仍然保护在窗的存储器内。不管产品的密码有多好,它还是通过用户接口被破译。
有些系统则陷入更微妙的问题,有时用两个不同密钥加密同一数据,一个密钥强,一个密钥弱;有些系统没用主密钥,然后是一次性会话密钥。有人就曾利用不同密钥的部分信息破译若干系统。还有的系统使用不恰当的密钥保护机制,错误地依赖会话密钥的安全性。关键是遏止所有可能的密钥获取途径,而不单单是最明显的途径。
电子商务系统常采取折衷实现以提高可用性。若设计者没有周密地考虑其折衷方案的安全内涵,则必然出现微妙的薄弱环节。每天一次帐目核对也许比较容易,但攻击者在几个小时内能造成什么样的损害呢?审计机制会不会被浸渍而掩盖攻击者的身份呢?
有的系统把已泄漏的密钥记录在“热名单”上,攻击这些热名单往往效果卓著,有的系统就因为重放攻击而遭破译,如重用老报文或部分老报文去欺骗各方。
有的系统在紧急关头允许还原老密钥,这提供了又一个攻击领域。好的密码系统设计使密钥存在时间尽可能短,密钥还原则往往由于密钥在有用之后强使其长期存在而忽略安全利益。再者,密钥还原数据库本身很容易成为脆弱源,所以必须安全设计和安全实现。密钥还原数据库的缺陷使犯罪分子能实施欺诈、乔装合法用户。
4 攻击通行字
许多系统横遭破译是由于它们部份依赖用户产生的通行字。人们过于随便,不去选择强通行字。如果迫使他们使用强通行字,则他们往往不能记得住;如果通行字成为密钥,则猜度通行字通常要比凭蛮力获取密钥容易得多,快得多。精心设计的安全系统因此而毁于一旦的事例并不少见。有些用户接口使问题变得更糟,比如把通行字限制为8个字符,一切就低不就高等等。甚至通行短语也可能很脆弱,比如搜索40个字符的短语就要比搜索64比特随机密钥容易得多。有些密钥还原系统就因为使用弱通行字进行密钥还原而殃及会话密钥。
5 攻击硬件
有些系统,尤其商用系统,依赖防窜改硬件来达到安全目的,比如智能卡(一说灵巧卡),电子钱包等。这些系统都假定公用终端绝不会落入坏人之手、或这些“坏人”缺乏攻击硬件的专门技能和设备。虽然硬件安全在许多安全系统中都是一个重要组成部分,但是其安全仅依靠防窜改假设的系统未必可信。十分有效的防窜改技术并不多见,相反,挫败防窜改的工具却日新月异。在设计防窜改系统时,应当加入补充的安全机制以防万一防窜改失败。
计时攻击(timing attack)在1995年取得引人注目的进展,例如可以通过测量密码操作花费的相关时间还原RSA的专用密钥。而且,在这一年还成功地实现了对智能卡和其它安全令牌、以及连接在因特网上的电子商务服务器的攻击。这些方法已被推广到包括通过测量功能、辐射和其它“相邻通路(side channel)”在内的系统攻击,同时还实现了对采用“安全”令牌的各种公钥和对称密码算法的攻击。目前,相关研究正集中在故障分析上,即把故障人为引入密码处理器以确定秘密密钥。这种攻击的后果可能是毁灭性的。
6 攻击信任模型
不少比较重大的攻击都是针对系统的基本信任模型,如系统中的谁或什么是可信任的,以什么方式,到什么程度。简单的系统,如硬驱动加密程序或电话保密产品,具有简单的信任模型:复杂的系统,如电子商务系统或多用户E—Mail安全程序,则具有复杂的信任模型。E—Mail程序也可以使用不可破译的消息(报文)密码,除非密钥经可信源认证(以及除非该认证是可以验证的),否则系统仍然是脆弱的。有些商务系统很容易被商家和用户串通,或被两个不同用户串通所破译。也有些系统作了有关安全基础设施的若干隐性假设,但都不愿去查一查这些假设是否真实。如果信任模型尚未用文件加以确认,则工程技术人员可能在产品开发过程中会有意无意地改动它,并因此而损害安全性。
不少软件系统对其所运行的计算机作出了拙劣的信任假设,如它们假设台式计算机是安全的。这些程序常常被特洛依木马所破译,特洛依木马软件能嗅出通行字、读出明文、或者挫败安全措施。通过计算机网络工作的系统,必须知道由网络协议引起的安全缺陷。同样,连接到因特网上的计算机也可能很脆弱。而且,如果是由于网络的不安全性而使其受挫,密码也许是不相干的,没有哪一种软件能抵御反向工程。
在进行系统设计时往往心里想的是一个信任模型,而实现却是另一个信任模型。所以向用户推出产品时,在设计过程中作出的决策可能被完全忽视。只有操作员可信,计算机完全在系统使用者的控制之下,系统才是安全的;操作员不可靠,系统不可能安全,计算机也不可信。好的信任模型即使某些信任假设结果是错的也能起作用。
7 攻击用户
就算使用恰当,系统是安全的,其用户也可能无意中破坏其安全性,尤其在系统设计欠佳的情况下。典型的例子包括用户把他的通行字随意给同事或朋友,丢了智能卡又不及时报告,不仔细核对数字证书上的姓名,在别的不保密系统上反复使用保密通行字,不改正其软件的缺省性弱安全设置等等。毫无疑问,再好的系统设计也不可能解决所有这些社会问题,但好的系统设计又确实有助于避免其中的许多问题。
8 攻击故障恢复
强系统的设计能阻止小安全破绽变成大安全破绽。恢复一个文件的密钥不应让攻击者能够读出硬驱动的每一个文件。对智能卡实施反向工程的黑客只能获悉该智能卡内的秘密,而不是能帮助他破译系统内其它智能卡的信息。在多用户系统内,知道一个人的秘密不应损害每一个其它人的秘密。
许多系统都有“不安全模式缺省”。如果安全特征不起作用,多数人只是关机和停止作业。如果在线信用卡验证失败,商家将非法选用不太安全的书面文件系统。同样,在对系统进行修改以解决安全问题之后,有时也可能发动一场针对系统的“版本反转攻击”:用反向兼容使攻击者能够迫使协议进入较老的、不安全的版本。有些系统根本不具备灾难恢复能力,一旦安全破裂便无法补救。对拥有百万用户的电子商务系统而言,尤具破坏性。这些系统应当有个对攻击作出快速反应以及不关闭系统而使安全升级的计划。好的系统设计必须考虑出现攻击时会发生什么样的事情,制订出遏制损害和从攻击中恢复的方法。
9 攻击密码
产品有时甚至会把密码弄错。有的产品依赖专有加密算法,这些加密算法总是很脆弱。美国有家公司破译公开的加密算法取得相当的成功,对专有加密算法的跟踪记录甚至更佳。保持算法的秘密性已不再是分析的大障碍——只需依据可执行代码花上数天时间对密码算法实施反向工程。有人经过分析得出结论说,S/MIME2电子邮件标准采用较强的设计,但其实现却用了弱的密码算法;用于DVD加密的系统采用弱的算法而使其变得更弱。
其它密码错误也不少见,如重复“特有”随机值的实现,不能正确验证参数的数字签名算法,被窜改以挫败其使用特性的散列函数等。有些密码协议并未按设计者的意图在使用,协议经过随心所欲的“最佳化”,实际上完全破坏了它们的安全性。
10 攻击防止与攻击检测
多数密码系统把防止作为它的唯一防御手段,如用密码防止欺骗、撒谎、滥用等等。其实防御绝非那么狭窄,强系统照样设法检测滥用和遏制攻击的影响。基本的设计原则之一,是每一个系统迟早都会遭到成功攻击,攻击的方式和后果完全不可预料,重要的是能检测和遏制这种攻击,使它造成的损害最小。
更重要的是一旦检测到攻击,系统便需还原、产生和分发新密钥对,更新协议和废掉老协议,刎除系统内的不可信节点等。很遗憾,许多系统不搜集能提供审计线索的足够数据或没能保护数据免遭窜改。有的公司已在保护电子商务系统审计记录安全方面做了大量的工作,绝大部分针对一旦攻击成功便可能完全失败的系统设计。这些系统要做的不止是检测攻击,它们还必须能够产生足以使法官相信有罪的证据。
11 构造安全的密码系统
安全设计人员拥有如普鲁士将军卡尔·冯·克劳斯维所说的“内部地位”。好的安全产品必须能抵御每一种可能攻击,甚至尚未发明出来的攻击;反之,攻击者只需找到一个安全缺陷便足以挫败全部系统,如他们可以欺骗,可以串通、密谋、乃至等待技术给他们提供附加手段,他们可以采用安全设计人员料想不到的方法攻击系统。
建造一个安全的密码系统很容易但要做好却很困难,多数人说不清毛病在哪里。在其它计算机科学领域,功能度起区分好坏的作用,如好压缩算法比坏压缩算法更有效;差压缩程序在特征比较图内显得更差。密码则不同,因为加密程序有效并不意味着它安全。多数产品的情况不外是某人读了应用密码学之后选定一种算法和协议,通过试验保证其有效,便据此认为大功告成。其实不然,功能度不等于质量,无论多少次β试验也不曾揭示出一个安全缺陷。太多的加密产品是“徒有其名”,他们使用安全密码,实则并不安全。
12 结束语
现代电子学的发展,尤其大规模集成电路和计算机技术的迅猛发展,同时为密码设计使用和密码分析破译提供了强有力的物质基础。攻击手段和攻击目标的日趋多元化给密码设计提出了更高的要求。
本文提供密码设计中容易忽视的安全漏洞。密码设计者只有综合运用各种安全措施,堵塞各种安全漏洞,才能保证通信安全,才能实现信息保密。
参考文献
[1] Sxhneier, B., “Security Pitfalls In Cryptographic Design”, Information
Management & Computer Security V01.6, No.3, 1998, pp133-137.
通信地址:成都810信箱31分箱