Java加密总结__常见哈希算法总结

哈希算法

 哈希算法(Hash)又称摘要算法(Digest),它的作用是:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。

哈希算法的目的:为了验证原始数据是否被篡改。

哈希算法最重要的特点就是:相同的输入一定得到相同的输出;不同的输入大概率得到不同的输出。

 两个相同的字符串永远会计算出相同的 hashCode,否则基于 hashCode 定位的 HashMap 就无法正常工作。这也是为什么当我们自定义一个 class 时,覆写 equals() 方法时我,们必须正确覆写 hashCode() 方法。

 哈希碰撞(哈希碰撞是指,两个不同的输入得到了相同的输出)

"AaAaAa".hashCode(); // 0x7460e8c0
"BBAaBB".hashCode(); // 0x7460e8c0

"通话".hashCode(); // 0x11ff03
"重地".hashCode(); // 0x11ff03

 碰撞能不能避免?答案是不能。碰撞是一定会出现的,因为输出的字节长度是固定的,String的hashCode()输出是4字节整数,最多只有4294967296种输出,但输入的数据长度是不固定的,有无数种输入。所以,哈希算法是把一个无限的输入集合映射到一个有限的输出集合,必然会产生碰撞。碰撞不可怕,我们担心的不是碰撞,而是碰撞的概率,因为碰撞概率的高低关系到哈希算法的安全性。一个安全的哈希算法必须满足:碰撞概率低;不能猜测输出。不能猜测输出是指:输入的任意一个bit的变化会造成输出完全不同,这样就很难从输出反推输入。

 常用的哈希算法

常用的哈希算法有:根据碰撞概率,哈希算法的输出长度越长,就越难产生碰撞,也就越安全。

算法

输出长度(位)

输出长度(字节)

MD5

128 bits

16 bytes

SHA - 1

160 bits

20 bytes

RipeMD - 160

160 bits

20 bytes

SHA - 256

256 bits

32 bytes

SHA-512

512 bits

64 bytes

MD5算法

package com.zou.demo2;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class Demo02 {
	public static void main(String[] args) {
		String str = "dfqxyfyadadaw";		
		try {
            // 创建一个MessageDigest
			MessageDigest digest = MessageDigest.getInstance("MD5");
			
            // 更新原始数据
			digest.update(str.getBytes());
			
            // 获取加密后的结果
			byte[] resultByteArray = digest.digest();
			System.out.println(Arrays.toString(resultByteArray));
			
			StringBuilder sb = new StringBuilder();
			for (byte bite : resultByteArray) {
				sb.append(String.format("%02x", bite));
			}		
			System.out.println(sb.length());
			System.out.println(sb);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}		
	}
}

 使用MessageDigest时,我们首先根据哈希算法获取一个MessageDigest实例,然后,反复调用update(byte[])输入数据。当输入结束后,调用digest()方法获得byte[]数组表示的摘要,最后,把它转换为十六进制的字符串。

哈希算法的用途

1.校验下载文件:判断下载到本地的软件是否时原始的,因此,如果输入被修改了,得到的输出就会不同。我们在网站上下载软件的时候,经常看到下载页显示的MD5哈希值

2.存储用户密码

SHA-1

SHA-1也是一种哈希算法,它的输出是160 bits,即20字节。在Java中使用SHA-1,和MD5完全一样,只需要把算法名称改为"SHA-1":

import java.security.MessageDigest;

public class main {
	public static void main(String[] args)  {
		// 创建一个MessageDigest实例:
        MessageDigest md = MessageDigest.getInstance("SHA-1");
       
        // 反复调用update输入数据:
        md.update("Hello".getBytes("UTF-8"));
        md.update("World".getBytes("UTF-8"));
        
        // 20 bytes: db8ac1c259eb89d4a131b253bacfca5f319d54f2
        byte[] results = md.digest(); 

        StringBuilder sb = new StringBuilder();
        for(byte bite : results) {
        	sb.append(String.format("%02x", bite));
        }
        
        System.out.println(sb.toString());
	}
}

  • 18
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值