签名的作用简单来说就是证明某个文件上的内容确实是我写的/我认同的,别人不能冒充我的签名(不可伪造),我也不能否认上面的签名是我的(不可抵赖)

我们知道,手写签名之所以不能伪造,是因为每一个人的笔迹都是独一无二的,即使模仿,也可以通过专家鉴定分别出来。而不可抵赖,是因为每个人的笔迹都有固定特征,这些特征是很难摆脱的。

正是这两点特性使得手写签名在日常生活中被广泛承认,比如签合同、借条等等。

而数字签名,它的作用跟手写签名其实是类似的,用来证明某个消息或者文件是本人发出/认同的。我国在2005年就已经施行《电子签名法》,确立了电子签名(包括但不限于数字签名)的法律效力。

那么数字签名又是靠什么保证不可伪造和不可抵赖两个特性呢?

答案是利用公钥加密系统。常用的签名算法有

RSA,基于大整数分解问题
DSA,基于离散对数问题
ECDSA,属于DSA的一个变种,基于椭圆曲线上的离散对数问题

其中RSA是上述几个算法中最容易实现数字签名的。

公钥加密与数字签名

数字签名的要求是,只有我自己能签我的名字,其他人能验证我的签名,但是不能伪造我的签名。

我们知道,公钥加密系统里面,使用公钥加密,就可以使用私钥来解密;使用私钥加密,也可以使用公钥来解密。消息加密利用的是前者,数字签名利用的是后者。

用私钥对消息进行加密,得到密文,其实就是一个签名的过程。因为私钥顾名思义是私密的,而且是唯一的,只有我自己知道,别人无法在不知道我的私钥的情况下模仿我的签名(不可伪造)。而公钥是公开的,其他人可以很容易地使用公钥去尝试解密生成的密文,然后就可以知道这个签名是不是我签的(不可抵赖)。

当然,在数字签名的过程中,对原文的保密性没有要求,所以加密、解密这样的名词在这个场景中并不准确,用签名和解签会更合适。

实际应用中,由于直接对原消息进行签名有安全性问题,而且原消息往往比较长,直接使用RSA算法进行签名速度会比较慢,所以我们一般对消息计算其摘要(比如SHA-256等),然后对摘要进行签名。只要使用的摘要算法是安全的(MD5、SHA-1已经不安全了),那么这种方式的数字签名就是安全的。

一个具体的签名过程如下:

小明对外发布公钥,并声明对应的私钥在自己手上
小明对消息M计算摘要,得到摘要D
小明使用私钥对D进行签名,得到签名S
将M和S一起发送出去

验证过程如下:

接收者首先对M计算摘要,得到D’
使用小明公钥对S进行解签,得到D
如果D和D’相同,那么证明M确实是小明发出的,并且没有被篡改过

应用

手写签名可以用来签合同,那么数字签名可以用来干什么呢?

网站认证

首先最常见的用处就是用来认证一个网站的身份。
比如我打开百度,百度是怎么保证显示在我眼前的网页就一定是百度生成的,不是其他人修改的呢?就是借助数字签名来实现的。

用IE浏览器打开百度,点击地址栏旁边的小锁,再点击查看证书,就可以看到百度主页的数字签名证书了。所谓证书,其实是对公钥的封装,在公钥的基础上添加颁发者、有效期等信息。

“签名算法”一栏可以看到,它使用的是sha256RSA,也就是使用SHA-256计算摘要,然后使用RSA对摘要进行签名。而在“公钥”一栏则保存着该证书的“本体”,用于验证签名的RSA公钥。

代码签名

而除此之外,还有个地方我们经常碰到数字签名的——代码签名。

如果Windows上的可执行程序程序来源于正规公司,那么通常它会有代码签名,用于确保其来源可靠且未被篡改。以QQ为例,它的数字签名是这样的。

如果某个程序没有数字签名,那么它的安全性往往就没有保证;如果它有数字签名,但是显示“此数字签名无效”,那么这个程序要么被篡改了要么损坏了,不管哪种都不应该尝试执行它。

