摘要、签名、证书、信任链:信用不是数学算出来的

目录

前言

一、摘要:给内容按个「指纹」

1.1 为什么不用加密,而用摘要

1.2 摘要的价值:不可逆

1.3 一个真实用途:密码为什么不存原文

二、签名:在摘要上盖个私章

2.1 三层工具的分工

三、证书:谁来证明这把公钥是你的

3.1 信用必须有人提供

3.2 一张证书里有什么

四、信任链:一级一级往上问

4.1 浏览器验证的实际步骤

4.2 根证书凭什么特别

4.3 三层链条

五、总结


前言

先说清一件事:

加密和解密解决的只是传输链路的安全问题,相当于两个人说话不被别人偷听。但信用是另一回事。

看几个身边的例子:货币的信用由政府支撑;购房贷款的信用由银行支撑;你愿意买某个视频网站的会员,是因为相信这家公司的信誉;连比特币的信用,也要靠知名人士不断喊话。

一句话点题:信用源于我们的世界。信用的背后不是数学和算法,而是人,以及围绕人形成的组织、机构、国家。

那么回到那个很小的问题:你上网时,凭什么相信你访问的网站没有骗你?这一篇就从 HTTPS 的信用角度,把互联网的信用体系捋一遍。

一、摘要:给内容按个「指纹」

现实中要证明一份合同没被改过,人们会盖齐缝章、附上签名。签名和盖章是一个意思:证明自己签过某份协议,并且签完就不能再变。

想阻止合同被改,最容易想到的办法是加密:一旦加密,要改就得原文和密文一起改。这没解决「谁来提供信用」这个根本问题,但至少解决了一个基础问题——想改的人必须先拿到密钥。

1.1 为什么不用加密,而用摘要

加密的计算量大,而且结果通常比原文还大。

于是有个更轻的办法:摘要算法。摘要这个词和现实中的「文章摘要」是一个意思——给文章生成一个提要。只不过计算机算出来的不是概括总结,而是一个大数字。

给计算机一篇文章,用摘要算法(主要是哈希类算法)生成一个字符串。内容只要变一个字、甚至一个标点,摘要就会完全变样。

而摘要的体积很小,非常利于存储和传输。更关键的一点:对同一个摘要算法来说,不管你输入多大,输出的字节数是固定的。

以 MD5 为例:

md5(1字节数据)
md5(1M数据)

两行输入差了一百万倍,算出来都是 128 位 的值,换算成十六进制就是 16 个字符。哪怕拿它摘要一个 100M 的视频,结果还是 128 位——如果用加密算法,体积会随原文水涨船高。

1.2 摘要的价值:不可逆

摘要是对原文的证明,而且从原文到摘要不可逆。

原文能算出摘要,原文一变摘要就变;但拿着摘要想反推原文,几乎不可能。原因很简单:摘要和原文不是一对一——很多原文可以对应同一个摘要。

另外,想找到两份「摘要相同但原文不同」的内容(也就是摘要碰撞),概率低到像买彩票中大奖。所以实战中一般会挑碰撞难度更高的算法,比如 SHA-1。

1.3 一个真实用途:密码为什么不存原文

多数网站保存用户密码用的是摘要,而不是原文。原因很实际:程序员天天接触数据库,黑客也可能黑进数据库。存摘要,即使库被攻破,黑客拿到的也只是一串摘要。

拿到摘要什么也干不了——反推不出密码原文,也就登不进这个网站。但如果黑客能找到一份和密码摘要相同的原文呢?那他就能正常登录了。这正是摘要碰撞危险的地方,好在目前主流算法足够安全。

小结一下,摘要算法解决了三件事:

  • 为原文生成固定长度的内容证明(内容摘要);
  • 无法逆向得到原文,看起来是乱的,拿到了也没用;
  • 极低概率碰撞,不同内容几乎必然生成不同摘要。

但要记住:摘要只是一个工具。它能用在很多地方(比如密码存储),对互联网信用体系来说,它也只是基础件。

二、签名:在摘要上盖个私章

摘要的另一大用途是签名。还是用张三、李四签合同的例子。

张三先把合同生成摘要,再用自己的私钥加密这个摘要,得到一串密文——这串密文就是张三对合同的数字签名(Digital Sign)。

然后张三把公钥、合同原文、数字签名一起交给李四保管。效果基本等同于今天双方交换合同。

可以这样理解:数字签名就是对摘要的加密,所以它天生带着摘要的能力。

如果原文没被改过,下面这串等式就成立:

公钥解密(数字签名)== 签订时的原文摘要

== 摘要算法(当前原文)== 当前摘要

如果原文被改了,那就重新算一次摘要,和解密出来的「老摘要」一对比,立刻露馅。对张三而言,李四没有他的私钥,改不了他签过名的合同;对李四而言,张三也没法抵赖

因为李四拿张三的公钥一解,能解开就说明是张三的私钥签的。这一招同时解决了「防篡改」和「防抵赖」。

2.1 三层工具的分工

层次

解决什么问题

生活里的对应物

摘要

证明内容没被改过,且体积小、好传输

文章的提要;合同上的齐缝章

签名

证明「谁」签的,且签完不能改

本人在合同上签字

证书

