密码技术——单向散列函数

学习《图解密码技术》补充密码学相关基础知识过程中所做的简单学习笔记,只记录要点,所用图例的来源均为《图解密码技术》一书。本篇主要参考本书第七章——单向散列函数

引子

消息被篡改了吗?

单向散列函数主要用来检查文件、消息等信息的完整性,也称一致性。例如,我手上有一个重要的文件,放在电脑里一晚上,如何判断这一晚上过后它有没有被入侵篡改了呢?那么这里就可以用单向散列函数,计算出这个文件的哈希值(散列值),保存在靠谱的地方或者甚至记在脑海里,过了一晚上,早上要用文件的时候,再计算一次文件的散列值,然后与文件原本的散列值进行比对,就可以判断文件是否被篡改了。

单向散列函数概要

单向散列函数(one-way hash function)是用来保障完整性的一种技术。

在单向散列函数中,有一个输入和一个输出,输入也叫做“消息”,输出叫做散列值。单向散列函数可以根据消息内容计算出散列值,而散列值可以被用来检查消息的完整性。

当消息中任一一个比特发生了变化,那么计算出来的散列值也是完全不同的,由此来保证消息的完整性(一致性)。

散列值的长度与消息的长度无关。例如md5算法得出的散列值固定是128比特长度,sha256算法得出的散列值固定是256比特长度。

散列值的长度总是固定的

单向散列函数的性质

  • 根据任意长度的消息计算出固定长度的散列值

  • 能够快速计算出散列值

  • 消息不同散列值也不同

    为了能够确认完整性,消息中哪怕只有1比特的改变,也必须要产生不同的散列值。如果消息改变了而单向散列函数计算出的散列值没有发生变化,那么消息很容易就会被篡改,这个单向散列函数就无法用于完整性的检查了。

    两个不同的消息计算得出同一个散列值的情况称为碰撞(collision)。难以发现碰撞的性质称为抗碰撞性

    • 弱抗碰撞性

      单向散列函数必须保证,当给定某条消息的散列值时,单向散列函数必须确保要找到和该条消息具有相同散列值的另外一条消息是非常困难的,这一性质称为弱抗碰撞性。

    • 强抗碰撞性

      所谓强抗碰撞性,是指要找到散列值相同的两条不同消息时非常困难的。

  • 具备单向性

    单向散列函数必须具备单向性(one-way),即无法通过散列值反推算出消息的性质。

MD5算法的强抗碰撞性已经被攻破,也就是说现在已经能够产生具备相同散列值的两条不同消息,因此MD5已经不安全了。

SHA-1的强抗碰撞性也已经被攻破,SHA-2目前还没有被攻破。

单向散列函数的应用

  • 检测软件是否被篡改

    很多软件都会通过单向散列函数,将计算出的散列值公布在自己的官网上,这样用户在下载到软件之后(可能是从镜像站或者第三方软件平台下载的),就可以通过比对散列值,判断软件是否被篡改了。

    检测软件是否被篡改

  • 基于口令的加密

  • 消息认证码

  • 数字签名

  • 伪随机数生成器

  • 一次性口令

针对单向散列函数的攻击

  • 暴力破解

    通过暴力枚举的方式,寻找与已知消息具有相同散列值的另一条消息的攻击,称为暴力破解,这相当于一种试图破解单向散列函数的”弱抗碰撞性“的攻击

  • 生日攻击

    试图找出两个具有相同散列值的不同消息的一种攻击,目的是要找到散列值相同的两条不同消息,而散列值则可以是任意值。这样的攻击一般称为生日攻击或者冲突攻击,这是一种试图破解单向散列函数的“强抗碰撞性”的攻击

单向散列函数无法解决的问题

单向散列函数可以保证消息的完整性,也就是说,它可以识别出消息是否被篡改了。但是单向散列函数无法识别消息的伪装

当我们不仅需要确认消息的完整性,还需要确认消息是否真的属于合法的发送者时,就需要使用认证技术了,认证技术包括消息认证码数字签名

Comments Section | 评论区
Privacy Policy Application Terms of Service