加密哈希函数

加密哈希函数定义

加密散列函数是一种算法,可以在一个数据块上运行,例如单个文件或密码,以产生称为校验和的值。

密码散列函数的主要用途是验证一段数据的真实性。 只有使用相同加密散列函数从每个文件生成的校验和相同时,才能确保两个文件相同。

一些常用的加密散列函数包括MD5SHA-1 ,但也存在许多其他散列函数。

注意:密码散列函数通常简称为散列函数 ,但这在技术上并不正确。 哈希函数是一个更通用的术语,通常用于包含加密哈希函数以及其他类型的算法,如循环冗余校验。

加密哈希函数:一个用例

假设您下载最新版本的Firefox浏览器 。 无论出于何种原因,您需要从Mozilla网站以外的网站下载它。 如果没有托管在您学会信任的站点上,您希望确保刚刚下载的安装文件与Mozilla提供的完全相同。

使用校验和计算器 ,您可以使用特定的加密散列函数(比如SHA-2)计算校验和,然后将其与Mozilla网站上发布的散列函数进行比较。

如果他们是平等的,那么你可以合理确定你下载的是Mozilla希望你拥有的下载。

查看什么是校验和? 有关这些特殊计算器的更多信息,以及使用校验和的更多示例,以确保您下载的文件确实符合您的预期。

加密哈希函数是否可以被反转?

加密散列函数旨在防止将其创建的校验和反转回原始文本的能力。

然而,即使它们几乎不可能扭转,但并不意味着它们100%保证数据安全。

称为彩虹表的东西可以用来快速计算出校验和的明文。 彩虹表基本上是词典,它们列出了成千上万,甚至数十亿的这些以及相应的明文价值。

虽然这在技术上并不颠覆加密散列算法,但它可能也是如此,因为它非常简单。 实际上,由于没有彩虹表可以列出存在的每一个可能的校验和,它们通常只对简单的短语“有帮助”,比如弱密码。

下面是一个彩虹表的简化版本,用于展示在使用SHA-1加密散列函数时如何工作:

纯文本 SHA-1校验和
12345 8cb2237d0679ca88db6464eac60da96345513964
密码1 e38ad214943daad1d64c102faec29de4afe9da3d
我爱我的狗 a25fb3505406c9ac761c8428692fbf5d5ddf1316
Jenny400 7d5eb0173008fe55275d12e9629eef8bdb408c1f
dallas1984 c1ebe6d80f4c7c087ad29d2c0dc3e059fc919da2

要使用校验和计算出这些值,需要黑客了解使用哪种加密哈希算法来生成它们。

为了增加保护,一些存储用户密码的网站在生成值之后但存储之前对加密哈希算法执行附加功能。

这产生了一个新值,只有Web服务器可以理解,并且与原始校验和不完全匹配。

例如,输入密码并生成校验和后,可能会将其分成若干部分并重新排列,然后将其存储在密码数据库中,或者某些字符可能与其他字符交换。 当用户下次登录时尝试进行身份验证时,Web服务器会反转此附加功能,并再次生成原始校验和,以验证用户的密码是否有效。

这样做有助于限制所有校验和被盗的破解的有用性。

再一次,这里的想法是执行一个未知的函数,以便如果黑客知道加密哈希算法但不知道这个自定义函数,那么知道密码校验和是无益的。

密码和加密哈希函数

与彩虹表类似,数据库如何保存用户密码。 输入密码后,会生成校验和并与使用用户名记录的校验和进行比较。 如果两者完全相同,则您可以获得访问权限。

考虑到密码散列函数会产生不可逆校验和,这是否意味着您可以将密码设置为12345而不是12 @ 34 $ 5 ,因为校验和本身无法被理解? 它绝对没有 ,这就是为什么......

正如你所看到的,仅仅通过查看校验和就可以解密这两个密码:

用于12345的MD5: 827ccb0eea8a706c4c34a16891f84e7b

MD5 for 12 @ 34 $ 5: a4d3cc004f487b18b2ccd4853053818b

所以,乍一看,你可能会认为使用这些密码绝对没问题。 如果攻击者试图通过猜测MD5校验和(没有人这样做)来试图找出密码,那么这肯定是正确的,但是如果执行暴力或字典攻击(这是一种常见的策略),则不是这样。

蛮力攻击是在猜测密码时进行多次随机抽取。 在这种情况下,猜测“12345”会很容易,但很难随机找出另一个。 字典攻击的相似之处在于,攻击者可以从常用(和较少使用的)密码列表中尝试每个单词,数字或短语,“12345”绝对是一个可以尝试的密码。

因此,即使加密哈希函数产生难以猜测的校验和,您仍然应该为所有联机和本地用户帐户使用复杂的密码。

提示:如果您不确定自己是否被视为强密码,请参阅弱密码和强密码的示例

有关加密哈希函数的更多信息

看起来加密散列函数似乎与加密相关,但两者的工作方式却截然不同。

加密是一个双向的过程,其中某些东西被加密成不可读,但随后解密以再次正常使用。 您可能会加密已存储的文件,以便任何访问它们的用户都无法使用它们,或者可以利用文件传输加密来加密通过网络传输的文件,例如您在线上传或下载的文件。

像上面描述的那样,密码散列函数的工作方式不同,因为校验和不是用特殊的散列密码来颠倒的,例如用特殊的解密密码读取加密文件。 加密散列函数的唯一目的是比较两个数据,例如下载文件,存储密码,从数据库中提取数据等。

加密散列函数可能为不同的数据段产生相同的校验和。 发生这种情况时,称为碰撞。 显然,考虑到密码散列函数的全部重点是为输入到其中的每个数据进行完全独特的校验和,这是一个巨大的问题。

碰撞可能发生的原因是因为每个密码散列函数产生固定长度的值而不管输入数据如何。 例如,MD5加密散列函数为三个完全不同的数据块生成827ccb0eea8a706c4c34a16891f84e7b, 1f633b2909b9c1addf32302c7a497983e10adc3949ba59abbe56e057f20f883e

第一个校验码是12345 ,第二个是700多个字母和数字,第三个是123456 。 所有三个输入都有不同的长度,但自从使用MD5以来,结果总是只有32个字符。

正如你所看到的,对于可以创建的校验和的数量实际上没有限制,因为输入中的每个微小变化应该产生完全不同的校验和。 但是,由于一个加密哈希函数可以产生的校验和数量有限制,所以总会有碰到碰撞的可能性。

这就是为什么其他加密散列函数已经创建的原因。 虽然MD5生成一个32个字符的值,但SHA-1生成40个字符,SHA-2(512)生成128个字符。校验和具有的字符数越多,发生冲突的可能性越小,因为它提供了更多的空间独特的价值。