MD5即Message-Digest Algorithm 5(信息摘要算法5),是计算机广泛使用的散列算法之一。经MD2、MD3和MD4发展而来,诞生于20世纪90年代初。用于确保信息传输完整一致。虽然已被破解,但仍然具有较好的安全性,加之可以免费使用,所以仍广泛运用于数字签名、文件完整性验证以及口令加密等领域。
算法原理:
散列算法得到的结果位数是有限的,比如MD5算法计算出的结果字长为128位,意味着只要我们穷举2^128次,就肯定能得到一组碰撞,下面让我们来看看一个真实的碰撞案例。我们之所以说MD5过时,是因为它在某些时候已经很难表现出散列算法的某些优势——比如在应对文件的微小修改时,散列算法得到的指纹结果应当有显着的不同,而下面的程序说明了MD5并不能实现这一点。
而诸如此类的碰撞案例还有很多,上面只是原始文件相对较小的一个例子。事实上现在我们用智能手机只要数秒就能找到MD5的一个碰撞案例,因此,MD5在数年前就已经不被推荐作为应用中的散列算法方案,取代它的是SHA家族算法,也就是安全散列算法(Secure Hash Algorithm,缩写为SHA)。
SHA实际包括有一系列算法,分别是SHA-1、SHA-224、SHA-256、SHA-384以及SHA-512。而我们所说的SHA2实际是对后面4中的统称。各种SHA算法的数据比较如下表,其中的长度单位均为位:
MD5和SHA1,它们都有4个逻辑函数,而在SHA2的一系列算法中都采用了6个逻辑函数。
以SHA-1为例,算法包括有如下的处理过程:
和MD5处理输入方式相同
经过添加位数处理的明文,其长度正好为512位的整数倍,然后按512位的长度进行分组,可以得到一定数量的明文分组,我们用Y 0 ,Y 1 ,……Y N-1 表示这些明文分组。对于每一个明文分组,都要重复反复的处理,这些与MD5都是相同的。
而对于每个512位的明文分组,SHA1将其再分成16份更小的明文分组,称为子明文分组,每个子明文分组为32位,我们且使用M[t](t= 0, 1,……15)来表示这16个子明文分组。然后需要将这16个子明文分组扩充到80个子明文分组,我们将其记为W[t](t= 0, 1,……79),扩充的具体方法是:当0≤t≤15时,Wt = Mt;当16≤t≤79时,Wt = ( W t-3 ⊕ W t-8 ⊕ W t-14 ⊕ W t-16 ) <<< 1,从而得到80个子明文分组。
所谓初始化缓存就是为链接变量赋初值。前面我们实现MD5算法时,说过由于摘要是128位,以32位为计算单位,所以需要4个链接变量。同样SHA-1采用160位的信息摘要,也以32位为计算长度,就需要5个链接变量。我们记为A、B、C、D、E。其初始赋值分别为:A = 0x67452301、B = 0xEFCDAB89、C = 0x98BADCFE、D = 0x10325476、E = 0xC3D2E1F0。
如果我们对比前面说过的MD5算法就会发现,前4个链接变量的初始值是一样的,因为它们本来就是同源的。
经过前面的准备,接下来就是计算信息摘要了。SHA1有4轮运算,每一轮包括20个步骤,一共80步,最终产生160位的信息摘要,这160位的摘要存放在5个32位的链接变量中。
在SHA1的4论运算中,虽然进行的就具体操作函数不同,但逻辑过程却是一致的。首先,定义5个变量,假设为H0、H1、H2、H3、H4,对其分别进行如下操作:
(A)、将A左移5为与 函数的结果求和,再与对应的子明文分组、E以及计算常数求和后的结果赋予H0。
(B)、将A的值赋予H1。
(C)、将B左移30位,并赋予H2。
(D)、将C的值赋予H3。
(E)、将D的值赋予H4。
(F)、最后将H0、H1、H2、H3、H4的值分别赋予A、B、C、D
这一过程表示如下:
而在4轮80步的计算中使用到的函数和固定常数如下表所示:
经过4轮80步计算后得到的结果,再与各链接变量的初始值求和,就得到了我们最终的信息摘要。而对于有多个明文分组的,则将前面所得到的结果作为初始值进行下一明文分组的计算,最终计算全部的明文分组就得到了最终的结果。
㈡ SHA1、SHA2安全hash算法
sha(secure hash algorithm)安全sha算法,对小于2^64位的消息进行算法处理输出消息摘要。并且消息摘要无法复原。常见的sha算法有sha1、sha2
sha1输出的是160位的消息在摘要 sha2输出的是256位的消息摘要。sha2的碰撞的概率比sha1要低,因为sha2有2^256种组合sha1有2^160种组合。
sha的实现原理与 md5实现原理 在信息填充(补位),扩展长度的处理是相同的,在数据处理,输出长度是不同的。
数据完整性校验例如ssl的身份认证等
㈢ 安全的哈希函数中,函数可以是双向的吗
安全的哈希函数中,函数可以是双向的。
hash就是找到一种数据内容和数据存放地址之间的映射关系了解了hash基本定义,就不能不提到一些着名的hash算法,MD5和SHA1可以说是目前应用最广泛的Hash算法,而它们都是以MD4为基础设计的。
哈希函数的特点:
哈希防碰撞用处是保证上传和下载的数据是一样的,就是改一点点出来的结果差很多。举个例子,你输入的信息是一部《红楼梦》(当然电脑识别出来就是0和1),然后你在红楼梦的第100页的第五句话把一个逗号改成句号,然后输出的hash值就完全不同了。这就是哈希函数一个非常重要的特性。
㈣ 哈希的算法是什么
哈希算法是一个广义的算法,也可以认为是一种思想,使用Hash算法可以提高存储空间的利用率,可以提高数据的查询效率,也可以做数字签名来保障数据传递的安全性。所以Hash算法被广泛地应用在互联网应用中。
哈希算法也被称为散列算法,Hash算法虽然被称为算法,但实际上它更像是一种思想。Hash算法没有一个固定的公式,只要符合散列思想的算法都可以被称为是Hash算法。
特点:
加密哈希跟普通哈希的区别就是安全性,一般原则是只要一种哈希算法出现过碰撞,就会不被推荐成为加密哈希了,只有安全度高的哈希算法才能用作加密哈希。
同时加密哈希其实也能当普通哈希来用,Git 版本控制工具就是用 SHA-1 这个加密哈希算法来做完整性校验的。一般来讲越安全的哈希算法,处理速度也就越慢,所以并不是所有的场合都适合用加密哈希来替代普通哈希。
㈤ 平方哈希算法怎么弄题目见下
Hash,一般翻译做“散列”,也有直接音译为”哈希“的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系
㈥ 2.哈希加密 & base64加密
一、哈希HASH
哈希(散列)函数 MD5 SHA1/256/512 HMAC
Hash的特点:
1.算法是公开的
2.对相同数据运算,得到的结果是一样的
3.对不同数据运算,如MD5得到的结果是128位,32个字符的十六进制表示,没法逆运算
1.MD5加密
MD5加密的特点:
不可逆运算
对不同的数据加密的结果是定长的32位字符(不管文件多大都一样)
对相同的数据加密,得到的结果是一样的(也就是复制)。
抗修改性 : 信息“指纹”,对原数据进行任何改动,哪怕只修改一个字节,所得到的 MD5 值都有很大区别.
弱抗碰撞 : 已知原数据和其 MD5 值,想找到一个具有相同 MD5 值的数据(即伪造数据)是非常困难的.
强抗碰撞: 想找到两个不同数据,使他们具有相同的 MD5 值,是非常困难的
MD5 应用:
一致性验证:MD5将整个文件当做一个大文本信息,通过不可逆的字符串变换算法,产生一个唯一的MD5信息摘要,就像每个人都有自己独一无二的指纹,MD5对任何文件产生一个独一无二的数字指纹。
那么问题来了,你觉得这个MD5加密安全吗?其实是不安全的,不信的话可以到这个网站试试:md5破解网站。可以说嗖地一下就破解了你的MD5加密!
2.SHA加密
安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。当让除了SHA1还有SHA256以及SHA512等。
二、base64加密
1.Base64说明
描述:Base64可以成为密码学的基石,非常重要。
特点:可以将任意的二进制数据进行Base64编码
结果:所有的数据都能被编码为并只用65个字符就能表示的文本文件。
65字符:A~Z a~z 0~9 + / =
对文件进行base64编码后文件数据的变化:编码后的数据~=编码前数据的4/3,会大1/3左右。
2.命令行进行Base64编码和解码
编码:base64 123.png -o 123.txt
解码:base64 123.txt -o test.png -D
2.Base64编码原理
1)将所有字符转化为ASCII码;
2)将ASCII码转化为8位二进制;
3)将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位;
4)统一在6位二进制前补两个0凑足8位;
5)将补0后的二进制转为十进制;
6)从Base64编码表获取十进制对应的Base64编码;
处理过程说明:
a.转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。
b.数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
c.不断进行,直到全部输入数据转换完成。
㈦ 什么是安全散列算法SHA256
安全散列算法SHA(Secure Hash Algorithm)是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数,包括 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等变体。主要适用于数字签名标准(DigitalSignature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。下面以 SHA-1为例,介绍该算法计算消息摘要的原理。
对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。
SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要。
一、术语和概念
(一)位(Bit),字节(Byte)和字(Word)
SHA1始终把消息当成一个位(bit)字符串来处理。本文中,一个“字”(Word)是32位,而一个“字节”(Byte)是8位。比如,字符串“abc”可以被转换成一个位字符串:01100001 01100010 01100011。它也可以被表示成16进制字符串:0x616263.
(二)运算符和符号
下面的逻辑运算符都被运用于“字”(Word)
X^Y = X,Y逻辑与
X \/ Y = X,Y逻辑或
X XOR Y= X,Y逻辑异或
~X = X逻辑取反
X+Y定义如下:
字 X 和Y 代表两个整数 x 和y, 其中0 <= x < 2^32 且 0 <= y < 2^32. 令整数z= (x + y) mod 2^32. 这时候 0 <= z < 2^32. 将z转换成字Z,那么就是 Z = X + Y.
循环左移位操作符Sn(X)。X是一个字,n是一个整数,0<=n<=32。Sn(X)= (X<>32-n)
X<定义如下:抛弃最左边的n位数字,将各个位依次向左移动n位,然后用0填补右边的n位(最后结果还是32位)。X>>n是抛弃右边的n位,将各个位依次向右移动n位,然后在左边的n位填0。因此可以叫Sn(X)位循环移位运算
二、SHA1算法描述
在SHA1算法中,我们必须把原始消息(字符串,文件等)转换成位字符串。SHA1算法只接受位作为输入。假设我们对字符串“abc”产生消息摘要。首先,我们将它转换成位字符串如下:
01100001 0110001001100011
―――――――――――――
‘a’=97 ‘b’=98‘c’=99
这个位字符串的长度为24。下面我们需要5个步骤来计算MD5。
(一)补位
消息必须进行补位,以使其长度在对512取模以后的余数是448。也就是说,(补位后的消息长度)%512 = 448。即使长度已经满足对512取模后余数是448,补位也必须要进行。
补位是这样进行的:先补一个1,然后再补0,直到长度满足对512取模后余数是448。总而言之,补位是至少补一位,最多补512位。还是以前面的“abc”为例显示补位的过程。
原始信息:01100001 01100010 01100011
补位第一步:0110000101100010 01100011 1
首先补一个“1”
补位第二步:0110000101100010 01100011 10…..0
然后补423个“0”
我们可以把最后补位完成后的数据用16进制写成下面的样子
61626380 0000000000000000 00000000
00000000 0000000000000000 00000000
00000000 0000000000000000 00000000
00000000 00000000
现在,数据的长度是448了,我们可以进行下一步操作。
(二)补长度
所谓的补长度是将原始数据的长度补到已经进行了补位操作的消息后面。通常用一个64位的数据来表示原始消息的长度。如果消息长度不大于2^64,那么第一个字就是0。在进行了补长度的操作以后,整个消息就变成下面这样了(16进制格式)
61626380 0000000000000000 00000000
00000000 0000000000000000 00000000
00000000 0000000000000000 00000000
00000000 0000000000000000 00000018
如果原始的消息长度超过了512,我们需要将它补成512的倍数。然后我们把整个消息分成一个一个512位的数据块,分别处理每一个数据块,从而得到消息摘要。
(三)使用的常量
一系列的常量字K(0),K(1), ... , K(79),如果以16进制给出。它们如下:
Kt = 0x5A827999 (0<= t <= 19)
Kt = 0x6ED9EBA1 (20<= t <= 39)
Kt = 0x8F1BBCDC (40<= t <= 59)
Kt = 0xCA62C1D6 (60<= t <= 79).
(四)需要使用的函数
在SHA1中我们需要一系列的函数。每个函数ft (0 <= t <= 79)都操作32位字B,C,D并且产生32位字作为输出。ft(B,C,D)可以如下定义
ft(B,C,D) = (B ANDC) or ((NOT B) AND D) ( 0 <= t <= 19)
ft(B,C,D) = B XOR CXOR D (20 <= t <= 39)
ft(B,C,D) = (B ANDC) or (B AND D) or (C AND D) (40 <= t <= 59)
ft(B,C,D) = B XOR CXOR D (60 <= t <= 79).
(五)计算消息摘要
必须使用进行了补位和补长度后的消息来计算消息摘要。计算需要两个缓冲区,每个都由5个32位的字组成,还需要一个80个32位字的缓冲区。第一个5个字的缓冲区被标识为A,B,C,D,E。第二个5个字的缓冲区被标识为H0,H1, H2, H3, H4。80个字的缓冲区被标识为W0,W1,..., W79
另外还需要一个一个字的TEMP缓冲区。
为了产生消息摘要,在第4部分中定义的16个字的数据块M1,M2,..., Mn
会依次进行处理,处理每个数据块Mi 包含80个步骤。
在处理每个数据块之前,缓冲区{Hi} 被初始化为下面的值(16进制)
H0 = 0x67452301
H1 = 0xEFCDAB89
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0.
现在开始处理M1, M2,... , Mn。为了处理 Mi,需要进行下面的步骤
(1). 将Mi 分成 16 个字 W0, W1, ... , W15,W0 是最左边的字
(2). 对于t = 16 到 79 令 Wt = S1(Wt-3 XOR Wt-8XOR Wt- 14 XOR Wt-16).
(3). 令A = H0, B = H1, C = H2, D = H3, E = H4.
(4) 对于t = 0 到 79,执行下面的循环
TEMP = S5(A) +ft(B,C,D) + E + Wt + Kt;
E = D; D = C; C =S30(B); B = A; A = TEMP;
(5). 令H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.
在处理完所有的 Mn, 后,消息摘要是一个160位的字符串,以下面的顺序标识
H0 H1 H2 H3 H4.
对于SHA256、SHA384、SHA512。你也可以用相似的办法来计算消息摘要。对消息进行补位的算法完全是一样的。
三、SHA算法被破解了吗?
2013年9月10日美国约翰霍普金斯大学的计算机科学教授,知名的加密算法专家,Matthew Green被NSA要求删除他的一份关于破解加密算法的与NSA有关的博客。 同时约翰霍普金斯大学服务器上的该博客镜像也被要求删除。
加密算法专家,美国约翰霍普金斯大学教授Matthew Green
但当记者向该大学求证时,该校称从未收到来自NSA的要求要删除博客或镜像的资料,但记者却无法在原网址再找到该博客。幸运的是,从谷歌的缓存可以找到该博客。该博客提到NSA每年花费2.5亿美元来为自己在解密信息方面获取优势,并列举了NSA的一系列见不得人的做法。
在BitcoinTalk上,已经掀起了一轮争论:到底SHA-2是否安全?
部分认为不安全的观点包括:
NSA制造了sha-2, 我们不相信NSA,他们不可能不留后门。
棱镜事件已经明白的告诉我们,政府会用一切可能的手段来监视与解密。
虽然有很多人会研究SHA-2,且目前没有公开的证据表明有漏洞。但没有公开这并不能代表就没有,因为发现漏洞的人一定更倾向于保留这个秘密来自己利用,而不是公布。
部分认为安全的观点包括:
SHA-2是应用广泛的算法,应该已经经历了实践的检验。
美国的对头中国和俄国都有很多杰出的数学家,如果有问题的话,他们肯定已经发现了。
如果真的不安全,世界上安全的东西就太少了,我不能生活在提心吊胆里,所以我选择相信安全。
㈧ 哈希(hash) - 哈希算法的应用
通过之前的学习,我们已经了解了哈希函数在散列表中的应用,哈希函数就是哈希算法的一个应用。那么在这里给出哈希的定义: 将任意长度的二进制值串映射为固定长度的二进制值串,这个映射规则就是哈希算法,得到的二进制值串就是哈希值 。
要设计一个好的哈希算法并不容易,它应该满足以下几点要求:
哈希算法的应用非常广泛,在这里就介绍七点应用:
有很多着名的哈希加密算法:MD5、SHA、DES...它们都是通过哈希进行加密的算法。
对于加密的哈希算法来说,有两点十分重要:一是很难根据哈希值反推导出原始数据;二是散列冲突的概率要很小。
当然,哈希算法不可能排除散列冲突的可能,这用数学中的 鸽巢原理 就可以很好解释。以MD5算法来说,得到的哈希值为一个 128 位的二进制数,它的数据容量最多为 2 128 bit,如果超过这个数据量,必然会出现散列冲突。
在加密解密领域没有绝对安全的算法,一般来说,只要解密的计算量极其庞大,我们就可以认为这种加密方法是较为安全的。
假设我们有100万个图片,如果我们在图片中寻找某一个图片是非常耗时的,这是我们就可以使用哈希算法的原理为图片设置唯一标识。比如,我们可以从图片的二进制码串开头取100个字节,从中间取100个字节,从结尾取100个字节,然后将它们合并,并使用哈希算法计算得到一个哈希值,将其作为图片的唯一标识。
使用这个唯一标识判断图片是否在图库中,这可以减少甚多工作量。
在传输消息的过程中,我们担心通信数据被人篡改,这时就可以使用哈希函数进行数据校验。比如BT协议中就使用哈希栓发进行数据校验。
在散列表那一篇中我们就讲过散列函数的应用,相比于其它应用,散列函数对于散列算法冲突的要求低很多(我们可以通过开放寻址法或链表法解决冲突),同时散列函数对于散列算法是否能逆向解密也并不关心。
散列函数比较在意函数的执行效率,至于其它要求,在之前的我们已经讲过,就不再赘述了。
接下来的三个应用主要是在分布式系统中的应用
复杂均衡的算法很多,如何实现一个会话粘滞的负载均衡算法呢?也就是说,我们需要在同一个客户端上,在一次会话中的所有请求都路由到同一个服务器上。
最简单的办法是我们根据客户端的 IP 地址或会话 ID 创建一个映射关系。但是这样很浪费内存,客户端上线下线,服务器扩容等都会导致映射失效,维护成本很大。
借助哈希算法,我们可以很轻松的解决这些问题:对客户端的 IP 地址或会话 ID 计算哈希值,将取得的哈希值域服务器的列表的大小进行取模运算,最后得到的值就是被路由到的服务器的编号。
假设有一个非常大的日志文件,里面记录了用户的搜索关键词,我们想要快速统计出每个关键词被搜索的次数,该怎么做呢?
分析一下,这个问题有两个难点:一是搜索日志很大,没办法放到一台机器的内存中;二是如果用一台机器处理这么大的数据,处理时间会很长。
针对这两个难点,我们可以先对数据进行分片,然后使用多台机器处理,提高处理速度。具体思路:使用 n 台机器并行处理,从日志文件中读出每个搜索关键词,通过哈希函数计算哈希值,然后用 n 取模,最终得到的值就是被分配的机器编号。
这样,相同的关键词被分配到了相同的机器上,不同机器只要记录属于自己那部分的关键词的出现次数,最终合并不同机器上的结果即可。
针对这种海量数据的处理问题,我们都可以采用多机分布式处理。借助这种分片思路,可以突破单机内存、CPU等资源的限制。
处理思路和上面出现的思路类似:对数据进行哈希运算,对机器数取模,最终将存储数据(可能是硬盘存储,或者是缓存分配)分配到不同的机器上。
你可以看一下上图,你会发现之前存储的数据在新的存储规则下全部失效,这种情况是灾难性的。面对这种情况,我们就需要使用一致性哈希算法。
哈希算法是应用非常广泛的算法,你可以回顾上面的七个应用感受一下。
其实在这里我想说的是一个思想: 用优势弥补不足 。
例如,在计算机中,数据的计算主要依赖 CPU ,数据的存储交换主要依赖内存。两者一起配合才能实现各种功能,而两者在性能上依然无法匹配,这种差距主要是: CPU运算性能对内存的要求远高于现在的内存能提供的性能。
也就是说,CPU运算很快,内存相对较慢,为了抹平这种差距,工程师们想了很多方法。在我看来,散列表的使用就是利用电脑的高计算性能(优势)去弥补内存速度(不足)的不足,你仔细思考散列表的执行过程,就会明白我的意思。
以上就是哈希的全部内容