单向散列函数
1)目标
解决“完整性”问题
2)概念
单从字面上来看,我们先分两部分来理解:单向函数、散列函数
单向函数(One-way function)
从输入计算出结果比较容易,但是从结果推导出输入比较困难。
(单向函数可能根本不存在,但是……管它呢,我们要的是现在难以解决)
散列函数(Hash function)
又称散列算法、哈希函数,是把任意长度的输入通过散列算法,转变成固定长度的输出,该输出被称为散列值(或哈希值),通常为字母与数字的组合。
散列函数有一个特点,如果经过同一个散列函数计算,两个散列值是不相同的,那么这两个散列值的原始输入也是不相同的。但是由于输入值可以是任意长度的,而输出的长度又是固定的,所以势必会存在不同的输入经过散列函数得到相同散列值的情况,这被称为“散列值碰撞”。
“散列值碰撞”是一个必然事件,所以我们在衡量一个散列函数的好坏时,可以以散列值是否均匀分布来判断。当散列值分布不均匀(即一部分散列值出现概率高一部分出现概率低)时,我们称之为“碰撞攻击”。
单向散列函数
也称杂凑函数、Hash函数,一个单向散列函数既是一个单向函数,也是一个散列函数,简单来说它要符合两个条件:
- 从结果难以推导输入值
- 散列值碰撞概率低
那么如何衡量一个单向散列函数的好坏呢?这就是接下来要说的“雪崩效应”,
雪崩效应(Avalanche Effect): 是指输入数据的微小变换,就会导致输出数据的巨大变化,它是密码学算法常见的一个特点。严格的雪崩效应指的是,如果输入数据的一位反转,输出数据的每一位都有 50% 的概率会发生变化。
雪崩效应的数据变化概率越大,说明这个单向散列函数出现散列值碰撞的概率就越低。
3)常见算法:
-
MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,可以用来把不同长度的数据块进行暗码运算成一个128位的数值。
-
SHA(Secure Hash Algorithm),可以对任意长度的数据运算生成一个160位的数值。
-
MAC(Message Authentication Code):消息认证代码,是一种使用密钥的单向函数。
-
CRC(Cyclic Redundancy Check),循环冗余校验码,实现简单,检错能力强。