数字签名与数字证书的原理

浪子不回头ぞ 提交于 2020-04-06 13:52:05

在了解数字签名和数字证书之前,可以先了解一下加密算法的一些常见分类,我之前写了一篇介绍常见加密算法的文章。https://www.cnblogs.com/mysticbinary/p/12615063.html


将军与士兵通信 ---- 数字签名原理

为了用最简单的方式来讲解数字签名,我下面模拟几个在军事角色来讲解,加密算法的起源就是为了战争服务的。下面的实验演示使用一个在线网站:http://tool.chacuo.net/cryptrsapubkey

假设有一个德国将军和一个德国士兵需要通信,那么他们为了安全考虑,决定采用RSA非对称加密算法。

将军拿私钥、士兵拿公钥

将军拿着私钥:

-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOFLM8+cWfjWJrP6
3i0jiRtpc240U6wjyEV4Ji2XA8UpFsRMdsFLXRsy9Rs5YsW1GBlXcv3bgZD2itui
YSYnWdbJpI7yIFtkDKJZQ/k8kmH9v2QePUwzAbvXZsZ9hg92ORGms2nNT3DhQHNQ
wopSgdThz8Ztvhd4Er0s1M9ZAvhjAgMBAAECgYEAxwNLTUXsJGfn4Gzm/jC52MEZ
+mu2zgT90IAGGZeg+PUG63gwHyeXo4MsCVRz7/m8xAX/ykew+IEQwFt8Pdvc+rrs
5yml4gOBPfhpau5QaI75xNjnyH7UA3mbRCZeyZrvuKqtY/f8pCgzy3EBWnRpkcsq
eE6bsOQrD45mltr+0QECQQDynvhKEh+hD5xBpF/DIP8Fp6fizexHdA6+aZT/gLaF
A4XgZ9HEDDBhvNdadyYUNOLWhkxRHv6CkT5azfLXsJEhAkEA7begtbBCDXDf1+DR
h3j2S8zcv6+utYgcpjvxZqjbPi6UIWXLxI80PIwQ0uouHCUMjikBA6VX9vTbw9TZ
/IelAwJBAKI3W7baiz86mrTg3A4w/5GeWQexuurDVCBHo5F5U493nYk+oOe9ZpPS
mQIpa9JS0d+xB1GtsWlHBzPbQySnL0ECQA/btCjqvT1QTl6EbPXwp92eqQtQmQMb
NW4RiaUjlpyrVs5zkAho1T9EyMqJPNI71n6VVa/8k8WxyAdkZ7ZlBikCQEkNe1+s
AKnh+AFGCJ+6WAq1J2RuIgcA6bVL3ip7F2NHdE+N+tR9JqWw3JNCweWmAlzKIGs6
eKSVD5egzKaLXss=
-----END PRIVATE KEY-----

士兵拿着公钥:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDhSzPPnFn41iaz+t4tI4kbaXNu
NFOsI8hFeCYtlwPFKRbETHbBS10bMvUbOWLFtRgZV3L924GQ9orbomEmJ1nWyaSO
8iBbZAyiWUP5PJJh/b9kHj1MMwG712bGfYYPdjkRprNpzU9w4UBzUMKKUoHU4c/G
bb4XeBK9LNTPWQL4YwIDAQAB
-----END PUBLIC KEY-----

士兵给将军写信的过程

  1. I am soldier.就是士兵想要加密的文本;
  2. 用公钥加密文本,得到密文(如下)
l05JLkFyAY5W2AHnrufbPqPCU7VhfFmarBzLUgc/hIIdVVRZ2DUfCPACRUNmIhLWijaXYjHPvnD3QwxNmG4LynggWzDur2Ssj8Ng1EqmPEFA5ujlwUvZeqOENs/PnamTqrxlStxW2MOJZLUbxRsilIcK4807XBRYUThpsmUxZmU=
  1. 将这个密文通过邮件的方式发送给将军;

过程如下图:

将军收到密文解密的过程

