精华内容
下载资源
问答
  • 常用的三种散列算法

    千次阅读 2020-08-29 11:40:33
    研发,是一种安全散列算法,对于长度小于2^64位的消息,SHA-1会产生一个160位的消息摘要。 SHA-256(Secure Hash Algorithm 2):由美国国家安全局 (NSA) 研发,是SHA-2的一个分支,是一种安全散列算法,对于任意...
    • MD5(Message Digest Algorithm):对于长度小于2^64位的消息,会产生一个160位的消息摘要。
    • SHA-1(Secure Hash Algorithm 1):由美国国家安全局 (NSA)
      研发,是一种安全散列算法,对于长度小于2^64位的消息,SHA-1会产生一个160位的消息摘要。
    • SHA-256(Secure Hash Algorithm 2):由美国国家安全局 (NSA)
      研发,是SHA-2的一个分支,是一种安全散列算法,对于任意长度的消息,SHA-256都会产生一个256位的消息摘要。

    在这里插入图片描述

    展开全文
  • 赵润晓,男,1995年生,本科,E-mail:578562554@ 第1作者手机号码:180,E-mail:578562554@ 散列算法和Hash 函数 赵润晓1 1(华中科技大学物理学院 应用物理学1401班,武汉市中国430074 摘要中本文介绍了散列算法和Hash 函数...
  • 简单了解下有哪些常见散列函数,不涉及原理

    简单了解一下常见的几种散列算法?


    如果觉得对你有帮助,能否点个赞或关个注,以示鼓励笔者呢?!博客目录 | 先点这里

    • 前提概念
      • 好的哈希函数
    • MD5 与 SHA
      • MD5
      • SHA 家族
    • CRC
    • MurmurHash
    • times31/33
      • times33
      • times31

    前提概念


    好的哈希函数


    好的哈希函数

    好的哈希函数应该具备如下几种特性

    • One-way 单向性
      输出确定,且无法逆推出源数据,即单向散列函数
    • Collision-resistant 抗冲突性
      产生两个相同散列值的概率低
    • Avalanche effect 雪崩效应
      原始数据的微小改动,会导致散列值巨大的差异

    MD5 与 SHA


    MD5

    md5 摘要算法,又称 “MD5 Message-Digest Algorithm”, 是一种不可逆向的密码散列函数。

    特性

    • 任意长度的原始数据,都将输出定长为 128 bit 的散列值
    • 属于加密散列函数,计算较为耗费 CPU 资源

    SHA 家族

    SHA 家族的加密算法,又称 “Secure Hash Algorithm”, 是一个密码散列函数家族,发布了多个版本的 SHA 加密函数,如 SHA-0,SHA-1,SHA-2,SHA-3 等

    特性

    • 大部分仅支持 2^64 -1 的输入数据,根据不同的版本,有不同的位长,如 160,224,256,384,512 等,位数较长
      • sha-0,sha-1 输入不超过 2^64-1, 输出定长 160 bit

    对比

    • MD5 和 SHA 通常都用在安全加密领域,因为都涉及数字加密,所以计算量都比较大,都比较消费 CPU 资源
      在这里插入图片描述

    CRC


    CRC 算法 ("Cyclic Redundancy Check") ,又称循环冗余校验算法,是一种常用于通信链路检错,判断数据是否损坏的散列函数,但也不局限于此,它的基本原理是利用除法与余数的原理来做为错误侦测的

    我们进行通信时的网络信道并不总是可靠的。为了增加可靠性,我们需要在传输数据后加上一些冗余的码字。如果接收方能够通过它们直接纠正错误,那么我们就称之为纠错码(Error Correcting Code),而 CRC 就是一种优秀的检错码,因为 CRC 具有良好的雪崩效应,即单个 bit 发生改变,也会导致散列值发生较大的改变,所以得以在通讯领域广泛应用。

    原理

    • 计算CRC的过程,就是用一个特殊的“除法”,来得到余数,这个余数就是CRC,而这里的除数则是一种 “模二除法”
    • 通讯传送中,发送方会在原始数据末尾加上 CRC 检错码,并与接收方约定好 “除数 (多项式)”,最会得到余数 (CRC 值),接收方就会以收到的原始数据除以约定好的除数,看看最终的结果是否与 CRC 检错码一致

    在这里插入图片描述

    比如发送发传输了一段二进制数据,并附上 CRC 校验码。接收方就可以根据所接收到的二进制数据的 CRC 散列值与接收到的 CRC 检错码进行比对,如果不一致,就代表接收的数据可能在通讯传输过程中有缺失或错误

    特性

    • CRC 的协议有非常多种,比如 CCITT, MODBUS 等
    • CRC 根据多项式的不同也会产生不同长度的检错码 (散列值),比如 CRC-8,CRC-16,CRC-32,CRC-64, 分别对产生对应 8,16,32,64 位长度的检错码,具有一定的数据压缩映射能力

    代码


    MurmurHash


    MurmurHash 是一种非加密型的散列函数,相比加密型散列函数,速度更快,差值最大可以达到几十倍,所以更适用于一般场景的哈希检索操作。MurmurHash 经历过多个版本的迭代,并有多种变种,当前最新版是 MurmurHash3。
    且已被广泛应用在多种分布式系统中,比如 Redis, Kafka, Hbase, ElasticSearch

    特性

    • MurmurHash2 可以产生 32/64 bit 范围的散列值,MurmurHash3 可以产生 32/128bit 范围的散列值
    • MurmurHash 支持加盐,即支持加一个种子值,而获得不同的 hash 规律,可以防止哈希洪水攻击(Hash-Flooding Attack

    代码

        public static void main(String[] args) {
            HashFunction function = Hashing.murmur3_32();
            System.out.println(function.hashBytes("abcd".getBytes()).asInt());
            // output = 1139631978
        }
    
    • MurmurHash 的原理解析细节比较多,没看懂,就不贴了,这里是一个 Guava 提供的 murmur3 使用例子
    • murmur3 可以使用在一般的哈希值计算,比如短链系统等
    • redis-client-murmurhash
    • guava-murmurhash3

    MurmurHash3_最详细的介绍


    times31/33


    times33

    Times33 算法是一个简单的对 “字符串” 进行哈希的函数,又称 “DJB Hash Function” or “DJBX33A”

    原理

    • 对字符串 s 进行逐个字符遍历,每次循环乘以 33,并加上 s[i] 字符的 ascii 码 , 然后求和即可
    • 乘数是33, hash 初始值为 5381

    代码

        private static int times33(String s) {
            int hash = 5381;
    
            char[] val = s.toCharArray();
            for (int i = 0; i < s.length(); i++) {
                hash = ((hash << 5) + hash) + val[i];
            }
    
            // hash is a positive integer,[0,2^31-1]
            hash &= Integer.MAX_VALUE;
            return hash;
        }
    
    • a * 33 = a * 2^5 + a = a * 32 + a
    • hash &= 0x7fffffff 是为了获得 0 或 正整数,因为 Java 的 int 是有符号整数,只能表示 [0, 2^31 -1] 的整数

    why

    • 为什么取 33?
      • 并没有人给于一个比较充分的理由说明,不过通过对[1,256]数值的实验证明,偶数的哈希分布非常差,冲突较高,所以就剩下 128 个奇数,并不是 33 就是最佳的选项
      • 奇素数,哈希分布相比偶数更为良好
    • 初始值为什么是 5381?

    times31

    times31 其实是 Java String hashcode 函数所采用的算法,因其思想类似 times33, 但数值采用 31 ,所以被习惯性称之 times31

    原理

    • 原理与 times33 一致,仅仅是乘数和初始值的选择不一样
    • 乘数是 31,初始值是 0

    代码

        private static int times31(String s) {
            int hash = 0;
    
            char[] val = s.toCharArray();
            for (int i = 0; i < s.length(); i++) {
                hash = ((hash << 5) - hash) + val[i];
            }
            
            return hash;
        }
    
    • hash = ((hash << 5) - hash) + val[i] 等价于 hash = 31 * hash + val[i]
    • JDK 显式代码是 31 * hash, 是因为编译器会自行优化

    why

    • 为什么取 31
      31 和 33 都是奇素数,理由其实跟 times33 差不多,都是实验数据中,采取比较好的奇素数

    参考资料


    展开全文
  • 目前常见散列(Hash)算法

    千次阅读 2020-10-12 11:48:43
    目前常见散列(Hash)算法 算法名称 输出大小(bits) 内部大小 区块大小 长度大小 字符尺寸 碰撞情形 HAVAL 256/224/192/160/128 256 1024 64 32 是 MD2 128 384 128 No 8 大多数 MD4 128 128 512 64 ...

    目前常见的散列(Hash)算法

    算法名称输出大小(bits)内部大小区块大小长度大小字符尺寸碰撞情形
    HAVAL256/224/192/160/12825610246432
    MD2128384128No8大多数
    MD41281285126432
    MD51281285126432
    PANAMA256873625632
    RadioGatún任意长度58字3字1-64
    RIPEMD1281285126432
    RIPEMD-128/256128/256128/2565126432
    RIPEMD-160/320160/320160/3205126432
    SHA-01601605126432
    SHA-11601605126432有缺陷
    SHA-256/224256/2242565126432
    SHA-512/384512/384512102412864
    Tiger(2)-192/160/128192/160/1281925126464
    WHIRLPOOL5125125122568

    MD5消息摘要算法

    MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 中被加以规范。

    数据(如一段文字)运算变为另一固定长度值,是散列算法的基础原理。

    1996年后被证实存在弱点,可以被加以破解,对于需要高度安全性的资料,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞攻击,因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

    SHA家族

    安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的几率很高。

    SHA家族的算法,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布,是美国的政府标准,其分别是:

    SHA-0:1993年发布,当时称做安全散列标准(Secure Hash Standard),发布之后很快就被NSA撤回,是SHA-1的前身。
    SHA-1:1995年发布,SHA-1在许多安全协议中广为使用,包括TLS、GnuPG、SSH、S/MIME和IPsec,是MD5的后继者。但SHA-1的安全性在2010年以后已经不被大多数的加密场景所接受。2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1[1]。
    SHA-2:2001年发布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。SHA-2目前没有出现明显的弱点。虽然至今尚未出现对SHA-2有效的攻击,但它的算法跟SHA-1基本上仍然相似。
    SHA-3:2015年正式发布,由于对MD5出现成功的破解,以及对SHA-0和SHA-1出现理论上破解的方法,NIST感觉需要一个与之前算法不同的,可替换的加密散列算法,也就是现在的SHA-3。


    参考:https://zh.wikipedia.org/wiki/%E6%95%A3%E5%88%97%E5%87%BD%E6%95%B8

    展开全文
  • 散列算法

    千次阅读 2020-02-28 12:02:00
    散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的 数据,常见散列算法如 MD5、SHA 等。一般进行散列时最好提供一个 salt(盐),比如 加密密码“admin”,产生的散列值是“21232f...

    散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的 数据,常见的散列算法如 MD5、SHA 等。一般进行散列时最好提供一个 salt(盐),比如 加密密码“admin”,产生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一 些 md5 解密网站很容易的通过散列值得到密码“admin”,即如果直接对密码进行散列相 对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如用户名和 ID(即盐); 这样散列的对象是“密码+用户名+ID”,这样生成的散列值相对来说更难破解。

    散列时还可以指定散列次数,如 2 次表 示:md5(md5(str)):“new Md5Hash(str, salt, 2).toString()”

     

    展开全文
  • 散列函数、散列算法的Python语言实现
  • SHA散列算法

    2015-02-10 14:09:57
    SHA散列算法,可以非常方便的家密码散列成16进制数据。
  • MD5(散列算法)加密

    2013-07-05 22:30:32
    Rivest开发出技术上更为趋近成熟的md5算法。它在MD4的基础上增加了"安全-带子"(safety-belts)的概念。虽然MD5比MD4复杂度大一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法...
  • 散列算法(也叫:摘要算法)

    千次阅读 2021-03-05 10:24:36
    散列算法(也叫:摘要算法): 特点:① 无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。② 消息摘要看起来是“随机的”。这些比特看上去是胡乱的杂凑在一起的。③ 一般地,只要输入的消息不同,对其...
  • 常见的Hash算法有:MD5、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1等 二、Hash散列算法的特征 一个优秀的散列算法有几个重要的特征: 1.固定长度。散列函数可以接受任意大小的数据,并输出固定长度的散列值。比如MD5这个...
  • 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好奇心,所以趁着晚上没啥事,来...
  • 下面小编就为大家带来一篇散列算法与散列码(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 要使用一个特定的散列算法,可以用适当的构造器函数或new()来创建一个散列对象。不论使用哪个具体的算法,这些对象都使用相同的API。 1.1 散列算法 由于hashlib有OpenSSL提供“底层支持”,所以OpenSSL库提供的所有...
  • 安全散列算法SHA

    2017-07-19 18:47:06
    包含两种代码风格,一种是多宏函数操作(来自于老师);另一种多非宏函数函数操作(来自于我自己)。免费获取可联系:mailbox_krj@163.com
  • 密码散列算法

    千次阅读 2018-08-29 17:51:00
    密码散列算法函数password_xxxx 下面总结就是:bcrypt很安全,比md5和sha1安全,但是有速度的代价. Modern PHP原文 对于密码的生成和校验我们可以用PHP自带的一个工具进行password_ password_hash(string 需加密...
  • 散列算法与加密算法

    千次阅读 2017-04-20 09:15:50
    那么,首先要知道,什么是散列算法呢?产生一些数据片段(例如消息或会话项)的散列值的算法。例如,md5就是一种散列算法。软件开发中的散列函数或散列算法,又称哈希函数,英语:Hash Function,是一种从任何一种...
  • 密码学之Hash散列算法

    万次阅读 2018-11-11 11:47:02
        前言 在第一篇文章中已经有介绍区块链技术概念,我们知道区块链主要是由共识算法机制...密码学在区块链上应用比较多的主要有两种加密算法: 一是哈希散列算法,二是非对称加密算法。比如在前面的第三章...
  • 算法学习之散列算法

    2019-08-27 09:23:45
    Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的...
  • SHA(安全散列算法

    2010-02-26 17:01:18
    安全散列算法 SHA (即Secu re Hash AIgorlthm 安全散列算法)是一种 常用的数据加密算法.它由美国国家标准与技术局(NatlonaI InstItute of Standards and TechnoIogy)于1 993年作为联邦信息 处理标准公布(即第一代...
  • java MD5 散列算法计算

    千次阅读 2018-08-11 12:10:13
    java 散列算法,主要是通过MessageDigest 对象来实现,因此MD 和 SHA 系列可以共用一套代码   java 散列算法实现:依靠java 类库,(md5实现依据rfc1321 规范) java 加密类库实现,一般是在security 包下,有两个...
  • SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数
  • java的散列算法

    2011-05-13 08:45:42
    java的散列算法,java的散列算法,java的散列算法,java的散列算法,方便有需要的兄弟,java的散列算法java的散列算法java的散列算法java的散列算法
  • 在应用系统开发中,安全涉及的机密性、完整性、身份认证都需要散列算法或加解密算法的参与,C# 提供了常用的散列算法和加解密算法类,利用这些类,我们可以方便地实现所需功能。散列算法散列算法是把任意长度的输入...
  • C语言散列算法

    千次阅读 2019-06-07 11:01:43
    //散列算法:假如有n个数字 再输入m个数字求其在n中是否出现 或者出现的次数 #include<stdio.h> #define max 100010 int hashtable[max]={0}; /*void main() { int m,n; int x,y; int i; printf("请输入...
  • MD5不是加密算法,是散列算法

    千次阅读 2018-03-13 19:33:17
    MD5不是加密算法,是散列算法,或者叫做哈希算法。 加密算法一般指对称加密算法。 MD5哈希函数将任意长度的二进制字符串映射为固定长度的小型二进制字符串。加密哈希函数有这样一个属性:在计算上不大可能找到散...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 112,518
精华内容 45,007
关键字:

常见的散列算法