【信息保护论】Ch7.加密加固:单向散列函数

2023-10-22 05:40

本文主要是介绍【信息保护论】Ch7.加密加固:单向散列函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 单向哈希函数
    • 抗碰撞特性Collision Resistance
    • 哈希函数发展史
    • 哈希函数面临的攻击

单向哈希函数

Hash(散列值)函数又称哈希函数。

针对CIA系统中的完整性,确保这个文件是真的这个文件是否被篡改。前面说过的再传送攻击以及中间人攻击等,本质都是伪造数据并令接收人认为是正确数据,从而达到一些企图。

当我们编辑完一个文件然后关机睡觉起床,再打开这个文件,请问这个文件真的是昨天的文件吗,还是其他人伪造的这个文件?如何判别?
最简单的方法是:当我们编辑完这个文件,我将其复制一份到我的硬盘上并拔下硬盘,然后第二天我比较硬盘中的数据与计算机中的数据是否一致。这里硬盘就是安全的场所。想要验证完整性,最好的方法就是将想要确保安全性的物品保存到一个安全的场所,然后在需要检验时,从安全的场所中取出来进行比对,因为我认为这个场所是安全的,所以我默认其是真的,与之不同则认定是为假的。也就是说,本质上这种方法只能验证出数据是否发生过改变,但是断言说真与假就过于片面。

说到真伪的判断,不得不得提指纹了。假设有一个犯罪嫌疑人,与其相当相近的身材外貌出现在监控上,当我们想要调查他时,由于监控不清楚,我们比着监控看人和比对现场的指纹和他的指纹,肯定是后者更容易。后者具备指纹编写,验证方便,且不可否认(你说你没有,但是凶器上有你的指纹,这就是证据,想要推翻这个证据需要新的证据,如果无法提供则将认定其供词为假)。那么作为数据文件,能否有文件的[指纹]来方便我们进行操作呢?

哈希函数:可以成为文件的指纹来提供验证完整性。我们将昨天的文件通过哈希函数转化为哈希值后,与今天的文件通过同一个哈希函数转换成的哈希值进行数据比较,如果二者相同则认定昨天的文件就是今天的文件,至少他们数据没有被改变,但是持有者是可能不同的。哈希函数可以当做文件的指纹,你当然持有你的指纹,但并不意味着除你以外的人就不持有你的指纹,是哈希函数的风险所在。

简单的哈希函数例子:我们将一个输入除以23,并将其小数位第7~10位作为哈希函数值。则345689的哈希值是7391,因为他们的商是15029.95652173913043…

单方向哈希函数one-way hash function:单方向哈希函数是指通过哈希函数将输入变为输出后,利用输出反向推理出输入非常困难的函数。单方向哈希函数是后文要讲解的几项认证技术与密码技术的基础。
特点:

  1. 输入与输出的长度无关联,任意长度的输入 可以输出任意长度的输出。标准是不同的哈希函数。
  2. 哈希函数的输出往往是固定的,同一个哈希函数(SHA-1为例),不论输入是多少bit,输出固定为160bit。
  3. 哈希值运算过程是高速的。给定输入计算出输出虽然高速,但是输入位数越多,运算时间自然会变长。
  4. 信息不同,哈希值不同,具有单方向性,只要输入变动,输出一定会变动,但变动频率等特点不会反映到彼此上。即便输入只变更了1bit数据,输出也极大可能截然不同。

抗碰撞特性Collision Resistance

碰撞(Collision):不同的输入,经过哈希函数后得到了相同的输出。
抗碰撞特性(Collision Resistance):发现碰撞的概率非常小的性质。即H(x)=H(y),已知H(x)的情况下找到一个y非常难的性质。
在这里插入图片描述

  • Preimage Resistance: 想要找到关于y=H(M)的M从算术上不可能
  • 2nd Preimage Resistance: 想要找到满足H(x)=H(y)且x≠y的y非常困难
  • Collision Resistance:想要找到满足H(x)=H(y)且x≠y的y从算术上不可能。换言之具有强单方向性。
  • 单方向性:从输入计算输出非常简单,但是从输出计算输入却非常困难,无法通过哈希值逆算原信息的性质。

哈希函数中的一些用语:

名称别名
单方向哈希函数信息数字化函数;信息压缩函数;加密哈希函数
单方向哈希函数的输入pre-image(初像)
哈希值信息数字(message digest); 指纹(Fingerprint)
完整性无缺性;完整性;保全性

应用的例子:

  1. 自己入手的软件是否被篡改的验证。 单位中的应用软件通过哈希函数生成哈希值并保存到移动硬盘上,下班上班后,要确认自己企业电脑中的应用程序是否被修改过数据,此时可以使用将当前状态下的应用程序用哈希函数输出一个哈希值与自己移动硬盘中的比较,对比结果即可知道数据是否被修改过。
  2. Password Based Encryption(PBE):以密码为基础的加密。在PBE中将password和salt混合后通过哈希输出哈希值,并把这个哈希值当做加密的密钥。可以防止密码字典攻击。
  3. 信息认证代码MAC:目前在SSL和TLS中使用。通信过程中可以检测出伪造,将明文和密钥混合后输出哈希值来使用。
  4. 数字签名:为了简化签名过程,将明文用哈希值来替代,然后将这个哈希值进行数字签名来验证。
  5. 伪随机数生成器:需要通过满足之前的随机数列不能在现实意义上被用来推测出未来的随机数列的性质,为了保证这个性质的实现,需要使用单方向哈希函数。
  6. One time password:一次性密码。企业中用来验证是否是真正的客户,即便该密码泄露也无法被恶意使用。
    Ps)23456项是问本文后面的重点,因此在这里不过长的叙述。

