哈希算法学习

  • Post author:
  • Post category:其他




哈希算法基本含义:

密码学的基础,是理解数字签名和加密通信等技术的必要前提。

Hash:本意“切碎并搅拌”(一种食物名就叫hash);

哈希函数的运算结果就是哈希值,简称哈希;

哈希函数又称散列函数。



维基百科定义:

哈希函数给

一个任意大小的数据

生成

一个固定长度的数据


作为他的映射(

映射:一一对应

)。


一个可靠的哈希算法满足以下三点:

安全,给定数据M容易算出哈希值X,而给定X不能算出M(应该是一个单向算法);
独一无二·,两个不同的数据要拥有不同的哈希;
长度固定,给定一种哈希算法,不管是多大的数据,输出长度是固定的。

哈希的长度是固定的=>取值范围有限,but 输入数据的取值范围是无限的,

故而总会有两个不同的输入拥有相同的哈希,这种情况就叫作“

碰撞(collision)

”,所以,哈希函数的安全性是个相对概念。不同的哈希算法,哈希位数越多=>安全级别越高,“抗碰撞性”越好。



哈希函数的主要作用:

哈希的独一无二性保证了如果数据在存储或者传输中有丝毫损坏,其对应的哈希就会改变。哈希函数最常见的一个应用就是进行

完整性校验

(integrity check

数据无损坏

)。

eg:朋友给我传递一份数据,传完后,我有一份,他也有一份,如果两份数据的哈希值是一样的,那么这两份数据的内容就是一样的,即可以认为传递过程中数据没有损坏。

所以,哈希函数的

基本作用

就是给大数据算出一个

摘要性

的长度固定的字符串,也就是所谓的哈希。(哈希有很多别称,digest摘要/checksum校验值/fingerprint指纹,意思都差不多,即哈希可以用来代表数据本身)



哈希算法分类:

总体分为两大类

普通哈希



加密哈希(cryptographic hash function)

,两种算法之间没有特别明显的区别。例如MD5原本是设计出来做加密哈希的,但是之后由于计算机的发展, MD5出现碰撞的可能性就大了,所以目前 MD5 只能当普通哈希用,用来做数据校验。

一般哈希越长即越安全,CRC-32输出为32bit,即32位的二进制数,表示成16进制就是8位;MD5算法的哈希是32位16进制数(较为常见);SHA-256输出为256个bit,十六进制表示就是64位……

加密哈希和普通哈希的区别在于

安全性

,一般原则下当一种哈希算法出现过碰撞,就不被推荐成为加密哈希了。 同时加密哈希也能当普通哈希来用(Git 版本控制工具就是用 SHA-1 这个加密哈希算法来做完整性校验的),但一般来讲越安全的哈希算法,处理速度也就越慢,所以并不是所有的场合都适合用加密哈希来替代普通哈希的。

在密码学领域,将数据输入后输出一段谁也看不懂的数据的算法有两个,一个是哈希算法,另一个是加密算法,但这两个算法完全不同。



哈希算法和加密算法区别:

1.哈希算法的输出长度固定,加密算法的输出长度跟数据本身长度直接相关;

2.哈希不可以逆向运算出数据,加密算法的输出是要能够逆向运算出数据的。

(主要是强调加密哈希算法只是被用在加密过程中,但是它本身不是加密算法)

总而言之,哈希算法有很多种,通常认为长度越长安全性越高。

安全度低的是普通哈希算法,主要用来做完整性校验;

安全度高的被称为加密哈希算法,会被用在加密算法中。

所谓安全度高低都是相对概念,例如MD5曾属于加密哈希,但目前只能用于安全校验;从2017年开始,SHA-1算法生成的加密证书也会被各大浏览器拒绝,目前最为流行的加密算法是SHA-2,但是与SHA-1不同的是,SHA-2不是一种算法,而是一系列算法的统称,其中就包括之前提到的SHA-256。


现实中的应用:


网站注册

:当用户提交用户名密码时,用户名会被直接保存到网站的数据库中,但密码不是直接保存的,而是先转换成哈希,再将哈希保存到数据库中。

所以即使是公司后台管理人员,也拿不到用户的密码,且万一公司数据库泄露,用户密码也依旧是安全的。

而用户自己登录网站时,输入密码提交到服务器,服务器进行相同的哈希运算:输入数据不变=>哈希也不变=>登录成功。


区块链和加密货币

:比特币生成时就用到了SHA-256算法,POW也就是工作证明,用的也是这个算法。基本凡是涉及密码学的地方,或多或少都会用到哈希函数。


总结


哈希的基本作用:提供一个数据的摘要或指纹

通常使用场景:完整性校验

哈希算法有很多种,通常哈希越长安全性越高,安全度足够高的哈希(没有人能成功实现碰撞的哈希),才有资格被用在加密场合,即为加密哈希算法。