专栏首页林喜东的专栏图说“数字签名”
原创

图说“数字签名”

前言

虽然很久以前就了解了数字签名,但之前突然被一个非程序员朋友问起什么是数字签名时,依然解释得很费力。近日找图片素材看到Peggy_Marco大神的众多人物形象图时,有了用图解说数字签名的想法,于是决定借用大神的人物形象图,尝试用图解释一下说什么是数字签名。

1、图说数字签名

关于数字签名这事,还得从当年小明向王老板借钱说起......

小明要借钱
王老板要数字化转型

1.1、照搬传统

小明正在写电子借条

小明觉得这很简单,不就是把纸质借条转换成电子文档么;于是,小明立即打开电脑,书写借条。

小明发送出去的第1版借条如下:

第1版借条
没有签名,无法证明接口人信息

很显然,第1版的借条没有借款人签名,是一个无效的借条。数字世界里,则必须加上“数字签名”,用于证明签名者的身份;于是,小明加上签名后的第2版借条如下:

第2版借条:补上借款人签名
签名不具有独特性,谁都可以伪造

1.2、尝试对称加密,解决防伪造问题

确实,数字世界中,一个名字没有笔法字迹可以区分,千篇一律,谁都可以伪造,必须,另想他法用于证明签名信息确实是签名人所为。

小明苦思冥想了半天,终于想起曾经跟陈教授学过的对称加密,刚好可以用上。

对称加密可防伪造,前提是保护好私钥

于是,小明加上了加密了签名信息后,把下面的第3版借条发给了王老板,并解析了其中的原理。

第3版_签名加密:签名信息是使用对称加密算法AES对签名内容“小明”加密的结果 密钥为“1234567890ABCDEF”,IV参数:“ABCDEFGHIJKLMNOP”

但是,很快新问题又来了。

矛盾点:签名信息需要可验证,而对称加密密钥不能公开
对称加密解决不了数字签名问题

对称加密确实不适合做数字签名,小明不得不寻找新的解决方案,并陷入苦思中......

转变思路

1.3、用非对称加密解决内容可验证

是的,陈教授给出了新的解决方案:

非对称加密
非对称加密即可验证身份(私钥),又能验证签名内容(公钥)

很快,小明按照陈教授的方案,使用一种非对称加密算法RSA进行了加密,并输出了第4版借条。

第4版_非对称加密签名,签名信息是使用非对称加密算法RSA对签名内容“小明”加密的结果
公钥可公开,可用于验证签名内容

1.4、用消息摘要解决内容防篡改

关系到钱的问题,王老板不敢大意,仔仔细细的确认了一番,又发现了新的问题。

未加密内容可篡改

全文内容加密后的第5版电子借条如下:

第5版_全文非对称加密:签名信息是使用非对称加密算法RSA对签名内容"借 条\n为江湖救急,今收到王老板(身份证号:12345XXXXXXXX12345)出借的人民币壹佰萬整(¥1000000.00),借期1年,2020年12月31日到期还清。立此为据。\n借款人:小明"加密的结果

但是,签名信息比签名内容还长,怎么看都太长了;这个成本王老板直觉告诉他,应该还可以再优化优化。

全文加密成本太高

一直在旁的陈教授,觉得是时候普及一下密码学的基础概念了......

非对称加密的问题
消息摘要
消息摘要可防篡改

于是,小明加上了一种消息摘要算法(SHA256),并使用一种非对称加密算法(RSA)进行加密后的第6版借条如下:

第6版_先摘要再加密:签名信息是使用消息摘要算法SHA256对全文哈希后,再用非对称加密算法RSA对消息摘要结果加密的结果

1.5、用CA颁发的数字证书解决公钥归属问题

按照陈教授的提议修改后,一切似乎已经搞定,但在成交的最后关头,王老板提出了一个致命的问题:

证明之再证明
陷入死循环

在一旁的陈教授见此场景,又给支了一招:

借鉴传统

于是,小明就和王老板去找了业界威望极高的CA大佬,希望他能做“担保人”。

寻找高信用担保

