声明:本文源自对哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用的学习整理
1、哈希与加密的区别
(1)哈希:将目标文本转换成具有相同长度、不可逆的杂凑字符串(或称消息摘要);
(2)加密:将目标文本转换成具有不同长度、可逆的密文。
实际上,使用相同的hash算法,不论目标文本有多长,得到的结果长度固定;加密算法往往与目标文本的长度成正比。
2、哈希与加密的数学基础
(1)哈希算法:R=H(S)是多对一映射,多个不同的S可以通过哈希算法H得到相同的R。所以就不存在一个逆映射,使得一个R能得到唯一的S.
一个设计良好的hash算法很难从哈希结果中找到目标文本的碰撞,另外,好的哈希算法对于目标文本的改变极其敏感。
何为碰撞?对于hash算法H,如果S1不等于S2,但是H(S1)等于H(S2),则称S1与S2互为碰撞。
(2)加密算法:R=E(S,Ke)是一对一映射,一个S结合加密密钥Ke,仅能得到唯一的密文R。反之,一个R结合解密密钥Kd也仅能得到唯一的S。
一个设计良好的加密算法应该是一个“单向陷门函数”,单向陷门函数的特点:即使知道函数本身也很难由函数的值求得其对应的自变量。可是一旦知道了陷门,自变量就很容易计算出来。
简单的说,好的加密算法应该是很难从密文求得明文的,但是如果一旦密钥被知道了,就很容易由密文求得明文。
在加密算法防攻击这块,往往假设攻击者知道加密算法和密文,所以我们应该对明文和密钥进行保护。
3、哈希与加密在软件中的应用
(1)哈希和加密在软件开发中最常见的应用是数据保护。
为了实现数据保护,选择哈希or加密的基本原则:
如果被保护的数据仅用做比较验证,以后不需要还原成明文,使用哈希;
如果被保护的数据需要还原成明文,使用加密;
如果你忘记密码,网站让你输入新的密码,则用的应该是哈希;
如果你忘记密码,网站发给你原密码,则用的应该是加密;
(2)使用简单的一次哈希进行数据保护:
如上图,对注册进来的口令进行哈希算法的映射,将得到的杂凑字符串存入数据库;对每次登录的口令进行哈希算法的映射,将得到的杂凑字符串和数据库里的注册口令杂凑字符串比较,有相同的,则登录成功。
最常用的哈希算法是MD5和SHA1。