哈希算法基本含义:
密码学的基础,是理解数字签名和加密通信等技术的必要前提。
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也就是工作证明,用的也是这个算法。基本凡是涉及密码学的地方,或多或少都会用到哈希函数。
总结
哈希的基本作用:提供一个数据的摘要或指纹
通常使用场景:完整性校验
哈希算法有很多种,通常哈希越长安全性越高,安全度足够高的哈希(没有人能成功实现碰撞的哈希),才有资格被用在加密场合,即为加密哈希算法。