hash(哈希,散列)

来源:互联网 发布:用mac编程 编辑:程序博客网 时间:2024/05/16 05:33

什么是hash:

Hash,一般翻译为散列,或直接音译为“哈希”,就是将任意长度的输入,通过一系列算法,变换成固定长度的输出,该输出就叫做hash(散列)值,该算法就叫做散列函数。
注意:
- 不同的输入可能得到同一散列值,即key1 != key2,但是f(key1) == f(key2)
- 不同的散列值肯定是不同的输入得到的,即f(key1) != f(key2),则key1 != key2

Hash的用处

利用上边提到的特点,hash的应用十分广泛,这里只介绍我们数据加密与数据校验。

数据校验

使用hash值,可以校验数据传输过程中是否被更改过。
具体实现是:在数据的发送方,对将要发送的数据应用散列函数计算hash值,并将计算结果与原始数据一同发送。在数据的接收方,同样的散列函数被再一次应用到接收到的数据上,计算出另外一个hash值,如果两次hash值不一致,就说明数据在传输过程中发生了错误。
有人可能会问,不是“不同的输入通过同一个hash函数也可能产生同一个hash值”吗,这种情况是会发生的,但是从计算机的角度来看,这种情况产生的几率很小。

数据加密

使用hash函数将密码转成hash值可以保证数据的安全性。
例如:我们可以使用hash函数将登陆某系统所需密码转换成hash值保存到数据库中,当用户登陆系统时,系统把用户输入的密码使用同一hash函数计算hash值后与数据库中保存的hash值比较,即可确定密码是否合法。通过这样的步骤,系统在不知道用户密码的明码的情况下就可以确定用户登陆系统的合法性,这样就避免用户的密码被具有系统管理员权限的用户知道,拿到数据库也无法确定用户密码是多少。

C#中常用的hash算法

SHA1:

//SHA1加密public string CreateSHA1Password(string password){    var algorithm = HashAlgorithm.Create("SHA1");    var hashByteArray = algorithm.ComputeHash(Encoding.UTF8.GetBytes(password));    return BitConverter.ToString(hashByteArray);}

MD5:

MD5算法具有以下特点:

1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。

2、容易计算:从原数据计算出MD5值很容易。

3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。

//MD5加密示例代码public string CreateMD5Password(string password){    var algorithm = HashAlgorithm.Create("MD5");    var hashByteArray = algorithm.ComputeHash(Encoding.UTF8.GetBytes(password));    return Convert.ToBase64String(hashByteArray);}
0 0