实用密码学
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
14948 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 24 讲
开篇词 (1讲)
课前必读 (1讲)
案例分析 (1讲)
实用密码学
15
15
1.0x
00:00/00:00
登录|注册

02|单向散列函数:如何保证信息完整性?

你好,我是范学雷。
从今天开始,我就要和你一起逐渐接触密码学的具体细节了。在这个过程中,我会讲到很多密码学相关的概念和诉求,这是我们打好基础的关键。不过,你也不用紧张,我会和你一起分析,一步步带你掌握这些知识点。
还记得上一讲,我们讨论的话题吗?我们通过牛郎织女约会送信的小例子,探讨了“密码学有什么用”这个问题,从而理解了信息安全的基本问题和基本需求。
问题出现了,我们也知道了该用密码学。现在就要来解决问题了,接下来的几讲,我们就先来解决“信息的完整性”这个问题。你还记得解决完整性的工具是什么吗?——单向散列函数。
可是,什么是单向散列函数?它是怎么解决完整性问题的?今天,我们就来讨论这两个问题。

什么是单向散列函数?

首先,我们从名字上看,一眼就能看出来单向散列函数有两个关键修饰词,“单向”和“散列”。
其实,在数学上,单向函数和散列函数是两个不同类型的函数。所以,我们要想理解单向散列函数,我们就要先知道什么是单向函数,什么又是散列函数。

什么是单向函数?

如果你没有了解过什么是单向函数,你可以先猜一下,为什么它叫单向函数?
单向函数(One-way Function)是正向计算容易,逆向运算困难的函数也就是说,给定你一个输入,你很容易计算出输出;但是给定你一个输出,你却很难计算出输入是什么。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

