家门上的锁是怎样开、怎样锁的,只要查一下说明书,谁都能知道。尽管如此,我们之所以能安心出门,并不是因为锁的原理,而是因为手中的钥匙是秘密。密码的世界里也有一条蕴含着同样想法的古老原则,那就是“柯克霍夫原则(Kerckhoffs's Principle)”。
简单来说,柯克霍夫原则指的是“密码体系即使除密钥以外的一切都被公开,也应当是安全的”这一设计原则。意思是不要试图靠隐藏方法本身来保护,而要设计成只需守住一把小巧又容易更换的密钥。
本文将依次介绍这条原则诞生的19世纪背景、为什么只隐藏密钥反而更安全、试图靠隐藏来保护却失败的案例,以及它给今天的安全设计带来的启示。

不必隐藏也安全的密码所需的条件
柯克霍夫原则从何而来?

这条原则的主人公是荷兰出身的语言学家兼密码学家奥古斯特·柯克霍夫(Auguste Kerckhoffs)。他在巴黎的一所商学院教授德语,同时研究密码,并于1883年在一份军事学术期刊上分两期发表了题为《军事密码学》(La Cryptographie Militaire)的文章。
(1)被电报改变的战场
当时随着电报的普及,战场上往来的通信大幅增加。随身携带厚厚的秘密密码本,一旦被夺走,所有通信都会暴露的风险也随之增大。柯克霍夫针对这一现实,把军事密码应具备的条件归纳为六条。
(2)六项条件中的第二条
六项条件包括:实际上必须无法破解;密钥必须不用写下来就能记住;必须一个人就能操作等。其中第二条是“体系不应要求保密,即使落入敌人手中也不会有问题”,如今人们说到柯克霍夫原则,指的正是这一条。
为什么只隐藏密钥反而更安全?

把整个密码方法都保密看起来更安全,但实际上恰恰相反。美国数学家克劳德·香农(Claude Shannon)在1949年的论文中用“敌人了解体系”这一句话重新概括了这个想法,这句话也被称为香农准则。
- 秘密终究会泄露(Inevitable Disclosure):设备会在战场上被缴获,软件可以用分析工具拆解,人也可能被收买或受到威胁。
- 更换成本不同(Cost of Replacement):方法一旦暴露,就得把设备和程序全部重新制作;而密钥暴露时,只要分发新的密钥就行。
- 公开带来检验(Public Scrutiny):公开方法后,全世界的专家都会帮忙寻找弱点,经受考验时间越长的方法就越值得信赖。
美国安全研究者史蒂文·贝洛文(Steven M. Bellovin)说,他曾听美国国家安全局的一位前官员讲过,那里的基本假设是任何新设备的1号产品都会立刻落入对手国家手中。要守护的秘密越少、越简单,就越容易守住,这正是这条原则的核心。
试图靠隐藏来保护却失败的案例

依赖隐藏方法的安全通常被称为“隐匿式安全(Security through Obscurity)”。历史上有许多这种方法没能撑多久的例子。
恩尼格玛的接线
从1920年代起德军使用的恩尼格玛密码机,机器结构和每天更换的设置都是秘密。然而波兰数学家马里安·雷耶夫斯基(Marian Rejewski)在1932年底,结合法国情报机构获得的资料进行数学分析,推算出了机器内部的接线。结构暴露之后,剩下的防线就只有设置了,这也成为后来盟军破译恩尼格玛的基础。
DVD防复制装置
1990年代的DVD使用了一种以不公开的加密方法保护影像的装置。但1999年,破解这种方法的程序在互联网上传开,使它实际上失去了作用,而已经售出的无数设备中的方法也没有办法更改。
交通卡芯片
2000年代后期,世界多个城市的交通卡和门禁卡所使用的一种非接触式卡芯片,其不公开的密码被研究人员分析了出来。研究人员甚至采用剥开芯片层、用显微镜观察电路的方法查明了算法,隐藏的弱点也随之暴露。
给今天的安全设计带来的启示

现代的民用密码大多遵循柯克霍夫原则,公开其方法。
(1)通过公开竞赛选出的标准
美国国家标准与技术研究院(NIST)于1997年公开征集新的加密标准,全世界的研究人员花了几年时间攻击并检验各个候选方案。结果在2000年,两位比利时研究人员设计的方法被选中,成为今天广泛使用的高级加密标准(Advanced Encryption Standard)。
(2)把力量集中在密钥管理上
既然方法是公开的,实际的安全就取决于密钥制作、保管和更换得有多好。把密码设得长一些、各处不同,一旦怀疑泄露就立即更换,这些习惯也是同样的道理。
(3)隐藏只能作为附加手段
不特意公开方法本身并不是坏事。但它只是多重防御中的一层,绝不能成为安全的唯一依据。
自柯克霍夫写下这条原则已经过去了140多年,其间电报变成了互联网,密码本变成了计算机程序,但核心依然没变。反倒是在谁都能拆解程序的今天,这条原则显得更加迫切。
我们需要这样的态度:假定任何东西迟早都会暴露,并把系统设计成即使暴露也不会崩溃。
假定对方知道一切,只牢牢守住一把密钥,这正是打造值得信赖的安全的设计第一步。