数字签名

我们需要数字签名

之前的文章我们讲了MAC(Message Authentication Code)消息认证码,MAC是认证消息的完整性的技术。它是由任意长度的消息和在发送者和接受者中间共享的密钥生成的。

MAC有个缺点就是秘钥是共享的,因为是共享的所以发送者可以计算MAC值,接收者也可以计算出同样的MAC值。因为两者都可以计算出同样的MAC值,所以我们无法判断这个MAC值到底是由谁来计算出来的。这里提到了MAC的缺点就是无法防止否认。

如果发送者A和接收者B使用不同的密钥,例如A发送消息的时候使用私钥对消息进行加密,B接收消息的时候使用公钥对消息进行解密。因为消息只能由A的私钥进行加密,所以这个签名一定是由A签发的,这样就没有否认的问题了。这个就是数字签名(digital signature)。

签名的生成和验证

生成消息签名这一行为是由发送者A来完成的,也称为对消息进行签名。生成签名就是根据消息内容计算签名值,生成签名意味着A认可这个消息的内容。

验证数字签名可以由消息接受者B来完成,也可以由第三方来完成。验证成功意味着这个消息是由A发出,失败则表示这个消息不是A发出的。

在数字签名的过程中,消息发送者A和消息接受者B使用不同的密钥来进行签名和验证。这里使用的不同的密钥就是公钥和私钥。

数字签名其实就是公钥密码的反向应用,下面我们看看两种的不同:

名称

私钥

公钥

公钥密码

接受者解密时使用

发送者加密时使用

数字签名

签名者生成签名时使用

验证者验证签名时使用

谁持有密钥?

个人持有

主要需要,任何人都可以持有

数字签名的方法

通常来说数字签名一般有两种方式:

  • 直接对消息进行签名
  • 对消息的hash值进行签名

下面我们分别来介绍两种方式。

直接对消息进行签名

直接对消息签名包含如下几个步骤:

  1. 发送者A用自己的私钥对消息进行加密生成签名。
  2. A将加密后的签名和消息发送给B。
  3. B用A的公钥对消息签名进行解密,从而得到签名之前的消息M1。
  4. B将M1和A直接发送过来的消息M2进行对比,两者一致则签名成功,否则失败。

这里我们注意一下第四个步骤,签名的目的是保证消息是由只持有该密钥的人生成的,而并不是要保证消息传递的机密性。也就是说数字签名本身并不是用来保证机密性的。如果要保证机密性则可以将消息加密之后再发出去。

对消息的hash值进行签名

上面的直接对消息进行签名,看起来非常简单,但是在实际应用中很少用到。因为要对整个消息进行签名时一个非常耗时的操作,所以通常我们会使用单向散列函数对消息进行处理得出一个hash值,然后对这个hash值进行签名:

  1. A用单向散列函数对消息进行计算hash值。
  2. A用自己的私钥对hash值进行签名。
  3. A将消息和签名发给B
  4. B用A的公钥对签名进行解密得到hash值。
  5. B使用单向散列函数对消息进行计算,将结果和4进行比对。

数字签名可以替代现实生活中的签名吗?

我们讲解了怎么实现数字签名,我们也可能听说在现实生活中有电子签名这个东西。

数字签名有很多技术上的优点,不需要物理交互就可以签订合同,并可以对任何数据进行签名。那么在实际上数字签名能不能替代实际签名的问题是一个复杂的社会行为。

因为我们在使用电子签的时候,没有人会亲自去设计签名算法,而是简单的根据软件提供的信息按下签名按钮。

那么这个签名软件是否值得信任,就是我们需要关注的问题。

数字签名无法解决的问题

使用数字签名我们可以防止伪造和篡改,也无法防止否认。但是还需要一个大前提就是验证签名的公钥必须是真正属于发送者。

这里我们就需要一个可信任的机构来为我们颁发可信任的公钥,这里就涉及到证书和PKI的知识了。我们将会在后面的文章中讲到。

本文分享自微信公众号 - 程序那些事(flydean-tech),作者:flydean

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • reactive stream协议详解

    Stream大家应该都很熟悉了,java8中为所有的集合类都引入了Stream的概念。优雅的链式操作,流式处理逻辑,相信用过的人都会爱不释手。

    程序那些事
  • JVM中的Safepoints

    java程序员都听说过GC,大家也都知道GC的目的是扫描堆空间,然后将那些标记为删除的对象从堆空间释放,以提升可用的堆空间。

    程序那些事
  • 关于throw Exception的一个小秘密

    之前的文章我们讲到,在stream中处理异常,需要将checked exception转换为unchecked exception来处理。

    程序那些事
  • 密码技术之数字签名

    我们知道,散列函数解决了消息的完整性防止篡改,消息认证码解决的是消息发送者是否被伪装的问题,但是消息的防抵赖性如何保证呢?因为发送接收双方都共享一个密钥,因为对...

    安智客
  • Debian 环境中安装git服务器 Gogs(下)

    在本教程中,我们将使用 Gogs 在 Debian 9 上按步骤指导您安装和配置您的私有 Git 服务器。这篇教程中涵盖了如何在 Debian Stretch ...

    Debian社区
  • 这些在 2016 年融了钱的明星AI初创公司,今年都在干嘛?

    商汤科技 最近商汤科技的各种传言不断,大的传言大家也可能都知道了,至于哪些是真哪些是假,si间、si间会给你答案。 咱直接看看他们今年的融资情况。今年 4 月,...

    BestSDK
  • 面试官问:能否模拟实现JS的call和apply方法

    之前写过两篇《面试官问:能否模拟实现JS的new操作符》和《面试官问:能否模拟实现JS的bind方法》

    lucifer210
  • 什么是苹果iOS超级签名源码系统?

    数字签名(又称公钥数字签名、电子签章等)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互...

    布谷安妮
  • 腾讯云语音识别v1签名算法详解

    v1的签名文档:https://cloud.tencent.com/document/product/1093/35642

    算法发
  • 2019年中秋节假期文化和旅游市场情况

    ? 2019年中秋节期间,各地文化和旅游产品供给充足,民俗活动丰富多彩,假期市场安全平稳有序。 综合各地旅游部门、通讯运营商、线上旅行服务商数据,经文化和旅游...

    腾讯文旅

扫码关注云+社区

领取腾讯云代金券