一.摘要算法和摘要
1.概述
摘要算法又称哈希算法、散列算法。摘要也称哈希值,表示输入任意长度的数据,都会输出固定长度的数据。通过摘要算法(比如MDS和SHA-1)就可以得到该哈希值。
2.特点
- 长度固定,结果越长,认为摘要算法越安全* 原始数据不同,生成的摘要一定不同* 单项不可逆### 3、作用
摘要只验证数据的完整性和唯一性,单项不可逆。 哈希值长度都是固定的:MD5输出128bit长度的二进制串,SHA-1输出160bit长度的二进制串。128bit指二进制位数是128。 (8bit=1byte128bit=16byte)。
4、误区
摘要只是用于验证数据完整性和唯一性的,不管原始数据是什么样的,得到的哈希值都是固定长度的,也就是说哈希值并不是原始数据加密后的密文,只是一个验证身份的令牌,所以我们无法通过摘要还原出原始数据,即单向不可逆,所以说摘要算法是加密算法是不严谨的。
二.目前常用的摘要算法
算法 | 输出长度 |
---|---|
MD5 | 128bit |
SHA-1 | 160bit |
SHA-256 | 256bit |
1.MD5
(1)MD5的用途
- 验证文件完整性* 存储用户口令(比如密码)系统不用存储用户原始口令,而是存储用户原始口令的MD5,系统计算用户输入的原始口令的MD5并与数据存储的MD5进行对比,如果相同,则说明口令正确,反之则说明口令错误。
(2)彩虹表
MD5虽然不可逆,也无法通过摘要还原出原始数据,但不代表一定安全。由于字符串通过MD5计算的摘要是唯一的,那么MD5字典随着时间积累保存越来越多的MD5记录,通过穷举这个字典就可以找到密码。我们把这个字典称为彩虹表。即采用各种Hash算法生成的明文和密文的对照表。
(3)加盐或者base64–防止彩虹表穷举
抵御彩虹表攻击我们不能简单的记录原始口令的MD5值,需要让原始数据变得够长和够复杂。可以通过base64编码方法,对原始数据先进行base64编码,再MD5,即md5(base64(password))。也可以通过加盐的方法,对原始数据额外添加随机数salt,再MD5,即md5(salt+password)。Java代码如下:
public static String md5(String string, String slat) {if (TextUtils.isEmpty(string)) {return "";}MessageDigest md5 = null;try {md5 = MessageDigest.getInstance("MD5");byte[] bytes = md5.digest((string + slat).getBytes());String result = "";for (byte b : bytes) {String temp = Integer.toHexString(b & 0xff);if (temp.length() == 1) {temp = "0" + temp;}result += temp;}return result;} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return "";}
2.SHA-1
SHA-1算法也是一种哈希算法,输出160bit,它的同类型算法有SHA-256和SHA-512,输出的长度分别是256bit和512bit。SHA-1在Java中使用同MD5类似,Java代码如下:
public static String sha(String string) {if (TextUtils.isEmpty(string)) {return "";}MessageDigest md5 = null;try {md5 = MessageDigest.getInstance("sha-1");byte[] bytes = md5.digest((string ).getBytes());String result = "";for (byte b : bytes) {String temp = Integer.toHexString(b & 0xff);if (temp.length() == 1) {temp = "0" + temp;}result += temp;}return result;} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return "";}
hmException e) {e.printStackTrace();}return "";}