Hash算法

2023-11-04

目录

一、Hash基本概念

        1.特点

2.hash的目的及用途

二、常用Hash算法

1.MD5算法

2.加盐

3.SHA系列算法与HashTools工具类

4.RipeMD-160算法


一、Hash基本概念

哈希算法也叫摘要算法,是一种用于加密的算法,其工作原理是对任意一组输入总能得到一个长度固定的计算结果

1.特点

对于相同输入,hash后结果一定相同

对于不同输入,hash后结果大概率不同

再这里需要提到hash碰撞,即两个不同的输入,经过计算后得到了相同的结果。

产生hash碰撞的原因:

        由于hash算法输出的字节长度是固定的,而输入的长度确实无限的,用无限的输入映射有限的输出,就会产生碰撞

 2.hash的目的及用途

目的:经过hash后可以判断原始数据是否被篡改,这是由hash算法的特点决定的

用途:

(1)用于检验下载的文件是否正确

(2)用于用户登录时密码的验证

二、常用Hash算法

算法 输出长度(bit) 输出长度(byte)
MD5 128bits 16bytes
SHA-1 160bits 20bytes
SHA-256 256bits 32bytes
SHA-512 512bits 64bytes
RipeMD-160 160bits 20bytes

JAVA中的Hash算法通过统一的接口调用,因此,对于算法的使用,不同的参数可以构造不同算法

1.MD5算法

 MessageDigest md5 = MessageDigest.getInstance("MD5");//创建基于MD5算法的摘要对象
 md5.update("hahaha".getBytes());//更新原始数据
 //获取加密后的结果
 byte[] digest = md5.digest();//获取数据摘要

 System.out.println("加密后的结果是==>"+ Arrays.toString(digest));
 //使用工具类将加密后的结果转换为16进制字符串(工具类在后文)
 System.out.println("转换为16进制字符串==>"+HashTools.bytesToHex(digest));
 System.out.println("加密后的长度是==>"+digest.length);

运行结果: 

2.加盐

盐是指对每个口令额外添加随机数,用以应对彩虹表攻击。彩虹表攻击是指一个预先计算好常用口令hash结果的表,彩虹攻击是说用该表于hash后的结果表对照,就可以获得原始口令。

String password="aaaaaaheimaojingzhang";//口令
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(password.getBytes());//加入口令
byte[] digest = md5.digest();//加密
String bytesToHex = HashTools.bytesToHex(digest);//转换为16进制字符串

System.out.println("加密后==>"+ Arrays.toString(digest));
System.out.println("16进制字符串==>"+bytesToHex);
//加盐
String salt = UUID.randomUUID().toString().substring(0, 5);
md5.update(salt.getBytes());
byte[] digest1 = md5.digest();
String bytesToHex1 = HashTools.bytesToHex(digest1);

System.out.println("加盐后加密==>"+ Arrays.toString(digest1));
System.out.println("加盐后16进制字符串==>"+bytesToHex1);

 运行结果:

3.SHA系列算法与HashTools工具类

对于SHA-1算法的实现过程与MD5算法大致相同,只有在创建摘要对象时不同,因此可以创建工具类HashTools对其封装。

 private static MessageDigest MD;//摘要对象
    private HashTools(){//私有构造,外部无法实例化对象

    }
     //将字节数组转换为16进制字符串
    public static String bytesToHex(byte[] bytes){
        StringBuilder ret = new StringBuilder();//存储结果
        for(byte b:bytes){
            //将字节值转换为2位16进制字符串
            ret.append(String.format("%02x",b));
        }
        return ret.toString();
    }

    //MD5
    public static String digestMD5(String resource) throws NoSuchAlgorithmException {
       MD = MessageDigest.getInstance("MD5");//创建MD5摘要对象
       return handler(resource);//公共功能
    }

    //SHA-1
    public static String digestSHA1(String resource) throws NoSuchAlgorithmException {
        MD = MessageDigest.getInstance("SHA-1");//创建SHA-1对象
        return handler(resource);
    }
    //公共实现
    public static String handler(String resource){
        MD.update(resource.getBytes());//更新口令
        byte[] digest = HashTools.MD.digest();//获取该口令的摘要数组
        String bytesToHex = bytesToHex(digest);//调用本类静态方法,将摘要结果转换为字符串
        return bytesToHex;//返回字符串
    }
String password="aaaaaaheimaojingzhang";
System.out.println("基于MD5==>"+HashTools.digestMD5(password));
System.out.println("基于SHA-1==>"+HashTools.digestSHA1(password));

运行结果:

4.RipeMD-160算法

该算法是一个第三方类库,不是Java标准库中提供的算法,在使用前需要将jar包添加到类路径下,其次要使用BouncyCastle的RipeMD-160算法,还需要注册BouncyCastle通知对象

//注册BouncyCastleBouncyCastleProvider通知类
//将提供消息摘要算法注册至Security
Security.addProvider(new BouncyCastleProvider());
//获取该算法的对象
MessageDigest ripeMD160 = MessageDigest.getInstance("RipeMD160");
//更新原始数据
ripeMD160.update("wbjxxmy".getBytes());
//加密
byte[] digest = ripeMD160.digest();
System.out.println("摘要的字节数组==>"+Arrays.toString(digest));
System.out.println("摘要字节数组长度==>"+digest.length);
System.out.println("摘要16进制字符串==>"+HashTools.bytesToHex(digest));

运行结果: 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hash算法 的相关文章

