哈希函数的非常基本的介绍:SHA-256,MD-5等

哈希函数在互联网上广泛应用,如密码安全存储和重复数据检测。它们确定性地加扰输入,无论输入大小,输出始终保持一致长度,且不可逆。本文介绍了哈希函数的工作原理,包括一个简单的LANEHASH示例,强调其在数据存储和验证中的重要性。
摘要由CSDN通过智能技术生成

这将是哈希函数的基本介绍。 我将假设我的大多数读者都在这里,以了解为什么使用哈希函数以及它们为什么起作用的基本概念。 我的目标是从一般意义上解释它,我将省略证明和实现细节,而将重点放在高级原则上。

为什么要使用哈希函数?

哈希函数在整个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值