哈希函数发展史

哈希函数备注
MD4Rivest于1990年创造的单方向哈希函数,128bit哈希值,现在不安全。
MD5Rivest于1991年创造的单方向哈希函数,128bit哈希值,展现了很多种破译密码的方式。虽然不能说MD5完全无用,但是已经发现了数个MD5内部构造的漏洞,与SHA-1同时间被破解,不安全。
SHA-1NIST(National Institute of Standards and Technology)制作,160bit哈希值,1993年美国的联邦信息处理标准,于95年发表改进版,可以计算的信息上限是264bit。近几年已被破解。
SHA-256256bit哈希值,264 计算上限,属于SHA-2
SHA-384384bit哈希值,2128 计算上限,属于SHA-2
SHA-512512bit哈希值,2128 计算上限,属于SHA-2。可以处理1024bit的数据块,进行块计算
RIPEMD-1601996年Hans Dobbertin, Antoon Bosselaers, Bart Preneel制作,160bit哈希值,使用European Union RIPE 项目改进的RIPEMD函数
SHA-3NIST为了替代SHA-1于2007年开始准备SHA-3,于2012年完成。与AES竞争的形式成为新的标准之一,后被选定为KECCAK的标准
LSH(Lightweight Secure Hash)2015年韩国提出的国内标准哈希函数,使用 Wide-pipe Merkle Damgaard构造,可以输出224.256.384.512bit的哈希值

哈希函数面临的攻击

  1. 暴力解码:哈希函数不是加密算法,因此这个暴力解码与加密算法中的不同。来看下面一个例子:

由于买卖,A想要给B转账十万元并写下了电子合同。该信息被黑客截获,黑客现在中断了A与B的通信,想要修改金额,将十万元给修改成一亿元。此时,黑客会通过机械来生产大量同义句,如
A给B的支付金额是一亿元
A给B的支付金额是一亿圆
A给B的支付金额是壹亿元
A给B的支付金额是壹亿圆
A给B的支付金额是¥100000000
A给B的支付金额是¥100,000,000

这些句子都是一个意思,然后用这些句子生产的哈希值与原转账十万元比较,直到输出一个与原文相同的哈希值,将二者替换,就能够达成目的了。这也是暴力解码的一种方式。这种方式并不是通过输出去反向算出输入,并没有本质上破解哈希函数,而是破坏了合同本身,其实目的不在于置换的内容如何,只要我用一个随机内容生成了对应相同的哈希值,我就可以破坏AB二人之间的正常交易。

  1. 生日攻击:利用生日问题引申出的攻击手段。先来看生日问题。

除去2.29,N人中有两个人生气相同的个概率是多少?为了让任意两人生日相同的概率大于50%,应该至少有多少人?
在这里插入图片描述
N=23时,这个式子的值为0.507297。因此,只要23个人就可以,是不是比想象中要少得多。

所以生日攻击也是运用这道理。黑客生成N个十万元合同和N个亿元合同,比较这两个合同的哈希值,找到两边有相同的时,将亿元合同代替对应的十万元合同并伪造成A发给B的。这个过程就是生日攻击。N越大则生日攻击越难成功,N越小则生日攻击越容易成功。假定A的单方向哈希函数的位数是M,Mbit的所有二进制数组空间是2M个,N≈ 2 M = 2 M 2 \sqrt{2^M}=2^{\frac{M}{2}} 2M =22M,也就说当N= 2 M 2 2^{\frac{M}{2}} 22M时,黑客就有50%以上的概率能够成功生日攻击。也就说对于SHA-1,只需要计算机有能力实行 2 80 2^{80} 280次生日攻击,就有50%以上的概率找对对应哈希值,虽然现在计算机力已经能够达到,但在20世纪初期这一度被认为是天文数字。

哈希函数无法解决的问题:虽然哈希函数可以鉴出数据是否被变更,但是无法鉴定该数据本身是否来源不正当,也就说无法鉴别真伪。因此就需要导入认证技术,其中最典型的两项技术是数字签名和MAC。

这篇关于【信息保护论】Ch7.加密加固:单向散列函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/259407

相关文章

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

使用Python检查CPU型号并弹出警告信息

《使用Python检查CPU型号并弹出警告信息》本教程将指导你如何编写一个Python程序,该程序能够在启动时检查计算机的CPU型号,如果检测到CPU型号包含“I3”,则会弹出一个警告窗口,感兴趣的小... 目录教程目标方法一所需库步骤一:安装所需库步骤二:编写python程序步骤三:运行程序注意事项方法二

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function