单向散列函数在密码学中扮演着重要的角色,保证了信息的完整性。它是一个既满足单向函数要求,又满足散列函数要求的函数。单向散列函数具有逆向运算困难和构造碰撞困难的特点,例如SHA-1算法。其雪崩效应特点使得微小的输入数据变化会导致输出数据的巨大变化,从而难以构造出具有相同散列值的新数据。散列值的长度选择需要权衡性能,而散列值的质量也需要考虑均匀分布。总的来说,单向散列函数通过保证逆向运算困难和构造碰撞困难,解决了数据完整性问题。 单向散列函数通过检查数据是否有变动,来解决数据完整性问题。一段数据,无论是少了一个字,多了一个字,或者修改了一个字,原始数据和修改后的数据的散列值都可能相差巨大。逆向运算困难性和构造碰撞困难性使得寻找具有相同散列值的数据变得困难。使用单向散列函数可以重新计算数据的散列值,对比新计算的散列值和接收到的散列值,从而判断数据是否完整。 然而,使用单向散列函数仍需关注两个问题。首先是选择足够难度的散列函数,以确保对散列值判断数据完整性时有足够信心。其次是安全地获得数据发送者计算的散列值,以避免接收到被修改过的数据和散列值而无法判断数据完整性。 通过对单向散列函数的讨论,我们理解了其正向计算容易、逆向运算困难、运算结果均匀分布、构造碰撞困难等特点,以及其解决数据完整性问题的基本思路。单向散列函数在密码学中扮演着基础性的角色,对于信息安全具有重要意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《实用密码学》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • tony
    牛郎利用非对称算法,生成一个公钥与私钥。公钥对外公开。 织女利用非对称算法,生成一个公钥宜私钥。 公钥对外公开。 牛郎生成对称密钥(对称算法织女知道)。牛郎用自己的单向散列函数计算信件内容输出哈希值。然后进行用自己的私钥进行签名。这样就有了签名与信件原文,将这两者用对称密钥加密。同时将对称密钥用织女的公钥加密,简称数字信封。然后将数字信封与密文信息都发给织女。 织女收到密文及数字信封之后,只能织女用自己的私钥才能解开。织女用自己的私钥解开数字信封,得到对称密钥。再用对称密钥解密得到明文与数字签名。 然后织女使用相同的单向散列函数计算出哈希值,用牛郎的公钥解密收到的数字签名得到哈希值。如果这两个哈希值一致这说明信息未被篡改,否则这说明被篡改。 传递过程中,通过使用织女的公钥加密对称密钥,从而保证了对称密钥的安全传输同时也可以保证仅仅织女才能解密并且可以获取到对称密钥。而该对称密钥通过这种方式任何人则无发获取到。 织女然后通过该对称密钥解密信息内容,获取原文与哈希值,判断信件的完整性。 我把数字信封复习了一遍。

    作者回复: 几乎是完美的。有两个小问题可以再细化一下。第一个问题是,牛郎怎么确认织女的公钥是织女的,织女怎么知道牛郎宣称的公钥真的是牛郎的?第二个问题是,使用使用非对称密钥加解密,有没有什么安全隐患?哪些算法可以这么干,那些算法不行?很遗憾,这个专栏没有计划讨论非对称密钥,这些都是很有意思的话题。 不过,仅仅使用对称密钥也能解决问题。

    2020-11-26
    4
    7
  • 天天有吃的
    希望老师可以把课程中用到的代码整理一份到git,比如今天的SHA1,虽然之前没接触过但是可以看看代码跑一跑理解一下,不然自己再去找博客去调试还是挺费时间的

    作者回复: 课程里尽量不使用代码,这样大家看起来就不用顾及语言问题了。但是,后面我会把涉及到的算法的用法,用Java写出来放到加餐或者Github上。

    2020-11-25
    7
  • 25ma
    突然有个大胆的想法,给老师这个课想了一个有趣的名字[趣谈密码学],哈哈😄,让枯燥的密码学算法的学习变得更加有趣,生动,形象,感谢老师

    作者回复: 哈哈,明明不是一个讲故事的专栏。真是有点这个意思。不过,等着吧,烧脑的马上就来。

    2020-11-26
    2
    2
  • 向东是大海
    1)织女生成一对密钥,一个是公钥,另一个是私钥; 2)织女把公钥寄给牛郎; 3)牛郎写信给织女,对信对内容进行hash;用公约对hash值加密作为数字签名;用公钥对信的内容进行加密;把加密后的信和信的数字签名一起寄给织女; 4)织女收信后,用私钥解密信的内容;用私钥解密数字签名得到信的hash值,比对信的hash值,如hash值正确,说明信未被篡改。

    作者回复: 整体思路大方向没问题,还有小细节你要在挑战一下:既然公钥是公开的,王母娘娘会不会也截获了公钥,然后同样的步骤3,篡改信的内容?另外,公钥一般不能用来加密像信这样的信息,我们讲非对成密钥的时候在讨论为什么。

    2020-11-25
    3
    2
  • LXX
    首先牛郎和织女在某一次见面的时候,自己约定一份公钥和私钥,然后牛郎之后可以对自己的约会信息以及单向散列函数算出约会信息的哈希值,一起用通过私钥加密,再通过公钥将信息加密 一次,装入信封里头,如果能过对传输通道进行隐秘保护就更好啦,最后织女收到之后,通过公钥解密,再通过私钥解密,获得信息和哈希值,织女通过计算信息内容的哈希值,与收到的对比,即可。

    作者回复: 嗯,某一次会面很重要,要记得埋下种子。

    2021-01-08
    1
  • Baldwin
    牛郎和织女约定好好加密方法。这几个字的实际存储比特取反然后用gb2312编码。最后用孙悟空的浑号做关键字;计算写一个校验和。当然加密方法和关键字 和签名算法只有牛郎和织女知道

    作者回复: 也就是说,除了加密方法之外,没有别的秘密?这个加密方法怎么传递给对方呢?

    2020-11-25
    2
    1
  • 彩色的沙漠
    老师,接口数据采用的AES加密之后通信,对于明文还有必要在做哈希让后端在做完整性校验吗?如果做了哈希把哈希值放到某一个字段里面,然后在整体加密传输,感觉必要性不大,因为数据已经加密,如果被别人破译了加密,那完整性校验就不攻自破了。 需要一种混合算法,把明文的哈希值和明文的加密数据通过某种算法混合到一块,这种安全性高一点。

    作者回复: 这要看AES具体的加密模式,如果是CBC或者ECB这些传统的加密模式,数据完整性是没有办法保证的。我们后面还会讨论这些安全问题,和带有自我验证的加密模式。也可以想一想一个例子,就是如果中间环节故意丢弃几个数据包,会有什么问题?

    2020-11-25
    1
  • 洛奇
    为什么java的hashcode()方法逆向运算很容易?

    作者回复: hashcode()不是密码学意义上的单向散列函数。 比如说Byte的hashcode就是byte本身,一眼就能看出来。

    2022-10-13归属地:美国
  • 霍尔
    如果黑客知道了单项散列函数,修改原文,并修改哈希值,那是不是就无法检测到原文被篡改

    作者回复: 是的。

    2021-01-24
  • Lorin
    既然散列函数已经具备雪崩效应了,按理说,反向破解应该很难,这个时候为什么还要单向函数呢?

    作者回复: 散列函数并不要求逆向运算困难,所以反向破解不一定很难。咱们是在单向散列函数这一部分讲的雪崩效应。

    2020-12-06
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部