只要将军不把私钥泄露出去,那这个密文就是安全的,即使英国佬拦截到了这个密文,也破译不了,只能看到一堆乱码。

  1. 将军收到密文;
  2. 将军使用私钥来解密密文,得到信本身的内容;

过程如下图:

将军给士兵写信的过程

  1. I am general.是将军写的文本;

  2. 用hash的方式,hash一下I am general.
    得到hash文:5244FAC4DB90120F1D833C687E0317FF , 这个hash文叫做摘要(digest);
    如下图:



  3. 使用私钥加密这个摘要,得到一段密文,这个叫数字签名(signature);

EtWBVFsxMeP1TMHwGLPdCy9fzmon09b7YGqfcKFNS7F4Db9iFSVKC6gABxuqL59eV6Fm/3hPXZ2NQ+4eq/rY57GiT0kMP4e86gFmUSLwJNHQyuue2zIJrrhLp7/CyVGjKFIyM0KLr+NERt2bv4t5ZkbIJLuN+QLNZUV6WCFugHQ=

如下图:

  1. 将军将I am general.文本和数字签名一起通过邮件的方式发送给士兵;

士兵接收将军信的过程

  1. 士兵用公钥解密这个数字签名, 得到摘要5244FAC4DB90120F1D833C687E0317FF
    如下图:


  2. 拿到I am general.文本使用hash加密,得到5244FAC4DB90120F1D833C687E0317FF hash密文

  3. 士兵通过对比摘要和hash密文是否一致,就能确认是将军发送的,并且没有被篡改。

这样就防止了英国佬拦截了将军的信,并作修改。

签名的使用场景

  • 需要加密传输的数据
  • Android签名
  • 客户端与服务端之间的通信

签名的安全风险

  1. 如果使用的是对称加密算法,那么不管是客户端还是服务端泄露了密钥就非常危险了。
  2. 使用了非对称,但是将密钥参与了传输,并泄露,那真是666了。
  3. 服务端的密钥写死在代码,而不是采用访问接口获取的方式,会导致离职的程序员带走密钥。
  4. 如果多个客户端之间的公钥证书被篡改,那么也意味着身份认证也被篡改了。

为什么需要数字证书

为什么需要数字证书

数字证书就是用来解决4. 如果多个客户端之间的公钥证书被篡改,那么也意味着身份认证也被篡改了。安全风险的第四条,防止客户端的公钥被篡改。

英国佬气急败坏,想出对策,既然将军不好搞,那就搞士兵,就派出英国美女间谍,美女间谍诱骗德国士兵后,偷偷使用了德国士兵的电脑,用自己的公钥替换了士兵电脑里的公钥。此时,士兵本地存储的是英国间谍的公钥,士兵还以为这是将军的公钥。因此,英国佬就可以冒充德国将军,用自己的私钥做成"数字签名",写信给士兵,让德国士兵用假的将军公钥进行解密,最后得到假信。

数字证书是什么

德国士兵得到了几次假信之后,也觉得不对劲了,但是自己又无法确定公钥是否是将军的真公钥。士兵就想到了一个办法,要求德国将军去找德意志情报中心(证书中心 certificate authority,简称CA),为公钥做认证。德意志情报中心(CA)用自己的私钥,对将军的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。

将军拿到了德意志情报中心(证书中心 certificate authority,简称CA)的数字证书以后,就可以放心了。以后再给士兵写信,除了加上数字签名,再附上数字证书就行了。

士兵收信后,先去用德意志情报中心的公告板查看CA证书的真伪性,确认之后,就可以用CA的公钥解开数字证书,就可以拿到将军的真实的公钥了,然后就能证明"数字签名"是否真的是将军签的。

Https原理

系统和浏览会存储着CA机构的根证书,然后通过对比服务端发送过来的证书的过程(这里不展开讲),来保证数据不被中间人篡改。

数字证书的应用场景

  • Https
  • 使用非对称加密,又怕客户端的公钥被劫持的场景

参考

http://www.youdzone.com/signature.html
https://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!