先签名后加密是指先对消息进行签名,然后对消息的签名值和消息一起进行加密。如果采用先加密后签名的方式,接收方只能知道该消息是由签名者发送过来的,但并不能确定签名者是否是该消息的创建者。比如在发送一个认证凭据时采用先加密后签名的方式,消息在发送过程中就有可能被第三方截获并将认证凭据密文的签名值修改为自己的签名,然后发送给接收方。第三方就有可能在不需知道认证凭据的情况下通过这种方式来通过认证获取权限。

采用先签名后加密方式可以避免这类问题的发生,因为只有在知道消息明文的情况下才能对其进行签名。

虽然不同的规范描述有差异,但核心观点都是“先签名后加密”。但是这条规范的适用场景是什么呢,“先加密后签名”一定不安全吗?需要深挖一下。

如果使用“先加密后签名”,则消息发送方Alice和消息接收方Bob的处理过程如下图:

Alice发送的明文消息先经过Alice私钥签名,再将消息明文和消息签名一起使用Bob的公钥加密,密文经过网络传输到Bob。因为Bob使用私钥解密还原出消息明文和签名,而私钥只有Bob持有,这能保证消息明文不会泄露给第三方Eve,然后Bob使用Alice的公钥验证消息明文和签名是否一致,因为Alice的签名只有Alice的公钥才能验证,这能保证消息一定来自Alice,不可抵赖,且没有被第三方Mallory篡改。在拿不到消息明文的情况下,无法计算出消息签名,而还原消息明文又必须使用Bob的私钥,这样就能防止网络传输过程中的中间人进行篡改攻击。

假如“先加密后签名”,会存在什么样的攻击风险呢,先看下“先加密后签名”的处理流程:

消息明文使用Bob的公钥加密,不可能泄露给第三方,签名也有了,可以防篡改,不仔细看的话,似乎没什么问题。继续看下面这张图:

如果存在一个中间人Mallory可以拦截Alice和Bob的消息,在不篡改消息明文和密文的情况下,使用Mallory的私钥对消息密文进行签名,并替换Alice原始的签名,最后篡改后的消息传输给接收方Bob,Bob仍然可以成功解密明文,同时用Mallory的公钥成功验证签名,最终这条消息会被Bob认为是Mallory发送的合法消息。

“先加密后签名”一定不安全吗

从上面的演示来看,“先加密后签名”似乎一定不安全,是这样吗?中间人Mallory针对“先加密后签名”进行替换签名攻击得手的前提条件:

1、 接收方Bob根据签名内容中的证书ID找到对应的Mallory公钥来验证签名。

2、 接收方Bob仅使用公钥验签来识别发送方的身份。

只要打破上面的任意一个前提,“先加密后签名”也是安全的:

1、 Bob使用固定的公钥来验证签名,而不是根据签名内容来找对应公钥,或者不使用多个公钥尝试验签。即Mallory替换签名后,Bob仍然用Alice的公钥验证签名,肯定能发现请求被篡改。

2、 Bob使用公钥+应用层属性一起识别发送方的身份,假设Alice在消息明文中携带自己的用户ID,Bob验证公钥和用户ID是否匹配,即使Mallory替换签名也无法攻击。

所以“先加密后签名”是不是安全,还要看业务应用是怎么设计的,不能绝对的认定为不安全。

点击关注,第一时间了解华为云新鲜技术~

本文分享自华为云社区《“先签名后加密”的思考》,原文作者:卡农。

