通俗的讲,哈希,就是将一段数据(无论长还是短)转成相对较短的一段数据,例如一个字符串,一个整数,亦或是一个文件。
而这种实现,是通过使用单向哈希函数来完成的。“单向” 意味着逆转它是困难的,或者实际上是不可能的。
用户注册的过程通常是这样的:
-
用户填写注册表单,包括密码这一项
-
web 脚本将所有的信息存储在数据库中
-
然而,密码在存储之前需要通过 hash 函数进行转化
-
最原始版本的密码并没有保存在任何地方,因此从技术上讲它消失了
用户登录的过程:
-
用户输入用户名和密码
-
脚本用同样的 hash 函数来转化密码
-
脚本找到记录在数据库中的用户信息,读取保存 hash 之后的密码
-
比较两者的值,如果匹配了就完成了登录
常用的hash算法有以下几种:
MD系列,SHA系列,MAC系列算法;
(1)MD5,全名Message Digest Algorithm 5,中文名为消息摘要算法第五版,是一种散列算法,而不是通常意义上的加密算法;主要是将文本等信息转换称简短的信息摘要,是不可逆的;
利用MD5生成的哈希值是128位的二进制数,也就是32位的16进制数;
(2) SHA算法分为很多版本,最大的版本是SHA-1, SHA-2,SHA-2又包含了很多子版本,比如SHA-256, SHA-384, SHA-512等;
(3)MAC算法结合了MD5和SHA算法的优势,并加入密钥的支持,是一种更为安全的消息摘要算法;
SHA虽然和MD5一样,同属于散列算法,都是由MD4算法演变而来,但有少许的不同;
1. 摘要长度不同:MD5的摘要的长度是128位,SHA-1的摘要长度是160位,多出了32位,而这也意味着不同明文的碰撞几率降低了2的32次方倍,而其他的SHA版本,如SHA-256,则摘要长度是256位;
2. 性能略有差异:理论上来说,SHA-1生成摘要的性能要比MD5低一点;
其中,Java中MD5和SHA系列的代码均在java.security包下有相应的实现;