证明这把公钥确实属于这个人/这个域名

公安局发的身份证

三、证书:谁来证明这把公钥是你的

不过上面那个例子有个致命缺陷:张三和李四的公钥,凭什么有公信力?

这里用了技术手段,你也可以理解成数学方法。但信用本身不能靠数学解决。真正的缺口是:谁来证明张三给李四的公钥确实是张三的?谁又来证明张三、李四是有权签约的合法个人?

3.1 信用必须有人提供

信用必须有人提供。

现实中只有权威机构(比如公安局)能证明张三是张三。互联网世界同理:需要专门机构提供证书,由它证明「这把公钥属于这个域名」。

这不代表张三不能自己给自己做证书——技术上当然可以,因为加密、签名算法都是公开的。只不过张三自制的证书没有公信力。差别不在算法,而在背后有没有信用。

3.2 一张证书里有什么

证书是一份身份证明文件,互联网上最常见的是给域名做证书。基础信息通常包括:

  • 覆盖的域名;
  • 证书的用途;
  • 签发时间;
  • 到期时间;
  • 域名方的公钥;
  • 等等。

除了证明身份,证书还有个关键作用:让别人能用你的公钥。

比如你自己签名的数据,别人就能拿你证书里的公钥去解密对照。这些信息本质上都是文本,最重要的是必须有权威机构对整张证书签名。CA 用自己的私钥签一下,于是证书上还要多三项:

  • 权威机构的名称;
  • 权威机构的签名;
  • 权威机构的网址。

最后这一步签名,就像护照上盖的那枚章。有了它,证书才算合法。

四、信任链:一级一级往上问

现在问题来了。李四拿到张三的证书,看到上面有个权威机构的签名,第一反应必然是——这签名真是那个权威机构的吗?

换成你打开一个 HTTPS 网站也一样:你被告知这证书是 GlobalSign 签发的。可大多数人都没听过 GlobalSign。不知道也没关系——用户根本不需要理解它,底层机制已经替你解决了这个问题,这就是信任链。

4.1 浏览器验证的实际步骤

用 HTTPS 打开一个页面时,证书会随握手被下载到本地。浏览器打开它,发现签发方是 GlobalSign(一家证书颁发机构,CA)。

  1. 浏览器去操作系统里查:有没有装 GlobalSign 的证书。装了,就信。
  2. 为什么可以信?因为操作系统的提供商——微软、苹果、谷歌——总不会为了砸自己招牌而恶意装非法证书。
  3. 既然本机有 GlobalSign 的证书,那么 GlobalSign 的公钥就应该能解开网站证书上的签名,得到网站证书的摘要,于是这张签发证书可被信任。
  4. 如果系统里没装,浏览器就去 GlobalSign 官网下载它的证书。
  5. 拿到之后仍不确定它权威,那就继续看这张证书上有没有签发方;有就递归往上查,直到查到一张「没有别人给它签名」的证书——根证书。

只要操作系统里有根证书,GlobalSign 就值得信任,于是它签发的那张网站证书也值得信任。

4.2 根证书凭什么特别

操作系统的提供商在这里扮演关键角色。系统安装时会预装一批证书,这些就是根证书;能签发根证书的机构叫根证书提供商。

全球范围内这类机构极少,只有信誉极好的机构才担得起。成为根证书提供商要过很多资质审核,出问题会被取消资格,还得和微软、苹果、谷歌等多家操作系统厂商达成合作。

4.3 三层链条

层层证明,最终构成一条信任链。通常分三层:

层级

证书由谁签名

装在哪里

根证书(Root CA)

自签名

随操作系统预装;少数情况由用户手动装(如抓包工具)

中间证书机构

由 Root CA 签名

按需从网上取,浏览器逐级核验

终端证书(如网站)

由中间证书机构签名

随 HTTPS 握手下发到本地浏览器

根证书自签名,中间证书由根签,终端证书由中间签,这就是信任链的形态。它也顺带抬高了犯罪成本:想冒充证书,就得让中间机构签你;要签就得买证书;而且买来的证书只能用于你自己的域名,冒充不了别人的网站。

要特别警惕一种情况:如果犯罪分子设法在你的电脑上装了它的根证书,后果极其严重——它可以冒充任何网站。所以抓包工具要求你手动装根证书时,务必想清楚这台机器上有什么。

五、总结

解决信用不是一个数学问题。

塑造信用靠的是社会关系——基于社交关系的信用、基于国家机器的信用、基于公司信誉的信用。但工具同样不可少,三者是这样搭起来的:

  • 摘要,是数学意义上的证明:体积小、没有密钥管理和分发问题,非常适合网络环境。
  • 在摘要上用私钥加密,就是签名;签名能防篡改、防伪造、防抵赖。
  • 在摘要和签名之上,引入现实中已有的社会关系,让信誉良好的机构提供信用——这就是证书颁发与信任链体系。

为什么可以相信一个 HTTPS 网站?

答:用浏览器打开 HTTPS 网站时,会先下载该网站的证书;浏览器验证证书上的签名,并一级一级往上验证,直到根证书。如果根证书已被预装,就会信任这个网站。也就是说,网站的信用是由操作系统的提供商、根证书机构和中间证书机构共同担保的。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