给完保护费后,小明很快拿到了CA大佬给的证书,终于可以证明小明的公钥确实属于小明了。

用高信用机构(CA)颁发的数字证书证明小明公钥归属

备注:其实CA大佬签发证书的方法和上面小明用于证明自己签名的方法是一样的,只是签名内容换成了小明的公钥,签名密钥换成了CA大佬的公钥;但因为CA大佬有信用背书,且其公钥属于全网公开且知名度极高,所以,其签法证书大家都认。

1.6、完成数字签名

小明拿到CA大佬签名的证书后,加上之前的借条,终于解决了王老板的所有顾虑,和达成了最终的借贷协议。

实现数字签名,达成借贷协议

而小明拿到钱的那一刻,只能用“感觉人生已经到达了巅峰来形容”。

感觉人生已经到达了巅峰

2、数字签名小结

2.1、法律意义上的数字签名

中华人民共和国电子签名法第二条本法所称电子签名,是指数据电文中以电子形式所含、所附用于识别签名人身份并表明签名人认可其中内容的数据。

电子签名同时符合下列条件的,视为可靠的电子签名:

  (一)电子签名制作数据用于电子签名时,属于电子签名人专有;

  (二)签署时电子签名制作数据仅由电子签名人控制;

  (三)签署后对电子签名的任何改动能够被发现;

  (四)签署后对数据电文内容和形式的任何改动能够被发现。

2.2、数字签名要解决的问题

从电子签名法所描述的可靠电子签名来看,数字签名要解决的问题可归纳为两个:

(1)对签名人身份的确认,且签名人身份不可抵赖

(2)签名人对签名内容的认可,且签名内容不可篡改

2.3、如何解决数字签名面临的问题

通过上面的图说例子,这里的答案应该比较清晰了,那就是运用密码学的知识,使用:

实现数字签名的关键算法

用消息摘要算法解决内容防篡改的问题,再使用非对称加密(私钥加密)算法加密消息摘要内容解决签名人身份问题的防伪造和防抵赖问题。

2.4、密钥管理问题

正确使用数字签名的前提是:保证密钥的可靠性。

私钥的可靠性,依赖于签名者自己的保密工作。

而公钥的可信度,则依赖于公钥基础设施。在数字世界里,证明小明的公钥确实属于小明的东西,有个专业名词,叫做“数字证书”,而签发数字证书的机构叫做证书颁发机构(即CA, Certificate Authority),一般由信用高的权威机构颁发。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 你的账号安全吗?

    账号安全无小事,近些年持续不断爆出的安全事件,有很多低级错误其实都是拥有一个健壮的账号体系可以避免的;多次听闻后曾写一写账号安全相关的东西,但直...

    林喜东
  • 如何设计一个API签名

    大部分情况下,我们使用已有的API签名方案(如腾讯云API签名、阿里云APi签名、亚马逊API签名等等)即可,无需从零开始设计一个API签名方案...

    林喜东
  • 程序世界里的不信任原则

    人与人之间最重要的是信任,但程序的世界里,可能信任越少越好;我越发觉得越是高性能高可用的系统里,不信任原则会体现得更加淋漓尽致。

    林喜东
  • 机器学习 | 深入理解SVM,详细推导模型原理(二)

    TechFlow-承志
  • matplotlib简介

    Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形

    拾点阳光
  • 笔记 | GWAS 操作流程4-4:LM模型+数值+因子协变量

    GWAS分析时,无论是一般线性模型,还是广义线性模型,都要对协变量进行处理。数值类型的协变量(比如初生重数值协变量,PCA的值)直接加进去,因子协变量(比如不同...

    邓飞
  • Prometheus:pushgateway

    1、安装 2、启动 pushgateway --web.listen-address="0.0.0.0:9091"

    用户5760343
  • 第3章 Spark性能优化

    sparkle123
  • 6月推荐网站

    sourcegraph 装了chrome扩展之后,比如在github上分析源码的好伙伴。提供定义跳转,引用及搜索等功能。

    mafeifan
  • How is SAP UI5 Aggregation designed

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券