数字证书和数字签名

发布时间:2024年01月18日

如何证明浏览器收到的公钥一定是该网站的公钥?

现实生活中,若想证明某身份证号一定是小明的,可以看他身份证,而身份证是由政府作证的,这里的“公理”就是“政府机构可信”,这也是社会正常运作的前提。

那能不能类似地有个机构充当互联网世界的“公理”呢?让它作为一切证明的源头,给网站颁发一个“身份证”?

它就是CA(Certificate Authority)机构,CA机构是一个权威机构,负责“证件”印制核发。就像负责颁发身份证的公安局、负责发放行驶证、驾驶证的车管所。它是如今互联网世界正常运作的前提,负责管理和签发证书的第三方机构,作用是检查证书持有者身份的合法性,并签发证书,以防证书被伪造或篡改。而CA机构颁发的“身份证”就是数字证书

数字证书

网站在使用HTTPS前,需要向CA机构申领一份数字证书,数字证书里含有证书持有者信息、公钥信息等。

服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明“该公钥对应该网站”

但又有一个问题,
“证书本身的传输过程中,如何防止被篡改”?
即如何证明证书本身的真实性?
身份证运用了一些防伪技术,而数字证书怎么防伪呢?
解决这个问题我们就接近胜利了!

如何放防止数字证书被篡改?

我们把证书原本的内容生成一份“签名”,比对证书内容和签名是否一致就能判别是否被篡改。这就是数字证书的“防伪技术”,这里的“签名”就叫数字签名

数字签名(解决数据篡改问题)

比如:对一个给定的文件/资料,我们可以算出一个MD5;那么将来这个文件/资料将来就无法篡改一丝一毫,否则算出来的MD5马上就不一样了。这就是所谓的“数字签名”。

重复一遍:数字签名的作用是确保文件内容未经篡改。

哈希算法原理
哈希函数是一种摘要函数,它的目的是从一个不限长度的输入,输出一个固定长度比如32位十六进制数(128bit)的字符串。MD5(x)=y。 其中x是任意长度,y是固定长度。这个过程是信息损失的,你不能凭空制造出信息来。比如你有一个小电影,比如一本三国演义,经过哈希后只有32位十六进制数,你不能根据俩字符串脑补出一本三国演义,同样你也不能脑补一步小电影。数据摘要算法不是压缩/加密算法。几百m的东西摘要一下就一个字符串还能逆向的话
恭喜你发现了二十一世纪最强压缩算法。因为信息量缩小了,你不可能从有限的信息量反推出无限的可能,所以是不可逆的。

在这里插入图片描述
数字签名的制作过程:

  1. 签名者使用哈希函数对要签名的文档进行摘要计算,生成一个固定长度的哈希值。
  2. 签名者使用自己的私钥对哈希值进行加密,生成数字签名。
  3. 数字签名与原文一起传输给接收者。
  4. 接收者使用签名者的公钥对数字签名进行解密,得到原文的哈希值。
  5. 接收者使用相同的哈希函数对接收到的原文进行摘要计算,得到一个新的哈希值。
  6. 如果两个哈希值相等,表示文档的完整性和真实性得到验证,且签名者的身份得到确认。

签名者:(明文和数字签名共同组成了数字证书,这样一份数字证书就可以颁发给网站了。)
哈希函数 + 要签名的文档 = 哈希值
私钥 + 哈希值 = 数字签名

数字签名 + 原文(明文)= 数字证书

接受者:(那浏览器拿到服务器传来的数字证书后,如何验证它是不是真的?即有没有被篡改、掉包)
数字签名 + 公钥 = 原文的哈希值
相同的哈希函数 + 接收到的原文 = 新的哈希值

比对两个哈希值

这里的签名者是CA认证机构。

主要技术:

  1. 非对称密钥加密算法: 数字签名使用非对称密钥加密算法,如RSA(Rivest-Shamir-Adleman)和DSA(Digital Signature Algorithm)。这些算法使用两个密钥,一个用于加密(公钥),一个用于解密(私钥)。
  2. 哈希函数: 数字签名使用哈希函数对文档进行摘要计算,生成固定长度的哈希值。常用的哈希函数包括MD5(Message Digest Algorithm 5)和SHA(Secure Hash Algorithm)系列。

中间人有可能篡改该证书吗?

假设中间人篡改了证书的原文,由于他没有CA机构的私钥,所以无法得到此时加密后签名,无法相应地篡改签名。浏览器收到该证书后会发现原文和签名解密后的值不一致,则说明证书已被篡改,证书不可信,从而终止向服务器传输信息,防止信息泄露给中间人。
所以信息不可能被篡改。

中间人有可能把证书掉包吗?

假设有另一个网站B也拿到了CA机构认证的证书,它想劫持网站A的信息。于是它成为中间人拦截到了A传给浏览器的证书,然后替换成自己的证书,传给浏览器,之后浏览器就会错误地拿到B的证书里的公钥了,这确实会导致上文“中间人攻击”那里提到的漏洞?
其实这并不会发生,因为证书里包含了网站A的信息,包括域名浏览器把证书里的域名与自己请求的域名比对一下就知道有没有被掉包了。

为什么制作数字签名时需要hash一次?

似乎数字签名时hash有点多余,把hash过程去掉也能保证证书没有被篡改。
最显然的是性能问题,但是非对称加密效率较差,证书信息一般较长,比较耗时。而hash后得到的是固定长度的信息(比如用md5算法hash后可以得到固定的128位的值),这样加解密就快很多。

总结

数字签名是一种加密技术,用于验证数字文档的完整性、真实性和身份。
它使用了公钥密码学的原理和技术,以及哈希函数来实现。

数字签名基于公钥密码学的原理,使用了非对称密钥加密算法。它使用了两个密钥:私钥(私有密钥)和公钥(公共密钥)。
私钥只有文档的签名者(CA机构)拥有,并且必须保密保存。公钥可以被任何人访问。
签名通过使用公钥密码学和哈希函数的组合,实现了对数字文档的完整性、真实性和身份的验证。

其它:私钥,公钥,数字签名的区别
公钥是公开的,私钥是私有的,所以Alice给Bob发消息,就要使用Bob公开的公钥来做加密,Bob再用自己的私钥进行解密即可。简单来说,公钥加密,私钥解密。
数字签名刚好相反,比如大家想对Alice的签名进行验证,那么大家能获取的就是Alice公开的公钥,而签名则由Alice用自己的私钥进行签名。简单来说,私钥签名,公钥验证

参考文档1
参考文档2
参考3

文章来源:https://blog.csdn.net/u013565133/article/details/135667220
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。