这将是哈希函数的基本介绍。 我将假设我的大多数读者都在这里,以了解为什么使用哈希函数以及它们为什么起作用的基本概念。 我的目标是从一般意义上解释它,我将省略证明和实现细节,而将重点放在高级原则上。
为什么要使用哈希函数?
哈希函数在整个Internet上使用,以安全地存储密码,查找重复记录,快速存储和检索数据等等。 例如, Qvault使用哈希将主密码扩展为专用加密密钥。
此处有更长的用途列表: https://en.wikipedia.or/wiki/Hash_function#Uses
我想关注散列函数的几个重要功能,可以说是最重要的功能。
- 哈希函数确定性地加扰数据
- 无论输入如何,哈希函数的输出始终具有相同的大小
- 无法从加扰的数据中检索原始数据(单向功能)
确定性地加扰数据
想想一个魔方。
我从无杂乱无章的多维数据集开始。 如果我开始随机扭曲,到最后,我将得到的东西与我刚开始的东西几乎没有任何相似之处。 另外,如果我要重新开始并做完全相同的一系列动作,我将能够反复获得完全相同的结果。 即使结果可能看起来是随机的,也完全不是。 这就是确定性的意思。
确定性对于安全存储密码很重要。 例如,假设我的密码是“ iLoveBitcoin”
我可以使用哈希函数对其进行加扰:
iLoveBitcoin→“ 2f5sfsdfs5s1fsfsdf98ss4f84sfs6d5fs2d1fdf15”
现在,如果有人要查看加密的版本,他们将不知道我的原始密码! 这很重要,因为这意味着作为网站开发人员,我只需要存储用户密码的哈希(加密数据)即可进行验证。
用户注册后,我对密码进行哈希处理并将其存储在数据库中。 用户登录时,我只是对他们键入的内容进行哈希处理,然后比较两个哈希值。 由于给定的输入始终会产生相同的哈希,因此每次都有效。
当网站以纯文本格式存储密码时,这是对安全性的严重破坏。 如果有人入侵了一个这样的网站,他们将找到所有电子邮件和密码,并可以在其他网站上尝试这些组合。
输入无关紧要,输出大小相同
如果我对单个单词进行哈希处理,则输出将具有一定的大小(对于SHA-256,则为特定的哈希函数,大小为256位)。 如果我对一本书进行哈希处理,输出将是相同大小 。
这是另一个重要功能,因为它可以节省我们的计算时间。 一个经典的例子是使用哈希作为数据映射中的键。 数据映射是计算机科学中用于存储数据的简单结构。
当程序将数据存储在映射中时,键和值将被赋予映射。 当程序要访问该值时,它可以将适当的键提供给映射并接收相应的值。 数据图之所以不错,是因为它们可以立即找到数据。 该密钥用作计算机可以立即找到的地址,而不是花费数小时来搜索数百万条记录。
因为密钥就像地址,所以它们不能太大。 如果我想将书籍存储在数据映射中,则可以对书籍的内容进行哈希处理,并将哈希值用作键。 作为程序员,我可以简单地使用哈希来查找书的内容,而不必尝试按标题,作者等对数千条记录进行排序。
它们如何工作?
这是撰写本文的真正挑战。 我将使其保持极其简单,并省略实际的实现细节,同时让您基本了解计算机在处理某些数据时的实际工作。
让我们逐步演示一下我为演示而准备的示例算法LANEHASH:
我们从一些要散列的数据开始
iLove比特币
我将字母和数字转换为1和0(计算机中的所有数据都存储在1和0中,不同的1和0模式代表不同的字母)
iLoveBitcoin→100010100000101111
在这一点上,我们经历了各种预定步骤来转换我们的数据。 步骤可以是任意步骤,重要的是,每当使用LANEHASH时,我们都需要使用相同的步骤,以便算法具有确定性。我们将前四位从左侧移到右侧
100010100000101111→101000001011111000
我们隔着一点
101000001011111000→110011110&000001100
我们将这两部分转换为以10为底的数字。 以10为基数是我们大家在学校中学到的“正常”数字系统。 (所有二进制数据实际上只是数字,您可以在其他地方在线查找如何将二进制轻松地转换为以10为基数的数据)
110011110→414
000001100→12
我们将两个数字相乘
414 * 12 = 4968
我们对该数字求平方
4968 ^ 2 = 24681024
我们将该数字转换回二进制
24681024→1011110001001101001000000
我们从右侧切掉9位以得到16位
1011110001001101001000000→1011110001001101
我们将该二进制数据转换回英语
1011110001001101→“ 8sj209dsns02k2”
如您所见,如果您以相同的单词开头,那么您总是会在结尾处获得相同的输出。 但是,即使您只更改一个字母,结果也将发生巨大变化。
**免责声明**
在我从英语转换为二进制,以及从二进制转换为英语的步骤中,我没有遵循任何模式。 不要让那让您感到困惑。 有很多不同的方法可以将二进制数据转换为英语,然后再转换回英语,我只是不想在本文中对此感到困惑。 以下是有关该主题的一些参考资料:
谢谢
先前发布在https://qvault.io/2020/01/01/very-basic-intro-to-hash-functions-sha-256-md-5-etc/
From: https://hackernoon.com/a-very-basic-intro-to-hash-functions-sha-256-md-5-etc-21wp24jk