随机推荐

  • vue+element-ui实现表格里嵌套表格

    效果图 点击某行数据展开另一个嵌套在里面的table 核心代码 从后台请求的数据格式 代码实现
  • table 表格合并

    table 表格合并 开发工具与关键技术 DW JavaScript 作者 刘东标 撰写时间 2019 03 14 div div span colspan和rowspan这两个属性用于创建特殊的表格 span span colspan用来
  • JAVA查搜索文件内容

    上周突然遇到了个要查找历史sql的中是否包含某个字段的问题 Everting虽然可以查找某个后缀的文件 可是并不能搜索文件内容 所以就花费一点功夫自己写一个了 使用起来还是非常方便 1 单文件查找内容 2 单文件夹下读取所有文件 并查找内容
  • 【时间序列预测算法】——ARIMA 算法介绍及代码实现

    基本概念 一阶差分 时间序列在t 与t 1 时刻函数值的差值 提升时序数据的平稳性 ARIMA算法对数据平稳性有要求 二阶差分 在一阶差分的基础上再做一次 一般时序数据最多做两阶 再多则预测意义不大 自回归模型 f t
  • Google Protocol Buffer持久化框架分析

    一 三大主流开源持久化框架介绍 1 1 Google Protocol Buffer protocol buffer是google 的一种数据交换的格式 它独立于语言 独立于平台 google 提供了三种语言的实现 java c 和 pyt
  • The type or namespace name ‘MenuItemAttribute‘ could not be found类似报错处理方法

    类似报错主要是使用了UnityEditor相关的API 解决方法的话 只要将相关脚本放进Asset下的Editor文件夹之中即可 并不涉及其他的逻辑 只与UnityEditor相关 否则在打包的时候还可能会发生类似的报错
  • KEIL编译报错 Error: L6220E: Load region LR_IROM1 size (65552 bytes) exceeds limit (65536 bytes)……

    问题描述 STM32F103CBT6 KEIL编译报错 Error L6220E Load region LR IROM1 size 65552 bytes exceeds limit 65536 bytes Region contains
  • 7107小时时,加入创业公司(没有股份,当作经验吧)

    只是第一个项目是web项目 与vr无关 所以此项目耗费时间不计入1万小时之内 也不算是第五个项目 不过也算是里程碑 至少2017年有稳定项目来源了吧 主要也是学经验 以后如果开自己的公司的话 能有所借鉴 还是要努力的 才能多接触各方面 主要
  • windows 10 vs2017 x264的编译和使用测试

    做了一次更新 工具改成vs2019了 x264这个sdk非常棒 主页 x264 the best H 264 AVC encoder VideoLANhttps www videolan org developers x264 html 在
  • 01. Web漏洞靶场的搭建

    01 Web漏洞靶场的搭建 Web漏洞靶场的搭建 上 什么是Web安全 什么是Web Web是互联网的总称 全称为World Wide Web 缩写WWW 即全球广域网 也称为万维网 它是一种基于超文本和HTTP的 全球性的 动态交互的 跨
  • Vue3正式发布那么久了,你认识Pinia了吗?

    个人简介 个人主页 前端杂货铺 学习方向 主攻前端方向 正逐渐往全干发展 个人状态 研发工程师 现效力于中国工业软件事业 人生格言 积跬步至千里 积小流成江海 推荐学习 前端面试宝典 Vue2 Vue3 Vue2 3项目实战 Node js
  • StringBoot+Mybatis的增删改查(四)

    整体项目链接地址 StringBoot Mybatis的增删改查 一 StringBoot Mybatis的增删改查 二 StringBoot Mybatis的增删改查 三 StringBoot Mybatis的增删改查 四 StringB
  • vue练习,写游戏

  • 【异常问题】nvcc fatal : Unsupported gpu architecture ‘compute_86‘ 解决方案

    目录 异常问题 nvcc fatal Unsupported gpu architecture compute 86 解决方案 1 报错信息 2 系统环境 3 原因分析 4 解决方案 异常问题 nvcc fatal Unsupported
  • Verilog基础语法(一)

    一 数据类型 在Verilog语言中主要有三大数据类型 寄存器数据类型 线网数据类型 参数数据类型 1 寄存器数据类型 关键字 reg reg类型数据默认初始值为不定值X 需要注意的是reg类型的数据只能在always语句和initial语
  • 基于MATLAB R2018a库函数构建KNN分类器

    基于MATLAB R2018a库函数构建KNN分类器 基于MATLAB R2018a库函数构建KNN分类器 从一个库函数fitcknn 谈起 构造函数 类的属性 Properties 方法成员 Methods 构建和使用KNN分类器 基于M
  • python高级数据类型

    序列 字符串 列表 元组 在python中 序列就是一组按照顺序排列的值 数据集合 python中存在三种内置的序列类型 字符串 列表 元组 优点 支持索引和切片的操作 特征 第一个正索引为0 指向的是左端 第一个索引为负数 指向的是右端
  • 深入理解设计原则之接口隔离原则(ISP)【软件架构设计】

    系列文章目录 C 高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C 并发线程编程 LSP 接口隔离原则 系列文章目录 1 接口隔离原则的定义和解读 2 案例解读 3 如何判断一个接口是否符合接口隔离原则 小结 1
  • 如何用element-ui的table做一个模糊搜索功能

    一 在表格标题处增加一个input用来根据关键字搜索库房 用v model search 绑定输入 下面是
  • Hash算法

    目录 一 Hash基本概念 1 特点 2 hash的目的及用途 二 常用Hash算法 1 MD5算法 2 加盐 3 SHA系列算法与HashTools工具类 4 RipeMD 160算法 一 Hash基本概念 哈希算法也叫摘要算法 是一种用