“先加密后签名”是不是安全?看完这篇就秒懂!相关推荐

  1. american主板网卡灯关机后还亮_看完这篇文章,90%的电脑黑屏问题都可以解决了!...

    经常有朋友电脑一开机,发现电脑黑屏没法用了.这是什么情况?该怎么处理?很多人看到黑屏就懵了,以为电脑要报废了,别方,下面蝈蝈来给大家讲讲常见的黑屏问题的解决办法,希望对您有所帮助! 一般常说的黑屏故障 ...

  2. 我在名牌大学毕业后的经历 (看完感动,涌动,后泪流)

    我在名牌大学毕业后的经历 (看完感动,涌动,后泪流) 我是82年,大学毕业3年5个月.现在一家大型市场咨询公司,自己带一个组,月薪16000,未算其他收入与分红.也就是传统意义上的白领打工仔.在北京, ...

  3. 看完这篇文章后,你一定知道如何正确选股!

    看完这篇文章后,你一定知道如何正确选股!篇幅很长,但是都是干货,请耐心阅读! 选股应该博爱!真正的股票投资人一定是拥有博爱情怀的.很多时候,股民们纠结于某只或某几只股票不能自拨,导致频频在股市中吃亏碰 ...

  4. 看完这篇 Linux 权限后,通透了

    我们在使用 Linux 的过程中,或多或少都会遇到一些关于使用者和群组的问题,比如最常见的你想要在某个路径下执行某个指令,会经常出现这个错误提示 . permission denied 反正我大概率见 ...

  5. 收藏!最详细的Python全栈开发指南 看完这篇你还不会Python全栈开发 你来打我!!!

    Python Web全栈开发入门实战教程教程    大家好,我叫亓官劼(qí guān jié ),这个<Python Web全栈开发入门实战教程教程>是一个零基础的实战教程,手把手带你开 ...

  6. Dart语言基础,看完这篇文章就够了(二)

    文章内容是我在学习Flutter过程中对知识点的梳理和总结.如有不对的地方,欢迎指出. 本文承接Dart语言基础,看完这篇文章就够了(一),进一步了解Dart语法知识. 文章目录 1 流程控制语句 2 ...

  7. 学习Nginx,看完这篇超详细的文章就够了

    目录 本文简介 一.Nginx的基本概念 1.1.Nginx是什么? 1.2.Nginx能帮助我们做些什么? 1.3.Nginx的特性 二.Nginx的安装 2.1.环境介绍 2.2.安装Nginx ...

  8. 为何看完这篇RxHttp Http请求框架会觉得如此销魂,全文干货建议收藏!

    前言 RxHttp相较于retrofit,功能上,两者均能实现,并无多大差异,更多的差异体现功能的使用上,也就是易用性,如对文件上传/下载/进度监听的操作上,RxHttp用及简的API,可以说碾压re ...

  9. python装饰器原理-看完这篇文章还不懂Python装饰器?

    原标题:看完这篇文章还不懂Python装饰器? 1.必备 2.需求来了 初创公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作.redis调用.监控API等功能.业务部门 ...

最新文章

  1. ceph bluestore源码分析:非对齐写逻辑
  2. Qt / 伪状态和子部件
  3. MySQL count()函数
  4. java中public private_java中public、private、protected区别
  5. nodejs 本地php服务器,Nodejs搭建本地http服务器
  6. python 示例_带有示例的Python字典update()方法
  7. LeetCode 825. 适龄的朋友(计数排序+前缀和)
  8. 腾讯员工晒出薪资:真实 985 毕业薪资,大家看我还有救吗?网友:日薪?
  9. linux过滤文件的关键字,linux tail 过滤日志文件中的关键字
  10. IntelliJ IDEA-遇见的问题总结
  11. Android Theme.Dialog 到光 AppCompatDialog
  12. 查看Office365迁移任务进度状态
  13. cgo的效率 golang_golang rsa 和 cgo (openssl) 性能对比
  14. 妲己机器人功能_来自机器人影响者的5个功能强大的Instagram教训
  15. 人民币对美元汇率中间价报6.7592元 上调23个基点
  16. League of Demacia(平面几何)
  17. 第二章 工厂设计模式
  18. TSX常见简单用法(入门) Vue3+Vite
  19. 数据仓库介绍(一) - 数据来源
  20. 小波变换:基于matlab的数字图像水印嵌入及提取(灰度图)

热门文章

  1. Bootstrap3 如何防止插件冲突
  2. 定制Bootstrap
  3. java代码着色_给java代码着色源码
  4. koa2 mysql 事务_mysqljs在koa2中的正确姿势
  5. 正在等待缓存锁:无法获得锁_一句话说清分布式锁,进程锁,线程锁
  6. 专利交底书模板_技术交底书该谁来写?
  7. 远程服务器登入信息,远程登录服务器查看信息
  8. mysql5.7 innodb myisam 区别_InnoDB与MyISAM的区别(高性能MySQL笔记)
  9. Vue通过id跳转到商品详情页
  10. 学习人工智能的头四个月