@EricaHe
2016-05-24T05:59:20.000000Z
字数 3337
阅读 1158
论文笔记
Authentication
作者:Mark D. Ryan
单位:University of Birmingham, CloudTomo Ltd.
传统的使用公钥认证的CA模型,除去一些可能存在的密码学上的问题,还有2个非常重要的问题:
文章主要关注了一种名为Certificate Transparency的解决方案,该方案主要解决了第一个问题,并在后来推出了一个名为Revocation Transparency的扩展,用来解决第二个问题。
Certificate Transparency的目的在于,让网站的用户和拥有者都能够识别出不正确的证书以及不再受信的CA。
Certificate Transparency依赖于一份可验证的Certificate Transparency Log,这份Log使用一棵不断增长的Merkle Hash Tree来添加新证书,新添加的证书必须保证其证书链可信,存储时会将整个证书链添加到Log中,并且可以通过请求查询得到。
其还有一个名为Revocation Transparency的扩展,用来解决证书撤销的问题。
虽然Certificate Transparency的效率很高(就算有109份证书,用来验证的数据也只有1KB-2KB),然而其Revocation Transparency的效率非常低(O(n)),所以本文的主要目的就在于提高其效率。
文章提出了一种Certificate Transparency的扩展,名为Certificate issuance and revocation transparency(CIRT),来使其对于撤销证书的效率和颁发证书效率一样高。文章还将这一方法用到了电子邮件中,创建了一种不需要任何可信方,用户也不需要做任何额外操作的加密邮件方式。
对于检验一个叶子节点是否存在于树中,只需要O(logn)的复杂度,即每一层只需要提供一个节点信息,就可以完成验证。
CIRT使得用户的公钥可以依赖于CA,却未必一定要相信他们,它要求CA证明自己的一切操作都依然正常。
CIRT的很多想法都来自于CT,比如log中包含了一个给定CA的所有证书,不同的是,CT的log持有者只需给出一张证书是否在log中,而CIRT不仅能给出其是否存在于log中,还能保证它没有被撤销或替换。
首先定义CP,即Certificate Prover,是拥有log的实体,其log可以被定义为:
db=[cert(Alice,pkAlice),cert(Bob,pkBob),...]
为了维护其正确性,CP还必须提供以下服务:
CIRT构建了两棵Merkle树,一棵根据时间顺序,从左到右排列,取名为ChronTree。对于这棵树来说,要撤销一张证书,就是在这张证书的密钥后再增加一个密钥(比如说null),也就是说,每个证书的key指的是其最后一个。这样的做法使得对于查询证书是否撤销的复杂度保持在O(logn),而不是像CT中的O(n)(在CT中要检查一个证书是否被撤销,需要列举在其之后的所有记录,以查看是否存在撤销行为)。在这棵树中,插入、撤销和扩展都只需要O(logn)的复杂度
另一棵Merkle树按照二叉查找树的方式进行构建,也就是从左到右,按照字典顺序排列,称作LexTree,示例如下。
对于其中的每一个di可以表示为:di = (subji, (certi,1, certi,2, ...))
其中,(certi,1, certi,2, ...)是一个定长序列,也就是说,LexTree只保留有限个被撤销的证书,正在使用的就是最后一个公钥。
LexTree使得检查缺少的凭据的算法复杂度也降到了O(logn)。比如说Bob不存在于这棵树中,那只要证明在subji ≤ Bob ≤ subjj的条件下,subji和subjj是相邻的即可。
但是在LexTree中,扩展这一功能就需要O(n)的复杂度。
所以为了达到最高效率,一个db可以定义为(ChronTree, LexTree)。因为LexTree对于扩展操作比较慢,所以可以用ChronTree来辅助完成,比如要增加一张证书c到(ChronTree, LexTree)上:
h(db)就是一对ChronTree和LexTree的根,为了保持两者的一致性,需要对此做检查,这个检验需要O(n)复杂度的时间和空间。
一些定义如下:
MP——mail provider,CP——certificate provider
用户拥有由邮件客户端生成的公私钥对,CP验证用户的公钥,并维护一个公钥和邮件地址的数据库,用CIRT来维护一个只能增加信息的证书增删日志文件。
比如说Alice要注册一个账户,并下载了正确的客户端。
基本和发送邮件类似
以上方法的好处在于,不像S/MIME和PGP,用户不需要知道关于公私钥的技术细节就可以使用加密邮件。
使用上述方法时,邮件界面上并不会存在加密或者解密的选项,所有的加解密操作由软件自身完成。
密钥在服务器
密钥需要用户通过口令来换得,这一方式比较灵活,但是要求用户口令足够灵活,而且一旦口令丢失,则无法再获取到密钥。
密钥在本地
密钥在本地的话要比上一种更加安全,因为服务器不会遭受到口令猜解攻击,然而也有一个问题,就是如何在多个设备上迁移密钥,研究者目前开发了一套协议用来解决这个问题。