MD5和SHA-1

MD5和SHA-1都是咱们耳熟能详的术语了,不少人可能知道他们跟加密有关系,可是他们是怎么作到加密的,他们各自的特色又是什么。我来简单的讲一讲。java

MD5和SHA-1都被称做哈希(Hash)函数,用过Java语言的人对这个术语应该至关熟悉。Java类库里的Object类定义了hashCode这个函数,可是java的概念略有不一样。正式的哈希函数的定义是“把任意长度的数据计算成固定长度的数据”。也就是说函数的输入是任意长的,输出老是固定长度的。MD5和SHA-1是两种加密用哈希函数,MD5的返回值老是128bit的,SHA-1的返回值是160bit,都是固定长度。MD5若是按十六进制表示的话是32位十六进制的数,SHA-1是40位十六进制的数。算法

你能够用下面两个网站试用这两个函数,这样有个感性认识:数据库

MD5:http://md5-hash-online.waraxe.us/安全

SHA-1:http://sha1-hash-online.waraxe.us/函数

你输入任意长度的字符串,都会返回给你相应固定长度的十六进制返回值。这两个函数的返回值都被称为信息摘要(Message Digest,实际上MD就是Message Digest的缩写)。网站

 

那么两个函数为何能够用在加密上呢?由于他们都有这几个特性加密

  1. 都是“不可逆”的函数。不存在一个算法可以由哈希值倒算出原始信息。
  2. 对原始信息的任何一点改变都会致使结果的哈希值巨大的不一样。举个例子,假如原始数据是几百万字的文章,你在其中哪怕改动一个标点,计算出的哈希值都会有很大的变化。
  3. 运算代价是相对较低的。普通的AMDOpteron 2.2GHz的芯片,每秒能够计算出335MB数据的MD5值,能够计算192MB数据的SHA-1值。   参见https://en.wikipedia.org/wiki/SHA-1#Comparison_of_SHA_functions
  4. 相似于1,除非经过蛮力的穷举法,不然没法找到两段不一样的信息而有相同的哈希值。(这一点如今已被证实是不成立的了,请看后文)

 那么这两个函数的特色在哪里呢?特色在于都能“经过哈希值惟一标识原信息”。这个怎么讲,就是好比原始信息是A,我知道原始信息的哈希值Ha,若是我有另外一段信息,这段信息的哈希值也是Ha的话,我就能“以极大的可靠性”判定这另外一段信息就是A。也就是说哈希值能“惟一”标识原始信息。缘由是什么呢?url

  1. 两段不一样信息“碰巧”有着相同的哈希值的几率是很低的,对于MD5来讲是2的128次方分之一,这个数字是多小呢:太阳的表面积是6万亿平方千米,一个原子的截面积大约是1平方纳米,假设你是一个原子,把你放在56个太阳中任意一个的表面,这个几率是我在这56个太阳上随意指定一点,正好点中你的几率,而你是一个小小小的原子。对SHA-1来讲,这个几率就更低了。
  2. 那么有没有办法人工伪造一段信息正好有Ha这个哈希值呢?根据上面的1和4,这个可能性是很低的,要经过穷举法的巨大的运算量才能作到。

 

那么他们一般有什么应用呢?.net

1.      密码加密(很经常使用的一种用法)ip

好比我有一个网站,用户注册的时候会输入用户名密码,你们都知道若是密码是明文的方式存储在数据库里的话,若是这个数据泄漏或者内部人员做恶的话,会形成信息安全问题。因此通用的作法是把用户输入的密码作MD5或SHA-1的运算,把返回的固定长度的哈希值存储在数据库中。好比用户的密码是”bigcat”,实际存储在数据库中的值是它的SHA-1的值a748bf7fee2289b22d448ed8efde10a68f7d1cf9。由于这两个函数的“不可逆”性,因此任何人拿到这个hash值是没法知道用户的明文密码的。

2.      文件校验

在网上下载大尺寸文件的时候常见到网站同时会提供这个文件的MD5的值,它的做用是用户下载后能够在下载文件基础上计算MD5的值,若是和网站提供的MD5是相同的说明文件在下载过程当中没有损坏或者说文件没有被恶意网站修改。

相关文章
相关标签/搜索