热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

密码技术简明教程(二):散列、消息认证码和数字签名

上一篇我们讲到了对称加密和非对称加密,

上一篇 我们讲到了对称加密和非对称加密,利用这两个技术我们 确保了信息传输的安全性。但是如果有这么一种情况, Alice 下班之后忘记把电脑锁屏,第二天来的时候 Alice 如何确定自己的文件 是否被篡改过呢?

这种时候我们就要使用到一种叫做散列的技术,有时候也把通过散列函数生成出来的字符串叫做那个文件的指纹。

散列

散列函数的作用就是输入一样的消息,那么就会输出一个同样的散列值,也就是我们所说的指纹。但是只要消息有一丁点儿变化,就会输出 一个不一样的散列值。

当然,散列函数并不是完美的,也有极小的概率,输入两个不一样的消息,却输出了一个同样的散列值,这种情况我们叫做"碰撞"。 这种情况的发生主要取决于散列函数的质量。

散列值的长度与输入的长度无关,无论输入是多长,输出的值的长度都是固定的。

我们常见的散列函数有:

  • MD4: https://en.wikipedia.org/wiki/MD4
  • MD5: https://en.wikipedia.org/wiki/MD5
  • SHA-1: https://en.wikipedia.org/wiki/SHA-1
  • SHA-256, SHA-384, SHA-512: https://en.wikipedia.org/wiki/SHA-2
  • SHA-3: https://en.wikipedia.org/wiki/SHA-3

但是要注意,到2019年,MD4和MD5已经是不安全的了,它们的碰撞性已经被攻破了。同时,SHA-1也已经不安全。因此,目前常用的散列 是SHA-256,SHA-384和SHA-512。

高质量的散列函数能够识别出哪怕一丁点儿的篡改,但是它也有一个缺点,虽然它能识别篡改,但是无法识别伪装。即,如果 Cracker 伪装成 AliceBob 发送文件,即使 Bob 确认了文件没有被篡改也无济于事,因为这个文件根本不是真正的 Alice 发出的, 而是出自 Cracker 之手。因此,我们需要消息认证码和数字签名技术。

消息认证码

消息认证码(MAC, Mesasge Authentication Code)的作用就是确保消息发送于真正的来源。而消息认证码需要有这么一种特性,即使消息 认证码被 Cracker 获取了,它也无法篡改消息认证码从而让自己伪装成 Alice

消息认证码有几种实现方式:

  • 通过散列函数实现,这种一般叫做 HMACH 就是Hash。
  • 使用分组密码例如AES来实现

密码技术简明教程(二):散列、消息认证码和数字签名

这上面的密钥就是 AliceBob 事先商量好的一个密钥,只要这个密钥没有泄漏,那么就可以说明,发消息的要么是 Alice , 要么就是 Bob ;而根据消息的流向很容易就能确定是 Alice 发给 Bob 的还是 Bob 发给 Alice 的。那么怎么确保密钥不会 被 Cracker 知道呢?这就要用到上一节我们介绍的 非对称加密 了。

但是即便如此,消息认证码也是有安全风险的,那就是一种叫做 "重放攻击" 的策略,也就是说,虽然我没法知道你到底传输的内容是什么, 但是我可以拦截你的消息认证码,我再给你请求一遍。这个时候很可能就会发生这样一种情况,例如 AliceBob 转账1000元, 重放攻击之后, Alice 就一共给 Bob 转账了2000元。一般我们解决这种问题的方案有这么三种:

Cracker

消息认证码这么好用,也有一个解决不了的问题,那就是,如果 AliceBob 转账之后,需要向他们老板证明,然后老板给他们报销。 这是做不到的,为什们?因为消息认证码需要一个只有 AliceBob 才知道的密钥,如果想要向老板证明,那就要把密钥也给老板, 但是既然密钥给了老板,那么如何证明消息不是老板发的而是 Alice 发的呢?所以我们需要数字签名技术。

数字签名

AliceBob 之所以无法向老板证明,是因为知道密钥的人,就能造出消息。如果想要证明是 Alice 发的消息,那么只能使用 一个只有 Alice 才有,别人都没有的东西来进行签名才行。这让我们想起了使用 ssh 的时候,我们总是把本机的公钥发给目的机器, 然后我们登录的时候就可以确保我们一定是从这台电脑上登录的。

不过由于数字签名,所生成的签名是要给别人看的,所以数字签名是使用私钥来生成签名,而公钥用来验证签名的。

密码技术简明教程(二):散列、消息认证码和数字签名

密码技术简明教程(二):散列、消息认证码和数字签名

总结一下:

  • 非对称加密中,公钥加密,私钥解密
  • 数字签名中,私钥签名,公钥验证签名

正是因为 Alice 的私钥只有 Alice 才有, Bob 的私钥只有 Bob 才有,因此他们才可以证明消息是自己发的。

小结:

这一篇文章中我们学习了散列、消息认证码和数字签名,接下来一篇文章中我们将会看一下证书和TLS。

  • 重放攻击: https://zh.wikipedia.org/wiki/%E9%87%8D%E6%94%BE%E6%94%BB%E5%87%BB
  • MD4: https://en.wikipedia.org/wiki/MD4
  • MD5: https://en.wikipedia.org/wiki/MD5
  • SHA-1: https://en.wikipedia.org/wiki/SHA-1
  • SHA-256, SHA-384, SHA-512: https://en.wikipedia.org/wiki/SHA-2
  • SHA-3: https://en.wikipedia.org/wiki/SHA-3

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 我们


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 如何搭建服务器环境php(2023年最新解答)
    导读:本篇文章编程笔记来给大家介绍有关如何搭建服务器环境php的相关内容,希望对大家有所帮助,一起来看看吧。本文目录一览:1、怎么搭建p ... [详细]
  • 动态多点××× 单云双HUB
    动态多点是一个高扩展的IPSEC解决方案传统的ipsecS2S有如下劣势1.中心站点配置量大,无论是采用经典ipsec***还是采用greoveripsec多一个分支 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文介绍了在交换型网络环境下使用嗅探器ARPSniffer的方法,包括检测嗅探环境、设置嗅探的网卡和启动自动路由功能等步骤。同时指出ARPSniffer也可以在非交换型网络环境下使用来嗅探各种网络信息。 ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • 【CTF 攻略】第三届 SSCTF 全国网络安全大赛—线上赛 Writeup
    【CTF 攻略】第三届 SSCTF 全国网络安全大赛—线上赛 Writeup ... [详细]
  • SQL Server 2008 到底需要使用哪些端口?
    SQLServer2008到底需要使用哪些端口?-下面就来介绍下SQLServer2008中使用的端口有哪些:  首先,最常用最常见的就是1433端口。这个是数据库引擎的端口,如果 ... [详细]
  • 基于词向量计算文本相似度1.测试数据:链接:https:pan.baidu.coms1fXJjcujAmAwTfsuTg2CbWA提取码:f4vx2.实验代码:imp ... [详细]
  • 折腾个半死,数据库初始化设置不当报错 ORA01078: failure in proces...
    2019独角兽企业重金招聘Python工程师标准[oraclelocalhost~]$sqlplusassysdba提示Connectedtoanidleinstance.连 ... [详细]
author-avatar
fdsfdsfsfsfsfsfsfsfsafsf
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有