目录

一、概述

二、哈希碰撞

三、常见的哈希算法

四、简单应用代码实现

下面先以MD5算法对密码进行加密为例:

哈希算法的用途

扩展:

一、概述

哈希算法(Hash)又称摘要算法(Digest ),它的作用是:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。哈希算法的目的:为了验证原始数据是否被篡改。
哈希算法最重要的特点就是:

·相同的输入一定得到相同的输出;

·不同的输入大概率得到不同的输出。

二、哈希碰撞

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

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

       碰撞能不能避免?答案是不能。碰撞是一定会出现的,因为输出的气节长度是固定的,String的hashcode()输出是4字节整数,最多只有4294967296种输出,但输入的数据长度是不固定的,有无数种输入。所以,哈希算法是把一个无限的输入集合映射到一个有限的输出集合,必然会产生碰撞。
       碰撞不可怕,我们担心的不是碰撞,而是碰撞的概率,因为碰撞概率的高低关系到哈希算法的安全性。一个安全的哈希算法必须满足:
       ·碰撞概率低;
       ·不能猜测输出。

三、常见的哈希算法

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

四、简单应用代码实现

下面先以MD5算法对密码进行加密为例:

首先在使用MessageDigest时,我们首先根据哈希算法获取一个MessageDigest 实例;

然后,反复调用update(byte[])输入数据;

当输入结束后,调用digest()方法获得byte[]数组表示的摘要

最后,把它转换为十六进制的字符串,借助String.format("%02x", bite)格式化控制。

public class demo02 {public static void main(String[] args) {try {String password = "123wbjxxmynhmyzgq";//根据当前算法,获取加密工具对象(摘要)MessageDigest digest = MessageDigest.getInstance("MD5");//更新原始数据digest.update(password.getBytes());//加密后的字节数组,转换字符串byte[] resultByteArray = digest.digest();StringBuilder result = new StringBuilder();for(byte bite : resultByteArray) {//字符串格式化控制:转换成16进制,每个数字占两个字节,不足0来补result.append(String.format("%02x", bite));}System.out.println(result);System.out.println(result.length());} catch (NoSuchAlgorithmException e) {e.printStackTrace();}}}

哈希算法的用途

1.校验下载文件

我们只需要计算本地文件的哈希值,再与官网公开的哈希值对比,如果相同,说明文件下载正确,否则,说明文件已经被篡改。因为相同的输入永远会得到相同的输出,如果输入被修改了,得到的输出就会不同。

2.存储用户密码

为了防止密码泄露和抵御彩虹表的攻击,我们需要对每个口令额外添加随机数,这个方法称之为盐(salt)。

下面介绍用哈希算法SHA-1对密码进行加密:

①获取SHA-1算法的工具对象MessageDigest,通过getInstance("SHA-1")来进行创建;

②使用update()更新数据(添加数据);

③通过digest()方法获取加密信息(消息摘要);

④使用StringBuilder将加密信息格式化成16进制拼接成字符串输出。

public class demo04 {public static void main(String[] args) throws NoSuchAlgorithmException {String password = "wertyuisdf";String salt = UUID.randomUUID().toString().substring(0, 5);System.out.println(salt);//获取SHA-1算法的工具对象MessageDigest digest = MessageDigest.getInstance("SHA-1");digest.update(password.getBytes());digest.update(salt.getBytes());byte[] resultByteArray = digest.digest();System.out.println(Arrays.toString(resultByteArray));System.out.println(resultByteArray.length);StringBuilder result = new StringBuilder();for(byte b : resultByteArray) {result.append(String.format("%02x", b));}System.out.println(result);}}

输出加密内容长度、加密内容:

扩展:

首先介绍bouncyCastle:提供了很多哈希算法和加密算法的第三方开源库
下面介绍哈希算法 RipeMD-160算法实现过程:

①注册BouncyCastle提供的通知类对象BouncyCastleProvider;

②获取RipeMD160算法的“消息摘要对象”(加密对象)MessageDigest.getInstance("RipeMD160");

③更新原始数据update()

④通过调用digest()方法获取消息摘要(加密)

⑤输出具体信息,此次借助BigInteger(1,result).toString(16),1表示输出类型为正整数,16表示转换成16进制,将消息摘要输出。

public class demo {public static void main(String[] args) {try {//注册BouncyCastle提供的通知类对象BouncyCastleProviderSecurity.addProvider(new BouncyCastleProvider());//获取RipeMD160算法的“消息摘要对象”(加密对象)MessageDigest md = MessageDigest.getInstance("RipeMD160");//更新原始数据md.update("HelloWorld".getBytes());//获取消息摘要(加密)byte[] result = md.digest();//消息摘要的字节长度和内容System.out.println(result.length); //160位 = 20字节System.out.println(Arrays.toString(result));//16进制内容字符串//1 代表类型为正整数String hex = new BigInteger(1,result).toString(16);System.out.println(hex.length()); //20字节 = 40个字符System.out.println(hex);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}}}

输出结果:

以上就是对于哈希算法总结以及简单应用实现的分享,如有不当之处还请大家多多评论指正,喜欢的话可以留下您的关注和点赞,一起学习,一起进步!

Java加密:常见哈希算法总结相关推荐

