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

哈希算法最重要的特点就是:

  • 相同的输入一定得到相同的输出;
  • 不同的输入大概率得到不同的输出。

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

Java字符串的hashCode()就是一个哈希算法,它的输入是任意字符串,输出是固定的4字节int整数

Java标准库提供了常用的哈希算法,并且有一套统一的接口。我们以MD5算法为例,看看如何对输入计算哈希:

public class TestDemo {
     private static final String slat = "mc12345@@@%%%";//盐,用于混交md5
     public static void main(String[] args) throws Exception {
            String dataStr="hello,world";
            dataStr = dataStr + slat;
        // 创建一个MessageDigest实例: MessageDigest m
= MessageDigest.getInstance("MD5");
        // 反复调用update输入数据: m.update(dataStr.getBytes(
"UTF8")); byte bytes[] = m.digest(); String result = ""; for (int i = 0; i < bytes.length; i++) { result += Integer.toHexString((0x000000FF & s[i]) | 0x80000000).substring(6); } System.out.println(result); } }

SHA-1

SHA-1也是一种哈希算法,它的输出是160 bits,即20字节。SHA-1是由美国国家安全局开发的,SHA算法实际上是一个系列,包括SHA-0(已废弃)、SHA-1、SHA-256、SHA-512等。

在Java中使用SHA-1,和MD5完全一样,只需要把算法名称改为"SHA-1"

public class TestDemo {
     public static void main(String[] args) throws Exception {
            // 创建一个MessageDigest实例:
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            // 反复调用update输入数据:
            md.update("Hello".getBytes("UTF-8"));
            md.update("World".getBytes("UTF-8"));
            byte[] result = md.digest();
            System.out.println(new BigInteger(1, result).toString(16));
         }
}

总结:

哈希算法可用于验证数据完整性,具有防篡改检测的功能;

常用的哈希算法有MD5、SHA-1等;

用哈希存储口令时要考虑彩虹表攻击。

Java标准库支持的所有哈希算法可以在This查到。

02-12 11:52