但是数字签名不是万能的。事实上不管是浏览器的数字签名还是代码的数字签名,都依赖于系统或者浏览器内置的根证书(公钥),如果电脑本身已经中毒或者被入侵,那么这些根证书可以被轻易添加或者修改,这时的数字签名的安全性可以说是荡然无存了。

即使是签名有效的软件,并不能保证签名的公司不耍流氓,因为申请合法证书的门槛其实并不高,很多流氓软件都是由一些不知名的小公司搞出来的;或者某些小公司篡改知名软件,加入自己的代码,然后将原来的签名替换成自己的签名,这些数字签名在系统看来也是有效的,但是我相信你不会想运行这些软件的。如果对安全性要求比较高,可以手动或者借助工具吊销那些不太安全的根证书,具体方法已经超出本文讨论范畴,读者可以自行寻找。

比特币

比特币使用的是数字签名,就是只有比特币转账中转出的人才能生成的,一段防伪造的字符串。通过验证该数字串。首先通过数字摘要技术把交易信息缩短成固定长度的字符串,然后用自己的私钥对摘要进行加密,形成数字签名。完成后,需要将完整交易信息和数字签名一起广播给矿工,矿工用牛牛的公钥进行验证。

比特币是一种匿名的数字货币,它的身份认证是基于ECDSA。比特币的账户地址就是对公钥等信息计算摘要得到的,向全世界公布。比特币账户地址不包含你的个人信息(姓名、住址、电话号码之类的),确认你是账户拥有者的唯一办法就是看你有没有账户对应的私钥。如果账户私钥丢失,那么你将永远地失去里面的钱;一旦私钥被黑客盗取,账户里面的钱就完全归黑客所有。

比特币地址是由用户的公开密钥经过SHA-256散列运算后,再通过RIPEMD-160散列运算而得,其长度固定为160个比特(bits),通常会利用Base-58将之编码成一串由英文字母和数字所组成的字符串,以方便显示或传播,其特征是皆以“1”或者“3”开头,英文区分大小写,但不包括“IlO0”等字符,“1”开头的地址长26~34位,“3”开头的地址长34位,例如”1DwunA9otZZQyhkVvkLJ8DV1tuSwMF7r3v“,地址也可编码成快速反应矩阵码(QR-Code,二维码)的形式让移动设备能够便捷地读取复制。

#参考文献

Microsoft TechNet: Digital Signatures
Wikipedia: Digital Signature Algorithm
Wikipedia: Elliptic Curve Digital Signature Algorithm