  1. 常见哈希算法以及Hmac算法,BouncyCastle总结

    常见哈希算法总结 (1)什么是哈希算法? 哈希算法(Hash)又称摘要算法(Digest),它的作用是:对任意一组输出数据进行计算,得到一个固定长度的输出摘要.哈希算法的目的;为了验证原始数据是否被篡 ...

  2. 常见哈希算法 对称加密算法与非对称加密算法

    目录 1.常见哈希算法总结: 1.1.概述 1.2.常见的哈希算法 1.2.1.MD5和SHA-1 1.2.2.RipeMD-160 2.对称加密算法与非对称加密算对比 2.1 概述: 2.1.1对称 ...

  3. java中的加密与安全——常见哈希算法总结,对称式加密及不对称式加密

    目录 一.编码算法 1.URL编码 1.1.概念 1.2.代码示例(编码和解码)对URL中的中文进行编码 对URL中的中文进行解码 2.Base64编码 2.1.基本概念 2.2. 解码内容: 2.3 ...

  4. Linux加密和安全篇(一)gpg、对称和非对称加密、哈希算法

    对于linux运维工作者而言,加密技术已经很早就用于数据的存储和数据之间的交换.我们可以会为了防止你的网站.服务器或者系统,我们会使用一些手段来防止一些恶意的攻击或者访问.一下就对linux的安全和加 ...

  5. java冒泡排序_Java专题(二):Java中常见的排序算法有哪些?---冒泡排序

    排序相关的的基本概念排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域,即多个数据成员 ...

  6. php md5加密算法源码,MD5加密和哈希算法

    MD5加密算法为现在应用最广泛的哈希算法之一,该算法广泛应用于互联网网站的用户文件加密,能够将用户密码加密为128位的长整数.数据库并不明文存储用户密码,而是在用户登录时将输入密码字符串进行MD5加密 ...

  7. Java基础 常见数据结构与算法 项目总结

    Java基础 1 Java基础必知必会 1.1 Java语言有哪些特点? 面向对象(封装,继承,多态): 平台无关性,平台无关性的具体表现在于,Java 是"一次编写,到处运行(Write ...

  8. 第十九篇:JAVA加密解密之RSA算法

    RSA算法简介 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年首 ...

  9. Java中常见的排序算法代码演示

    package cn.xbz;import java.util.Arrays;/*** 各种排序法的演示* @author xbz**/ public class ArraySort {public ...

最新文章

  1. 汽车中的ECU, VCU, MCU, HCU
  2. 【报名】杨植麟 :从学习的角度看NLP的现状与未来
  3. mac连接群晖的服务器会自动断开_酷玩家庭数码-mac苹果笔记本电脑如何访问群晖NAS文件?...
  4. 动效设计中的隐喻-2
  5. Django扩展自定义manage命令
  6. python小游戏——21点
  7. jpa一级缓存和二级缓存_了解一级JPA缓存
  8. sql统计系统时间那一个月数量_关于BE00007图书借阅管理系统bug修复总结
  9. 修复linux bash破壳漏洞,Linux系统下如何检测并修复bash中的破壳漏洞​​
  10. express的基本用法
  11. DevOps 和敏捷开发的区别是什么?
  12. 如何用文件对比工具进行文件内容比较
  13. PS_1_认识主界面_新建文档(分辨率)_打开保存(序列动画)
  14. centos/redhat kernel-debug-info-xx.rpm与kernel-debuginfo-xx.rpm区别
  15. 30+项目经理,少奋斗5年的职业规划路线
  16. 计算机原理学习(一)
  17. VvvebJs —— 使用拖拽的方式生成网页
  18. Android CE DE加密小结
  19. 如何使用ABBYY FineReader 14标记文本
  20. StateFlow与SharedFlow(一)

热门文章

  1. 强大的企业工作平台—今目标
  2. 计算机类说课优秀模板,广东省创新杯说课大赛计算机专业类一等奖作品:《模板的应用》教学设计.pdf...
  3. 大数据也要有自已的特色
  4. mysql高级查询之多条件的过滤查询
  5. channel shuffle通道洗牌
  6. 16进制(00)转字符
  7. 英语拼读工具开源【Gitte】
  8. 无效驱动器*解决方法
  9. springboot 设置自定义启动背景图 教程
  10. Android基于nfc的读写(一)