博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
哈希表 哈希函数 时间_您需要了解的哈希函数
阅读量:2522 次
发布时间:2019-05-11

本文共 2136 字,大约阅读时间需要 7 分钟。

哈希表 哈希函数 时间

安全从业人员的功能表中有一个工具可以帮助每个人理解,无论他们对计算机进行什么操作:加密哈希函数。 这听起来听起来像是神秘的,技术性的,甚至可能很无聊,但是我对什么是哈希以及它们为什么对您很重要有一个简洁的解释。

诸如SHA-256或MD5之类的加密散列函数将一组二进制数据(通常以字节为单位)作为输入,并希望输出对于每组可能的输入都是唯一的。 对于任何特定的哈希函数,输出的长度(“哈希”)对于任何输入模式通常都是相同的(对于SHA-256,它的长度为32字节或256位-线索就是名称)。 重要的是:从输出哈希到输入反向工作应该在计算上难以置信(密码学家讨厌“ 不可能”这个词)。 这就是为什么有时将它们称为单向哈希函数的原因。

但是哈希函数有什么用? 为什么独特的特性如此重要?

独特的输出

下载的是
下载的文件的逐字节副本。 当您从Linux系统信息库下载Linux ISO或软件时,您会看到此验证过程正在起作用。 没有唯一性,该技术将无用,至少出于您通常拥有的目的。

如果两个输入产生相同的输出,则哈希称为“冲突”。 实际上,MD5已过时,因为现在可以轻松找到与市售的硬件和软件系统之间的冲突。

另一个重要的特性是,消息中的微小更改(甚至更改单个位)都有望对输出产生明显的更改(这就是“雪崩效应”)。

验证二进制数据

哈希函数的典型用法是确保当有人将您的二进制数据交给您时,它就是您所期望的。 可以用二进制格式描述计算领域中的所有数据,无论是文本,可执行文件,视频,图像还是完整的数据数据库,因此至少可以说哈希广泛地适用。 直接比较二进制数据在计算上很慢且很费力,但是哈希函数设计得非常快。 给定两个文件,大小为几兆字节或几千兆字节,您可以提前产生它们的哈希值,并将比较结果推迟到需要它们时使用。

通常,对数据的哈希值进行数字签名也比对大量数据本身进行签名更容易。 这是一个非常重要的功能,以至于哈希在密码学中最常见的用途之一就是生成“数字”签名。

考虑到容易产生数据散列的事实,通常不需要同时拥有两组数据。 假设您要在计算机上运行可执行文件。 但是,在执行此操作之前,您需要检查它是否确实是您认为的文件,并且没有恶意行为者对其进行篡改。 您可以非常快速,轻松地对文件进行哈希处理,并且只要您具有哈希表的外观副本,就可以确定您拥有所需的文件。

这是一个简单的例子:

$ shasum      
-a256 ~
/ bin
/ fop
87227baf4e1e78f6499e4905e8640c1f36720ae5f2bd167de325fd0d4ebc791c  
/ home
/ bob
/ bin
/ fop

如果我知道由其供应商(本例中为Apache Foundation)提供的fop可执行文件的SHA-256总和为:

87227baf4e1e78f6499e4905e8640c1f36720ae5f2bd167de325fd0d4ebc791c

那么我可以确信驱动器上的可执行文件的确与Apache Foundation在其网站上分发的可执行文件相同。 这就是哈希函数缺乏冲突(或至少难于计算冲突 )属性如此重要的地方。 如果恶意行为者可以制作与真实文件共享相同哈希值的替换文件,则验证过程实质上是无用的。

实际上,各种属性还有更多的技术名称,而我上面所描述的将三个重要的属性融合在一起。 更准确地说,这些技术名称是:

  1. 图像前抵抗力:给定哈希值,即使您知道所使用的哈希函数,也很难找到创建它的消息。
  2. 第二种图像前抗性:给定一条消息,应该很难找到另一条消息,该消息经过散列后会生成相同的散列。
  3. 防冲突性:很难找到任何两个生成相同哈希值的消息。

耐碰撞性第二次成像前的抗性听起来像是相同的属性,但它们之间(且显着)不同。 镜像前抵抗力表示,如果您已经有一条消息,则将无法找到具有匹配哈希值的另一条消息。 抗冲突性使您很难发明两条将生成相同哈希值的消息,而这是在哈希函数中要实现的难得多的属性。

请允许我回到一种恶意行为者试图与另一个交换文件(带有哈希,可以检查)的情况。 现在,要在“野外”使用加密哈希(在现实世界中),除了由独角兽填充并充满无脂甜甜圈的完美安全,无错误的实现方式之外,还有一些重要而困难的条款需要遇见。 非常偏执的读者可能已经发现了其中的一些内容。 特别是:

  1. 您必须确保自己所拥有的哈希副本也不会受到篡改。
  2. 您必须确保执行哈希的实体能够正确执行并报告。
  3. 您必须确保比较两个哈希的实体确实确实报告了该比较的结果。

确保您可以满足这样的保证不一定是一件容易的事。 这是受信任的平台模块(TPM)是许多计算系统的一部分的原因之一。 它们充当了硬件的信任根,具有提供有关加密工具的保证,以验证重要二进制数据的真实性。 TPM是用于实际系统的有用且重要的工具,我计划将来写一篇有关它们的文章。


本文最初发表于 ,经作者许可改编和转载。

翻译自:

哈希表 哈希函数 时间

你可能感兴趣的文章
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_15_常用的函数式接口_Predicate接口练习-集合信息的筛选...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_14_常用的函数式接口_Predicate接口中的默认方法or和negate...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_17_常用的函数式接口_Function接口中的方法andThen...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_16_常用的函数式接口_Function接口中的方法Apply...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第2节 Stream流式思想概述_1_使用传统的方式,遍历集合,对集合进行过滤...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第2节 Stream流式思想概述_2_使用Stream流的方式,遍历集合...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第2节 Stream流式思想概述_3_流式思想概述...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第1节 常用函数接口_16_常用的函数式接口_Function接口中练习-自定义函数模型拼接...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_2_Stream流中的常用方法_forEach...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_1_两种获取Stream流的方式...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_4_Stream流的特点_只能使用一次...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_5_Stream流中的常用方法_map...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_6_Stream流中的常用方法_count...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_7_Stream流中的常用方法_limit...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_8_Stream流中的常用方法_skip...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_3_Stream流中的常用方法_filter...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_10_练习:集合元素处理(传统方式)...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_9_Stream流中的常用方法_concat...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_11_练习:集合元素处理(Stream方式)...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第4节 方法引用_1_方法引用基本介绍...
查看>>