五分钟搞懂摘要算法

一.摘要算法和摘要

1.概述

摘要算法又称哈希算法、散列算法。摘要也称哈希值,表示输入任意长度的数据,都会输出固定长度的数据。通过摘要算法(比如MDS和SHA-1)就可以得到该哈希值。

2.特点

  • 长度固定,结果越长,认为摘要算法越安全* 原始数据不同,生成的摘要一定不同* 单项不可逆### 3、作用

摘要只验证数据的完整性和唯一性,单项不可逆。 哈希值长度都是固定的:MD5输出128bit长度的二进制串,SHA-1输出160bit长度的二进制串。128bit指二进制位数是128。 (8bit=1byte128bit=16byte)。

4、误区

摘要只是用于验证数据完整性和唯一性的,不管原始数据是什么样的,得到的哈希值都是固定长度的,也就是说哈希值并不是原始数据加密后的密文,只是一个验证身份的令牌,所以我们无法通过摘要还原出原始数据,即单向不可逆,所以说摘要算法是加密算法是不严谨的。

二.目前常用的摘要算法

算法输出长度
MD5128bit
SHA-1160bit
SHA-256256bit

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 "";} 
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值