加密哈希函数是一种算法,可以对单个文件或密码等数据运行,以生成称为校验和的值。
加密哈希函数的主要用途是验证一段数据的真实性。只有当使用相同的加密散列函数从每个文件生成的校验和相同时,才能假定两个文件是相同的。
一些常用的加密散列函数包括MD5和SHA-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,仅仅因为校验和本身无法理解?不,这就是原因。
通过查看校验和,这两个密码都无法破译:
MD5 for 12345: 827ccb0eea8a706c4c34a16891f84e7b
MD5 for 12 @ 34 $ 5: a4d3cc004f487b18b2ccd4853053818b
乍一看,您可能认为使用这些密码都可以。如果攻击者试图通过猜测MD5校验和来尝试确定您的密码,这是真的,没有人这样做,但如果执行暴力或字典攻击则不是这样,这是一种常见的策略。
在猜测密码时采取多次随机刺伤时会发生暴力攻击。在这种情况下,很容易猜到 12345,但很难随机找出另一个。字典攻击的类似之处在于攻击者可以从常见(并且不常见)密码列表中尝试每个单词,数字或短语,以及12345 是这些常用密码之一。
即使加密哈希函数产生难以猜测的校验和,您仍然应该为所有在线和本地用户帐户使用复杂的密码。
有关加密哈希函数的更多信息
看起来加密哈希函数与加密有关,但两者的工作方式不同。
加密是一个双向过程,其中某些内容被加密后变得不可读,然后再解密以便再次正常使用。您可以对存储的文件进行加密,以便访问它们的任何人都无法使用它们,或者您可以使用文件传输加密来加密通过网络移动的文件,例如您上传或在线下载的文件。
加密哈希函数的工作方式不同,因为校验和不是用特殊的dehashing密码来反转的。加密哈希函数的唯一用途是比较两个数据,例如下载文件,存储密码和从数据库中提取数据。
加密哈希函数可以为不同的数据生成相同的校验和。当发生这种情况时,它被称为冲突,这是一个巨大的问题,考虑到加密哈希函数的整个点是为每个输入数据的输入做出唯一的校验和。
可能发生冲突是因为无论输入数据如何,每个加密散列函数都产生固定长度的值。例如,MD5加密散列函数为三个完全不同的数据块生成827ccb0eea8a706c4c34a16891f84e7b,1f633b2909b9c1addf32302c7a497983和e10adc3949ba59abbe56e057f20f883e。
第一个校验和来自 12345。第二个是由700多个字母和数字生成的,第三个来自 123456.
所有三个输入都有不同的长度,但结果总是只有32个字符,因为使用了MD5校验和。
可以创建的校验和的数量没有限制,因为输入中的每个微小变化都应该产生完全不同的校验和。由于一个加密哈希函数可以产生的校验和数量有限,因此总是有可能遇到冲突。
这就是为什么已经创建了其他加密哈希函数的原因。当MD5生成32个字符的值时,SHA-1生成40个字符,SHA-2(512)生成128个。校验和具有的字符数越多,发生冲突的可能性就越小。