数字签名原理及其应用相关推荐

  1. C语言的EDS与RSA算法,数字签名原理eds算法是什么_生辰八字是什么算法

    数字签名算法sha-1的fpga高速实现 数字签名算法sha-1的fpga高速实现 数字签名技术原理介绍 数字签名算法sha 1的fpga高速实现 数字签名算法sha-1的fpga高速实现 数字签名算 ...

  2. Java 数字签名原理及产生

    前言 数字签名与数字证书 关于数字签名的介绍可以参考以上这篇. 这里稍微说一下不对称加密的方式: 用公钥加密的内容只能用私钥解密,用私钥加密的内容只能用公钥解密. 这样比对称加密更安全 Java 中数 ...

  3. 数字签名原理简介(附数字证书)

    首先要了解什么叫对称加密和非对称加密,消息摘要这些知识. 1. 非对称加密 在通信双方,如果使用非对称加密,一般遵从这样的原则:公钥加密,私钥解密.同时,一般一个密钥加密,另一个密钥就可以解密. 因为 ...

  4. 数字签名,数字证书,证书链原理

    来源:数字签名,数字证书,证书链原理(图文详解)_Ruby丶彬的博客-CSDN博客_证书链验证原理 数字签名,数字证书,加密简述 数字签名:谈及数字签名,就如小时候老师叫把卷子或者作业带回去给家长签字 ...

  5. S60 手机操作系统数字签名安全机制与软件签名原理

    <计算机世界>第 20 期文章 < S60 V3 手机操作系统用证书折磨你>是从一个普通手机用户的角度来写的,反映了一些用户的心声,但从手机软件专业和手机产业来讲,此文章有失公 ...

  6. 网络知识详解之:HTTPS通信原理剖析(对称、非对称加密、数字签名、数字证书)

    网络知识详解之:HTTPS通信原理剖析(对称.非对称加密.数字签名.数字证书) 计算机网络相关知识体系详解 网络知识详解之:TCP连接原理详解 网络知识详解之:HTTP协议基础 网络知识详解之:HTT ...

  7. 数字签名,数字证书,证书链原理(图文详解)

    文章目录 数字签名,数字证书,加密简述 数字签名原理 数字证书原理 证书链 数字签名,数字证书,加密简述 数字签名:谈及数字签名,就如小时候老师叫把卷子或者作业带回去给家长签字.只不过数字签名非物理用 ...

  8. 数字签名技术以及RSA算法的原理实现

    数字签名技术 1)对称加密与非对称加密 对称加密:对文件的加密和解密采用的都是同一个密钥,有IDEA和DES两种加密算法 非对称加密:有一对公钥和私钥 如果我们使用公钥加密,必须得用私钥解密:如果使用 ...

  9. 白话hash和数字签名,保证你看得懂

    链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 摘要:最近有朋友在后台问为啥最近老介绍hash相关文章,其实hash算法在信息安全中非常重要,尤其是作为数字签名 ...

  10. 对称加密和不对称加密原理

    本文转载至 http://my.oschina.net/freelife/blog/109048 java加密解密 java对称不对称 md5 des 私钥加密(对称加密 symmetric cryp ...

最新文章

  1. ASP.NET的SEO:HTTP报头状态码---内容重定向
  2. Delphi XE2 之 FireMonkey 入门(30) - 数据绑定: TBindingsList: TBindExpression 的 OnAssigningValue 事件...
  3. asp简单样例(1)
  4. scrapy框架异常--no more duplicates will be shown (see DUPEFILTER_DEBUG to show all duplicates)
  5. 设计模式:代理模式(C++)【代理服务器案例】
  6. html调后台接口_接口测试平台代码实现62: 多接口用例2
  7. Nexus私服下载及安装
  8. 开发一款3D场景编辑器
  9. QT 使用QAxWidget和QAxObject操作DOCX和EXECL文件,包括修改数据、插入图片、修改表格、打印文档、复制SHEET、修改页码数等
  10. Maui Shell 来了,开启 Linux 桌面新时代!
  11. spring boot基于Java的电影院售票与管理系统毕业设计源码011449
  12. 回归中的相关度和决定系数
  13. 【观察】美达电器:以数字化重塑质量管理体系,构筑车企新“护城河”
  14. Mkz-Cloud 部署之路
  15. mysql语句更新顺序_MySQL的Update语句Set顺序问题
  16. oracle utl_smtp,Oracle 11g 环境下,利用utl_smtp创建发送邮件的存储过程
  17. 基于CC2530的zIgbee传感器无线数据采集系统开发(部分关键源码)
  18. 2021高考长郡中学成绩单查询,2021年长沙各高中高考成绩排名及放榜最新消息
  19. C++_计算字符串长度
  20. 触摸屏毛笔签名软件下载

热门文章

  1. 用python实现简版区块链-交易(2)
  2. php新年倒计时源码,新年倒计时源码
  3. 【腾讯笔试题】记腾讯2019年暑假实习移动端开发在线笔试题
  4. H.264编码实验--JM18.6H264Visa
  5. html中写色块,怎么用html和css做出色块
  6. 烽火路由路虚拟服务器,烽火路由器怎么设置普通专线?
  7. 数据库实验——T-SQL编程
  8. JavaScript 设计模式之模板方法模式
  9. 软件工程——软件维护
  10. Linux 安装字体