zoukankan      html  css  js  c++  java
  • 哈希算法

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

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

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

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

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

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

    哈希碰撞:

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

    哈希碰撞是不能避免的,因为输出的字节长度是固定的,StringhashCode()输出是4字节整数,最多只有4294967296种输出,但输入的数据长度是不固定的,有无数种输入。所以,哈希算法是把一个无限的输入集合映射到一个有限的输出集合,必然会产生碰撞。

    碰撞不可怕,我们担心的不是碰撞,而是碰撞的概率,因为碰撞概率的高低关系到哈希算法的安全性。一个安全的哈希算法必须满足:

    • 碰撞概率低;
    • 不能猜测输出。(不能猜测输出是指,输入的任意一个bit的变化会造成输出完全不同,这样就很难从输出反推输入(只能依靠暴力穷举))

     MD5

    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("HelloWorld".getBytes("UTF-8"));
           byte[] result = md.digest(); System.out.println(new BigInteger(1, result).toString(16)); } }

    总结:

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

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

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

    Java标准库支持的所有哈希算法可以在https://docs.oracle.com/en/java/javase/13/docs/specs/security/standard-names.html#messagedigest-algorithms查到。

  • 相关阅读:
    子集生成——增量构造法+位向量法+二进制法
    记忆化搜索
    欧拉回路和欧拉通路
    拓扑排序(基于dfs+基于队列)
    HDU 3839 Ancient Messages(DFS)
    【gulp】前端自动化工具---gulp的使用(一)------【巷子】
    【面向对象】用大白话扯扯那"神奇"的面向对象之方法继承(五)------【巷子】
    【面向对象】----【prototype&&__proto__&&实例化对象三者之间的关系】(四)-----【巷子】
    【面向对象】用大白话扯扯那"神奇"的面向对象之属性继承(三)------【巷子】
    【面向对象】用大白话扯扯那"神奇"的面向对象编程思维(二)------【巷子】
  • 原文地址:https://www.cnblogs.com/aikutao/p/12155215.html
Copyright © 2011-2022 走看看