精华内容
下载资源
问答
  • Hash算法特点

    千次阅读 2020-04-15 16:22:47
    2.2 Hash算法有什么特点 一个优秀的 hash 算法,将能实现: 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出...

    2.2 Hash算法有什么特点

    一个优秀的 hash 算法,将能实现:

    • 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
    • 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
    • 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
    • 冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。

    但在不同的使用场景中,如数据结构和安全领域里,其中对某一些特点会有所侧重。

    2.2.1 Hash在管理数据结构中的应用

    在用到hash进行管理的数据结构中,就对速度比较重视,对抗碰撞不太看中,只要保证hash均匀分布就可以。比如hashmap,hash值(key)存在的目的是加速键值对的查找,key的作用是为了将元素适当地放在各个桶里,对于抗碰撞的要求没有那么高。换句话说,hash出来的key,只要保证value大致均匀的放在不同的桶里就可以了。但整个算法的set性能,直接与hash值产生的速度有关,所以这时候的hash值的产生速度就尤为重要,以JDK中的String.hashCode()方法为例:

    public int hashCode() {
        int h = hash;
        //hash default value : 0
        if (h == 0 && value.length > 0) {
            //value : char storage
            char val[] = value;
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }
    

    很简洁的一个乘加迭代运算,在不少的hash算法中,使用的是异或+加法进行迭代,速度和前者差不多。

    2.2.2 Hash在在密码学中的应用

    在密码学中,hash算法的作用主要是用于消息摘要和签名,换句话说,它主要用于对整个消息的完整性进行校验。举个例子,我们登陆知乎的时候都需要输入密码,那么知乎如果明文保存这个密码,那么黑客就很容易窃取大家的密码来登陆,特别不安全。那么知乎就想到了一个方法,使用hash算法生成一个密码的签名,知乎后台只保存这个签名值。由于hash算法是不可逆的,那么黑客即便得到这个签名,也丝毫没有用处;而如果你在网站登陆界面上输入你的密码,那么知乎后台就会重新计算一下这个hash值,与网站中储存的原hash值进行比对,如果相同,证明你拥有这个账户的密码,那么就会允许你登陆。银行也是如此,银行是万万不敢保存用户密码的原文的,只会保存密码的hash值而而已。在这些应用场景里,对于抗碰撞和抗篡改能力要求极高,对速度的要求在其次。一个设计良好的hash算法,其抗碰撞能力是很高的。以MD5为例,其输出长度为128位,设计预期碰撞概率为1/2128,这是一个极小极小的数字——而即便是在MD5被王小云教授破解之后,其碰撞概率也非常低。而对于两个相似的字符串,MD5加密结果如下:
      
    MD5("version1") = "966634ebf2fc135707d6753692bf4b1e";
    MD5("version2") = "2e0e95285f08a07dea17e7ee111b21c8"

    可以看到仅仅一个比特位的改变,二者的MD5值就天差地别了.

    ps :
    其实把hash算法当成是一种加密算法,这是不准确的,我们知道加密总是相对于解密而言的,没有解密何谈加密呢,HASH的设计以无法解为目的的。并且如果我们不附加一个随机的salt值,HASH口令是很容易被字典攻击入侵的。

    展开全文
  • hash 算法

    2020-03-28 20:17:44
    提到hash,相信大多数同学都不会陌生,之前很火现在也依旧很火的技术区块链背后的底层原理之一就是hash,下面就从hash算法的原理和实际应用等几个角度,对hash算法进行一个讲解。 1、什么是Hash Hash也称散列、...

                                                 hash 算法

    提到hash,相信大多数同学都不会陌生,之前很火现在也依旧很火的技术区块链背后的底层原理之一就是hash,下面就从hash算法的原理和实际应用等几个角度,对hash算法进行一个讲解。

     

    1、什么是Hash

    Hash也称散列、哈希,对应的英文都是Hash。基本原理就是把任意长度的输入,通过Hash算法变成固定长度的输出。这个映射的规则就是对应的Hash算法,而原始数据映射后的二进制串就是哈希值。活动开发中经常使用的MD5和SHA都是历史悠久的Hash算法。

    echo md5("这是一个测试文案");
    // 输出结果:2124968af757ed51e71e6abeac04f98d

    在这个例子里,这是一个测试文案是原始值,2124968af757ed51e71e6abeac04f98d 就是经过hash算法得到的Hash值。整个Hash算法的过程就是把原始任意长度的值空间,映射成固定长度的值空间的过程。

     

     2、Hash的特点

    一个优秀的hash算法,需要什么样的要求呢?

    • a)、从hash值不可以反向推导出原始的数据
      这个从上面MD5的例子里可以明确看到,经过映射后的数据和原始数据没有对应关系

    • b)、输入数据的微小变化会得到完全不同的hash值,相同的数据会得到相同的值

      echo md5("这是一个测试文案");
      // 输出结果:2124968af757ed51e71e6abeac04f98d
      echo md5("这是二个测试文案");
      // 输出结果:bcc2a4bb4373076d494b2223aef9f702
      

      可以看到我们只改了一个文字,但是整个得到的hash值产生了非常大的变化。

    • c)、哈希算法的执行效率要高效,长的文本也能快速地计算出哈希值

    • d)、hash算法的冲突概率要小

      由于hash的原理是将输入空间的值映射成hash空间内,而hash值的空间远小于输入的空间。根据抽屉原理,一定会存在不同的输入被映射成相同输出的情况。那么作为一个好的hash算法,就需要这种冲突的概率尽可能小。

    桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面放不少于两个苹果。这一现象就是我们所说的“抽屉原理”。抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到n个集合中去,其中必定有一个集合里至少有两个元素。” 抽屉原理有时也被称为鸽巢原理。它是组合数学中一个重要的原理。

    3、Hash碰撞的解决方案

    前面提到了hash算法是一定会有冲突的,那么如果我们如果遇到了hash冲突需要解决的时候应该怎么处理呢?比较常用的算法是链地址法开放地址法

    3.1 链地址法

    链表地址法是使用一个链表数组,来存储相应数据,当hash遇到冲突的时候依次添加到链表的后面进行处理。

    链地址在处理的流程如下:
    添加一个元素的时候,首先计算元素key的hash值,确定插入数组中的位置。如果当前位置下没有重复数据,则直接添加到当前位置。当遇到冲突的时候,添加到同一个hash值的元素后面,行成一个链表。这个链表的特点是同一个链表上的Hash值相同。java的数据结构HashMap使用的就是这种方法来处理冲突,JDK1.8中,针对链表上的数据超过8条的时候,使用了红黑树进行优化。由于篇幅原因,这里不深入讨论相关数据结构。

    https://blog.csdn.net/weixin_41563161/article/details/105104239

    3.2 开放地址法  

    开放地址法是指大小为 M 的数组保存 N 个键值对,其中 M > N。我们需要依靠数组中的空位解决碰撞冲突。基于这种策略的所有方法被统称为“开放地址”哈希表。线性探测法,就是比较常用的一种“开放地址”哈希表的一种实现方式。线性探测法的核心思想是当冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。简单来说就是:一旦发生冲突,就去寻找下 一个空的散列表地址,只要散列表足够大,空的散列地址总能找到。

     

    线性探测法的数学描述是:h(k, i) = (h(k, 0) + i) mod m,i表示当前进行的是第几轮探查。i=1时,即是探查h(k, 0)的下一个;i=2,即是再下一个。这个方法是简单地向下探查。mod m表示:到达了表的底下之后,回到顶端从头开始。

    对于开放寻址冲突解决方法,除了线性探测方法之外,还有另外两种比较经典的探测方法,二次探测(Quadratic probing)和双重散列(Double hashing)。但是不管采用哪种探测方法,当散列表中空闲位置不多的时候,散列冲突的概率就会大大提高。为了尽可能保证散列表的操作效率,一般情况下,我们会尽可能保证散列表中有一定比例的空闲槽位。我们用装载因子(load factor)来表示空位的多少。

    散列表的装载因子=填入表中的元素个数/散列表的长度。装载因子越大,说明冲突越多,性能越差。

    当使用线性探测法时,相应的数据结果如下图所示:

                                                                              开放地址-线性探测法

    这里的两种算法的区别是2这个元素,在链表法中还是在节点2的位置上,但是在线性探测法遇到冲突时会将冲突数据放到下一个空的位置下面。

    4、hash算法在日常活动中的应用

    在日常运营活动中,我们活动开发经常遇到的应用场景是信息加密、数据校验、负载均衡。下面分别对这三种应用场景进行讲解。

    4.1 信息加密

    首先我们看一下信息加密的应用。2011年CSDN脱库事件,导致超过600W的用户的密码泄露,让人失望的是,CSDN是明文存储用户的注册邮箱和密码的。作为用户的非常隐私的信息,最简单的保护措施就是对密码进行hash加密。在客户端对用户输入的密码进行hash运算,然后在服务端的数据库中保存用户密码的hash值。由于服务器端也没有存储密码的明文,所以目前很多网站也就不再有找回密码的功能了。

    这里也友情提示一下大家:如果在使用中发现某网站还有提供找回密码的功能,就要好好担心下这个网站的安全性了。

    看到这里有些同学会觉得那么我们是不是对用户输入的密码进行一次MD5加密就可以了呢,这样就算恶意用户知道了hash值,也没有办法拿到用户的真实密码。假设用户的密码是123456789,经过一次md5以后得到的值是:

    25f9e794323b453885f5181f1b624d0b

    那么是不是使用了这个加密后的字符串来存密码就万无一失了呢,理想总是很丰满,而现实总是很骨感的。

     

    那么一般针对这种问题,我们的解决之道就是引入salt(加盐),即利用特殊字符(盐)和用户的输入合在一起组成新的字符串进行加密。通过这样的方式,增加了反向查询的复杂度。但是这样的方式也不是万无一失,如果发生了盐被泄露的问题,就需要所有用到的地方来重置密码。

     

    针对salt泄露的问题,其实还有一种解决办法,即使用HMAC进行加密(Hash-based Message Authentication Code)。这种算法的核心思路是加密使用的key是从服务器端获取的,每一个用户的是不一样的。如果发生了泄露,那么也就是这一个用户的会被泄露,不会影响到全局。

    这里也留给大家一个思考点,如果恶意用户直接抓取了你的活动参与链接,也就是拿到了你计算后的hash值,那从技术的角度上说,我们还有没有其他可以提升恶意用户的违法成本呢?

     

    4.2 数据校验

     

    布隆过滤器

    布隆过滤器被广泛用于黑名单过滤、垃圾邮件过滤、爬虫判重系统以及缓存穿透问题。对于数量小,内存足够大的情况,我们可以直接用hashMap或者hashSet就可以满足这个活动需求了。但是如果数据量非常大,比如5TB的硬盘上放满了用户的参与数据,需要一个算法对这些数据进行去重,取得活动的去重参与用户数。这种时候,布隆过滤器就是一种比较好的解决方案了。

    布隆过滤器其实是基于bitmap的一种应用,在1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数,用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难,主要用于大数据去重、垃圾邮件过滤和爬虫url记录中。核心思路是使用一个bit来存储多个元素,通过这样的方式来减少内存的消耗。通过多个hash函数,将每个数据都算出多个值,存放在bitmap中对应的位置上。

    布隆过滤器的原理见下图所示:

    布隆过滤器原理示意

    上图所示的例子中,数据a、b、c经过三次hash映射后,对应的bit位都是1,表示这三个数据已经存在了。而d这份数据经过映射后有一个结果是0,则表明d这个数据一定没有出现过。布隆过滤器存在假阳率(判定存在的元素可能不存在)的问题,但是没有假阴率(判断不存在的原因可能存在)的问题。即对于数据e,三次映射的结果都是1,但是这份数据也可能没有出现过。

    误判率的数据公式如下所示:

    其中,p是误判率,n是容纳的元素,m是需要的存储空间。由公示可以看出,布隆过滤器的长度会直接影响误报率,布隆过滤器越长其误报率越小。哈希函数的个数也需要权衡,个数越多则布隆过滤器 bit 位置位 1 的速度越快,且布隆过滤器的效率越低;但是如果太少的话,则会导致误报率升高。

    参考文献

    https://mp.weixin.qq.com/s/fpgLeo2ba4WiVD0Dd24MFA

     

    在这里插入图片描述

    展开全文
  • Hash算法

    2021-01-13 22:19:54
    Hash算法 说到Hash(哈希),开发人员应该不陌生,比如Hash表是一种非常常用的数据结构,通过Hash表能够根据键值快速找到数据。哈希函数将文本(或其他数据)映射为整数,从而能够提高检索效率。 密码学中的Hash算法...

    Hash算法

    说到Hash(哈希),开发人员应该不陌生,比如Hash表是一种非常常用的数据结构,通过Hash表能够根据键值快速找到数据。哈希函数将文本(或其他数据)映射为整数,从而能够提高检索效率。

    密码学中的Hash算法和普通的Hash算法不是同一个概念,从安全的角度考虑,密码学中的Hash算法除了有普通Hash算法的特性之外,还有其他的一些特性。

    密码学Hash算法也通常称作摘要算法,是密码学中的基础算法,是现代密码学中的核心组成部分。2004年山东大学王小云教授发表论文,指出了MD5和SHA-1两种Hash算法的漏洞,引起了业界的恐慌,足以说明Hash算法的重要性。密码学中有很多密码学Hash算法,比如MD5、SHA-1、SHA128、SHA256、SHA512等,国家商用密码中也有一个Hash算法SM3。我们不用理解Hash算法的内部实现原理,更应该关注其特性、用途以及使用中需要注意的点。

    在密码学中,Hash函数将任意大小(例如文本消息)的输入数据转换为固定大小(例如256位)的结果,这称为哈希值(或哈希码、消息摘要)。比如SHA-256和SHA3-256,可将任意输入转换为256位输出。

    在这里插入图片描述

    密码学Hash算法示例

    我们可以借助 OpenSSL 附带的命令行工具计算字符串"hello"的SHA256算法哈希值:

    $ echo -n “hello” | openssl sha256
    (stdin)= 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
    也可以借助开源国密算法库 GmSSL 的命令行工具,计算 SM3 算法的哈希值:

    $ echo -n “hello” | gmssl dgst -sm3
    (stdin)= becbbfaae6548b8bf0cfcad5a27183cd1be6093b1cceccc303d9c61d0a645268

    密码学Hash算法的特点

    设计一个Hash算法并不难,但要设计一个能用于密码学上的Hash算法非常难,需要有非常深厚的数学和密码学功底。一个设计良好的密码学Hash算法需要具有如下特点:

    确定性:相同的消息总是能得到同样的摘要值,特定的Hash算法,不管消息长度是多少,最终的摘要值长度是相同的。
    快速:计算任何给定消息的哈希值应该很快。
    难以分析:对输入消息的微小修改将完全改变输出哈希值。
    不可逆:通过摘要值很难逆向计算出原始消息,Hash算法具备单向性,摘要值是不可逆的,这也是非常重要的特性。为了逆向计算出原始消息,唯一的方法就是采用暴力攻击、字典攻击、彩虹表
    没有碰撞:找到两个具有相同哈希值的不同消息非常困难(或几乎不可能)。
    注意第5点,没有冲突是一种理想情况,考虑到最后生成的摘要值只有固定的有限位,必然存在不同消息具有相同哈希值的情况,但这里强调的是找到它们非常困难。后面谈到 MD5 的破解将会谈到。

    密码学Hash算法的用途

    密码学哈希算法用途很广,下面看看最常见的几个用途:

    文档/消息完整性
    验证文件/文档/消息的完整性。比如我们在网站下载文件时,网站通常会给出文件的 MD5 值或 SHA256 值。

    在这里插入图片描述
    通过对比哈希值,我们可以确保自己下载的文件和服务器上是一致的。

    存储密码
    这个开发人员应该很熟悉,当然也有菜鸟程序员直接往数据库中存储明文密码(从曝光的拖库攻击事件中,发现这么做的公司还不少)。开发人员通常不将纯文本密码保存在数据库中,而保存密码散列值或从密码派生的更复杂的值(例如,Scrypt派生的值)。

    在这里插入图片描述
    上面的示例来自现代 Linux 系统中的 /etc/shadow 文件,里面的密码存储为带盐的多轮SHA-512哈希值。

    采用这种解决方案,即使数据库或数据文件泄露,攻击者也无法通过口令的摘要值计算出原始口令,攻击者很难伪造用户进行攻击。

    系统具体如何校验用户密码呢?大概的步骤如下:

    用户输入用户名和口令登录。

    系统使用Hash算法计算出口令的摘要值。

    系统使用用户名和摘要值在数据库表中进行检索,一旦匹配到就说明该用户输入的口令是正确的。

    生成唯一ID

    生成特定文档/消息的(几乎)唯一ID。密码散列函数几乎根据文档的内容唯一地标识文档。当然从理论上讲,任何哈希函数都可能发生碰撞,但是这种碰撞不太可能发生,因此大多数系统(如Git)都假定它们使用的哈希函数不存在碰撞。

    这样的示例有 git 版本管理系统,其每一个提交通过一个哈希值标记。

    在这里插入图片描述
    这个特性还可以用来比较大文件,通过计算两个文件的Hash值,比较Hash值就可以判断两个文件是否相同。

    伪随机数生成
    伪随机数生成和密钥派生。生成随机序列的一种简单方法是这样的:从随机种子开始(例如键盘单击或鼠标移动)。附加“1”并计算散列以获得第一个随机数,然后附加“2”并计算散列获得第二个随机数,以此类推。

    工作量证明算法
    主要用在比特币,也就是俗称的挖矿。大多数工作量证明算法计算的哈希值大于特定值(称为挖掘难度)。为了找到此哈希值,矿工计算了数十亿个不同的哈希,并采用其中的最大哈希值,因为哈希数是不可预测的。例如,工作证明问题的定义如下:找到一个数字p,以使hash(x + p)的开头保留10个零位。

    Hash算法一览

    在过去,软件开发人员设计了许多密码哈希算法。其中有些已证明不安全(例如 MD5 和 SHA1 ),有些仍被认为是安全的(例如 SHA-2 、SHA-3 和 BLAKE2 )。下面让我们了解一下目前广泛使用的加密哈希算法。

    MD5
    MD5是一种比较常用的Hash算法,摘要值长度固定是 128 比特, MD5 算法目前被证明已经不安全了,不建议使用。

    SHA-1
    SHA-1算法类似于MD5算法,输出的长度固定是160比特。SHA-1算法在严谨的加密学中已经被证明是不安全的,但在实际中仍然有使用,因为在现实世界中要构造出碰撞还是非常困难的,需要经过大量的运算。当然在新的应用中要避免使用。

    SHA-2
    SHA-2是一系列强大的密码哈希函数:SHA-256(256位哈希)、SHA-384(384位哈希)、SHA-512(512位哈希)等。SHA-2算法是目前建议使用的Hash算法,在美国作为官方加密标准发布。

    从设计上讲,哈希输出的位数越多,一般而言具有更高的安全性和更高的抗冲突性。通常,128位哈希函数要比256位哈希函数要弱,而256位哈希函数要比512位哈希函数弱。因此,SHA-512比SHA-256更强大。

    SHA-3
    SHA-3算法并不是为了取代SHA-2算法,而是一种在设计上和SHA-2完全不同的算法,主要有四种算法,分别是SHA3-256、SHA3-512、SHA3-224、SHA3-384,输出的长度分别是256比特、512比特、224比特、384比特。

    在相同的哈希长度下,SHA-3比SHA-2更安全。例如,SHA3-256比SHA-256提供更多的加密强度。

    SHA-3被认为是高度安全的,在美国作为官方推荐的加密标准发布。

    SM3
    SM3是国密密码杂凑算法标准,由国家密码管理局于2010年12月公布。SM3的输出杂凑值长度为256比特(32字节),与国际标准SHA-256等长。SM3设计安全性为128比特,安全性与256比特椭圆曲线/SM2、SM4/SMS4、AES-128等同。

    小知识:王小云院士真的破解了 MD5 吗?

    2004年8月,在美国加州圣巴巴拉召开的国际密码大会上,王小云宣读了自己和研究团队对于MD4、MD5、HAVAL-128和RIPEMD四个国际著名密码算法的破译结果。

    这被认为是2004年密码学界最具突破性的结果,堪称学术界的一场强烈地震。当年国际密码大会总结报告上写道:我们该怎么办?MD5被重创了,它即将从应用中淘汰。

    2005年,美国《新科学家》杂志在一篇文章中,用了颇具震撼力的标题——《崩溃!密码学的危机》,报道了王小云团队花10年时间取得的学术成果。

    所谓的“破解”其实误导了很多人,并不是说扔给王小云一个 MD5 散列值,然后她马上就能算出一个原文来。从密文推算出明文理论上是不可能的,所以王小云的研究成果并不能通过 MD5 的散列值逆向推算出明文。即给定 Hash 值,王小云不能逆向计算出 M。

    MD5(M)=Hash
    其中 M 指密码的明文,Hash 表示密码散列后的密文。

    实际上,王小云的研究成果如下:

    MD5(M1)=MD5(M2)
    即给定消息 M1,能够计算获取 M2,使得 M2 产生的散列值与 M1 产生的散列值相同。如此,MD5 的抗碰撞性就已经不满足了,使得 MD5 不再是安全的散列算法。这样一来,MD5 用于数字签名将存在严重问题,因为可以篡改原始消息,而生成相同的 Hash 值。

    这里,简单地用王教授的碰撞法给大家举个简单的例子。假如用户 A 给 B 写了个 Email 内容为 Hello,然后通过王教授的碰撞法,可能得到 Fuck 这个字符串的摘要信息和 Hello 这个字符串产生的摘要信息是一样的。如果 B 收到的 Email 内容为 Fuck,经过 MD5 计算后的,B 也将认为 Email 并没有被修改!但事实并非如此。

    王小云院士的研究报告表明,MD4,MD5,HAVAL-128,RIPEMD 和 SHA-1 均已被证实存在上面的漏洞,即给定消息 M1,能够找到不同消息 M2 产生相同的散列值,即产生 Hash 碰撞。

    展开全文
  • Hash 算法

    2021-02-23 20:24:22
    Hash 算法一、什么是 Hash 算法二、Hash 算法有什么特点三、Hash 算法有哪些四、Hash 算法碰撞五、加盐防碰撞 一、什么是 Hash 算法 散列算法Hash Algorithm),又称哈希算法,杂凑算法,是一种从任意文件中创造小...

    一、什么是 Hash 算法

    散列算法(Hash Algorithm),又称哈希算法,杂凑算法,是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。因此,当原有文件发生改变时,其标志值也会发生改变,从而告诉文件使用者当前的文件已经不是你所需求的文件。

    Hash 算法能将将任意长度的二进制明文映射为较短的二进制串的算法,并且不同的明文很难映射为相同的 Hash 值。

    也可以理解为空间映射函数,是从一个非常大的取值空间映射到一个非常小的取值空间,由于不是一对一的映射,Hash 函数转换后不可逆,意思是不可能通过逆操作和 Hash 值还原出原始的值。

    散列方法的主要思想是根据结点的关键码值来确定其存储地址:以关键码值K为自变量,通过一定的函数关系h(K)(称为散列函数),计算出对应的函数值来,把这个值解释为结点的存储地址,将结点存入到此存储单元中。检索时,用同样的方法计算地址,然后到相应的单元里去取要找的结点。通过散列方法可以对结点进行快速检索。散列(hash,也称“哈希”)是一种重要的存储方式,也是一种常见的检索方法。

    二、Hash 算法有什么特点

    Hash 值又称为指纹或者摘要,具有以下特点:

    正向快速:给定明文和 Hash 算法,在有限时间和有限资源内能计算得到 Hash 值。
    逆向困难:给定 Hash 值,在有限时间内很难逆推出明文。
    输入敏感:原始输入信息发生任何变化,新的 Hash 值都应该出现很大变化。
    冲突避免:很难找到两段内容不同的明文,使得它们的 Hash 值一致。

    三、Hash 算法有哪些

    常见 Hash 算法有 MD5 和 SHA 系列,目前 MD5 和 SHA1 已经被破解,一般推荐至少使用 SHA2-256 算法。

    下面我们来看具体写一个 Hash 函数需要注意些什么,首先要明白 Hash 函数是把一个大范围映射到一个小范围,目的往往是为了节省空间,使得数据容易保存,另外 Hash 函数也会应用于查找上。

    四、Hash 算法碰撞

    稍微想一下就可以发现,既然输入数据长度不固定,而输出的哈希值却是固定长度的,这意味着哈希值是一个有限集合,而输入数据则可以是无穷多个,那么建立一对一关系明显是不现实的。所以“碰撞”是必然会发生的,所以一个成熟的哈希算法会有较好的抗冲突性,同时在实现哈希表的结构时也要考虑到哈希冲突的问题。

    比如“666”经过 Hash 后是“fae0b27c451c728867a567e8c1bb4e53”,相同 Hash 算法得到的值是一样的。比如 WiFi 密码如果是 8 位纯数字的话,顶多就是 99999999 种可能性,破解这个密码需要做的就是提前生成好 0 到 1 亿数字的 Hash 值,然后做 1 亿次布尔运算(就是 Bool 值判断,0 或者 1),而现在普通 I5 四核 CPU 每秒能到达 200 亿次浮点数计算,做 1 亿次布尔运算也就是秒级别的时间就破解了。

    所以密码尽量不要用纯数字,因为根本没有任何安全性。

    五、加盐防碰撞

    对数字内容进行 Hash 运算,获取唯一的摘要值来指代原始完整的数字内容,利用 Hash 函数的抗碰撞性来确保内容未被篡改。

    常用于用户名和密码来确保用户信息安全,为了防止攻击会采用加盐的方法,就是原来的明文加上一个随机数之后的 Hash 值,Hash 值和盐会保存在两个地方,只要不是同时泄漏就很难被破解。

    展开全文
  • hash算法

    2019-12-10 22:34:30
    大学期间大家对hash这个词语肯定最熟悉不过了 最简单的hash就是余数hash 在分布式系统中,分布式hash是为了解决因特网中的...一致性Hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1、...
  • 四、加密hash算法 五、查找hash算法 六、hash函数的分类 七、哈希函数的选择 八、hash冲突的解决办法 8.1开放定址法 8.2 再哈希法 8.3链地址法 8.4建立公共溢出区 九、如何自己手写一个hash算法 9.1加法...
  • 一致性hash算法

    2020-10-15 23:54:13
    文章目录一致性hash算法一、简介二、传统hash算法的问题三、一致性hash算法特点四、一致性hash算法设计五、一致性hash算法的java实现六、一致性hash算法的简单实现 一、简介 一致性hash算法是1997年由麻省理工学院...
  • 一致性Hash算法

    2020-06-28 17:33:47
    个人觉得一致性Hash算法相较普通Hash算法,重点就是引入了Hash环作为标准参照 一致性Hash算法解决的是数据落点问题,通过一致性Hash算法可以将数据均衡的分配到分布式环境下的多台服务器上,比如Redis缓存集群每台...
  • hash之一致性hash算法

    2019-07-30 11:41:55
    一致性hash算法的主要应用于分布式数据储存的场景下。 下面一步步解析为什么使用一致性hash算法: 以缓存为例 缓存的使用目的:提高数据访问性能,缓解数据库压力。(以空间换取时间) 互联网公司的分布式高并发系统...
  • Hash算法介绍

    2021-05-13 11:13:01
    Hash算法概述 散列算法(Hash Algorithm),又称哈希算法,杂凑算法,是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个...
  • HASH算法总结

    2020-11-03 15:24:19
    1、什么是Hash函数? Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射...2、Hash算法有什么特点? 一个优秀的 hash 算法,将能实现: 正向快速:给定明文和 hash 算法,
  • Hash算法和二叉树

    2020-04-10 20:40:14
    Hash算法有什么特点 1.哈希值是二进制值; 2.哈希值具有一定的唯一性; 3. 哈希值极其紧凑; 4. 要找到生成同一个哈希值的2个不同输入,在一定时间范围内,是不可能的。 哈希算法的应用 public int hashCode(){ ...
  • 一致性hash算法是在redis 分片中使用,hash槽在redis cluster(集群)中使用 hash槽: redis集群(cluster)并没有使用一致性hash算法,而是使用hash槽(slot)这个概念, 因为一致性hash算法对于数据的分布,节点...
  • hash算法详解

    万次阅读 多人点赞 2018-05-09 12:36:53
    你知道HashMap中hash方法的具体实现吗?你知道HashTable、ConcurrentHashMap中hash方法的实现以及原因吗?你知道为什么要这么实现吗?你知道为什么JDK 7和JDK 8中hash方法实现的不同以及区别吗?如果你不能很好的...
  • Hash算法和Hash表简述

    2019-09-30 14:09:34
    Hash算法 hash,即散列,是指把任意长度的输入,通过hash算法,变成固定长度的输出,输出的就是散列值。 散列过程是一个压缩过程,得到的散列值占用的空间小于原来的输入。 不同的输入可能会导致相同的散列值,这...
  • Hash算法总结

    万次阅读 多人点赞 2017-04-18 11:07:21
    Hash是什么,它的作用先举个例子。我们每个活在世上的人,为了能够参与各种社会活动,都需要一个用于识别自己的标志。也许你觉得名字或是身份证就足以代表你这个人,但是这种代表性非常脆弱,因为重名的人很多,...
  • 148_hash算法理解

    2020-01-27 14:48:10
    一个优秀的hash算法,有如下特点: 1.正向快速:给定明文和Hash算法,在有限时间和有限资源内能计算得到Hash值; 2.逆向困难:给定Hash值,在有限时间内很难(基本不可能)逆推出明文; 3.输入敏感:原始输入信息...
  • Hash算法与摘要

    2021-05-06 22:40:07
    hash算法与摘要 hash算法是一个空间到另一个空间的映射 hash算法又称摘要算法,可以将任意数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。 求模算法作为一种不可逆的计算方法,成为了...
  • 一、Hash的定义? Hash:一般翻译做散列,或音译为哈希。(可能这么叫好听,哈希=散列) 是把任意长度的输入(又叫做预映射pre-...Hash算法可以将一个数据转换为一个标志,这个标志和源数据的每一个字节都有十分紧密的
  • Hash算法与加密算法对比

    千次阅读 2018-05-31 11:09:00
    转载自:https://blog.csdn.net/lucky_greenegg/article/details/51897647HASH 算法是一种消息摘要算法,不是一种加密算法,但由于其单向运算,具有一定的不可逆性,成为加密算法中的一个构成部分,完整的加密机制不...
  • 浅析Hash算法

    千次阅读 2016-07-13 15:04:49
    HASH 算法是一种消息摘要算法,不是一种加密算法,但由于其单向运算,具有一定的不可逆性,成为加密算法中的一个构成部分,完整的加密机制不能仅依赖 HASH 算法。 哈希算法是将目标文本转换成具有相同长度的、不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 101,006
精华内容 40,402
关键字:

hash算法的特点