Java常用工具算法-1--哈希算法(MD5,SHA家族,SHA-256,BLAKE2)

1、概述

哈希算法(Hash Algorithm),又称散列算法,是一种将任意长度的输入数据(明文)转换为固定长度的输出(哈希值/摘要)的数学算法。
哈希值通常被称为摘要(Digest)。
其核心思想是通过单向函数将数据映射到一个较短的、固定长度的字符串,同时保证不同的输入生成不同的哈希值(理想情况下)。

2、主要特点

(1)、单向性(不可逆)

  • 特性:无法从哈希值反推出原始输入数据。
  • 用途:确保数据隐私(如密码存储)。
  • 示例:SHA-256(“Hello”)生成固定长度的哈希值,但无法通过哈希值还原出"Hello"。

(2)、固定输出长度

  • 特性:无论输入多长,输出长度固定(如 SHA-256 的输出为 256 位)。
  • 用途:便于存储和传输。

(3)、确定性

  • 特性:相同的输入始终生成相同的哈希值。
  • 用途:验证数据完整性。

(4)、高效性

  • 计算哈希值的速度非常快。

(5)、抗碰撞性(Collision Resistance)

  • 特性:找到两个不同输入生成相同哈希值的难度极大(理论上不可能)。

(6)、雪崩效应(Avalanche Effect)

  • 特性:输入微小变化(如一个比特)会导致哈希值剧烈变化。
  • 用途:确保数据篡改可检测。

3、工作原理

(1)、基本流程

  1. 输入处理:将任意长度的输入数据(如文件、密码)转换为二进制格式。
  2. 填充与分块:将输入数据分割为固定大小的块(如 SHA-256 分块为 512 位)。
  3. 初始化变量:设置初始哈希值(如 SHA-256 使用前 8 个素数的平方根)。
  4. 主循环处理:对每个数据块进行复杂的数学运算(如混淆、扩散操作)。
  5. 输出哈希值:最终生成固定长度的哈希值。

(2)、冲突与解决

  • 冲突(Collision):不同输入生成相同的哈希值。
  • 解决方法:
    • 加盐(Salting):在输入中添加随机值(盐),防止彩虹表攻击(如密码存储)。
    • 虚拟节点:在分布式系统中,通过虚拟节点减少哈希冲突(如一致性哈希)。

4、应用场景

(1)、数据完整性校验

  • 用途:验证文件或数据未被篡改。
  • 示例:
    • 下载软件或文件时,可以通过比较官方提供的哈希值与本地计算得到的哈希值来确保文件未被篡改。
    • 数据库备份完整性校验。

(2)、密码存储

  • 用途:将密码哈希后存储,即使数据库泄露,攻击者也无法直接获取明文密码。
  • 最佳实践:
    • 加盐哈希:对每个密码添加唯一盐值(如bcrypt、PBKDF2)。
    • 慢哈希:使用计算密集型算法(如bcrypt)抵御暴力破解。
      解释下加盐处理流程:
      [1]、存储密码的步骤
  • 步骤1:生成盐值
    使用加密安全的随机数生成器(如 SecureRandom)为每个用户生成唯一的盐值。盐值长度建议至少为 16 字节。
  • 步骤2:加盐并哈希
    将盐值与用户输入的密码拼接,再通过安全哈希算法(如 BCrypt、Argon2、SHA-256)生成哈希值。
    示例公式:
    哈希值 = hash(密码 + 盐值)
  • 步骤3:存储盐值和哈希值
    将盐值和哈希值一起存储在数据库中(盐值可明文存储,无需加密,密码存储为hash(原始密码 + 盐值)的摘要)。

[2]、校验密码的步骤

  • 步骤1:获取盐值和存储的哈希值
    用户登录时,从数据库中读取该用户的盐值和哈希值。
  • 步骤2:重新哈希
    将用户输入的密码与存储的盐值拼接,再次通过相同哈希算法生成新的哈希值。
  • 步骤3:比对哈希值
    将新生成的哈希值与数据库中存储的哈希值进行比较,若一致则验证成功。

(3)、数字签名

  • 用途:结合非对称加密(如 RSA)生成签名,确保数据来源和完整性。
  • 流程:(先hash在加密,先解密在重新hash)
    1. 发送方首先对消息进行哈希运算,然后使用自己的私钥对哈希值进行加密形成签名。
    2. 接收方收到消息后,先解密签名获得哈希值,并重新计算消息的哈希值进行比对,以此验证消息的真实性和完整性。

(4)、唯一标识

  • 用途:生成数据的唯一指纹(如 Git 版本控制)。
  • 示例:区块链中的每个区块都包含前一个区块的哈希值,形成了链式结构,保证了数据的不可篡改性。

(5)、分布式系统(一致性哈希)

  • 用途:在分布式存储或缓存中,均匀分配数据到节点。
  • 特点:
    • 减少数据迁移:节点增减时仅影响附近节点的数据。
    • 虚拟节点:通过虚拟节点(如将物理节点映射为多个逻辑节点)平衡负载。

5、分类

1、MD5 (Message-Digest Algorithm 5) (不推荐)

  • 概述:MD5是最著名的哈希算法之一,由Ronald Rivest设计,用于生成128位(16字节)的哈希值。
  • 应用场景:
    • 文件完整性检查
    • 密码存储(已不再推荐)
  • 安全性问题:
    • 易受碰撞攻击影响,即可以轻易找到两个不同的输入产生相同的哈希值。
    • 不再被认为是安全的,特别是在密码存储和认证方面。

2、SHA家族 (Secure Hash Algorithm Family)

  • SHA-1:(不推荐)

    • 概述:生成160位(20字节)的哈希值。
    • 安全性问题:与MD5类似,存在理论上的碰撞攻击,已被证明不够安全。
  • SHA-2(包括SHA-256, SHA-384, SHA-512等):(当前主流SHA-256)

    • 概述:SHA-2是SHA-1的继承者,提供了更高的安全性和更大的输出空间(如SHA-256生成256位的哈希值)。
    • 应用场景:
      • 数字签名
      • 安全通信协议(如TLS/SSL)
      • 区块链技术(比特币使用SHA-256)
    • 安全性:目前没有有效的攻击方法,被广泛认为是安全的。
  • SHA-3:

    • 概述:作为SHA-2的后继标准发布,但采用了完全不同的设计结构(海绵构造),以提供额外的安全保障。
    • 应用场景:适用于需要高安全性的场景,尽管SHA-2仍然被认为足够安全。

3、BLAKE 和 BLAKE2

  • BLAKE:

    • 概述:一种基于HAIFA框架设计的哈希函数,最初是为了NIST SHA-3竞赛而开发。
  • BLAKE2:

    • 概述:BLAKE2是BLAKE的一个改进版本,速度更快且更加灵活,安全性高,支持多种输出长度(如BLAKE2b生成512位哈希值)。
    • 应用场景:
      • 高效的数据完整性校验
      • 密码派生函数(例如Argon2中使用BLAKE2b),密码库
      • 区块链

4、其他哈希算法

  • RIPEMD系列:

    • 概述:另一种哈希算法家族,最初由欧洲RIPE项目开发。
    • 应用场景:较少见于主流应用,但在某些特定场合下使用。
  • CRC32:

    • 特点:简单快速,但非加密安全。
    • 用途:数据校验(如文件传输)。

常见算法对比:
在这里插入图片描述

6、代码示例

(1)、SHA-256 实现

import java.security.MessageDigest;public class SHA256Example {public static String sha256(String input) {try {MessageDigest digest = MessageDigest.getInstance("SHA-256");byte[] hash = digest.digest(input.getBytes());// 转换为十六进制字符串StringBuilder hexString = new StringBuilder();for (byte b : hash) {String hex = String.format("%02x", b);hexString.append(hex);}return hexString.toString();} catch (Exception e) {throw new RuntimeException(e);}}
}

(2)、加盐哈希(BCrypt)

import org.mindrot.jbcrypt.BCrypt;public class PasswordHashing {public static String hashPassword(String password) {// 生成盐值并哈希密码(工作因子 12 控制计算速度)return BCrypt.hashpw(password, BCrypt.gensalt(12));}public static boolean verifyPassword(String password, String hashed) {return BCrypt.checkpw(password, hashed);}
}

7、总结注意

(1)、哈希算法的核心价值

  • 数据完整性:通过哈希值验证数据未被篡改。
  • 隐私保护:单向性确保密码等敏感信息安全存储。
  • 高效性:固定输出长度便于快速比较和存储。

(2)、选择哈希算法的准则

  • 安全性优先:避免 MD5、SHA-1,选择 SHA-256 或 SHA-3。
  • 性能权衡:BLAKE2 适合需要高性能的场景。
  • 场景适配:密码存储需加盐,区块链需抗碰撞。

(3)、典型应用案例

  • 区块链:每个区块的哈希值串联形成不可篡改的链。
  • HTTPS:证书签名使用哈希算法确保来源可信。
  • 分布式系统:一致性哈希优化节点数据分布。

逆风翻盘,Dare To Be!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenMCU(五):STM32F103时钟树初始化分析

概述 本文主要描述了STM32F103初始化过程系统时钟的初始化,主要描述了系统时钟的初始化,AHB总线时钟,APB总线时钟等的初始化。 硬件板卡3d图 时钟树 STM32F103的时钟树,如下所示: 时钟源选择 从STM32F103的时钟树框图,我们可以…

【qt】文件类(QFile)

很高兴你能看到这篇文章,同时我的语雀文档也更新了许多嵌入式系列的学习笔记希望能帮到你 : https://www.yuque.com/alive-m4b9n 目录 QFile 主要功能QFile 操作步骤QFile 其他常用函数案例分析及实现功能一实现:打开文件并显示功能二实现:另…

基于AT89C52单片机的轮胎压力监测系统

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90545655?spm1001.2014.3001.5503 功能介绍: 采用MPX4115压力传感器进行轮胎压力检测;使用LCD液晶显示器显示轮胎压力;若压力过…

shell脚本--MySQL简单调用

实现功能 增 数据库的创建,数据表的创建已经实现 创建用户 删 删除数据库, 删除库下的某个表, 删除某个用户 改 暂无 查 查看所有的数据库, 查看某个库下的所有数据表, 查看某个表的结构, 查…

计算机网络 OSI参考模型

目录 OSS七层 OSI通信过程1 OSI通信过程2 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 OSS七层 OSI通信过程1 OSI通信过程2 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层

2025年华为HCIP题库分享

1101、 【拖拽题】OPSF邻接关系建立的过程中需要使用不同的报文,那么请分别将以下各个状态和该状态使用的报文联系起来。 答题格式为:11 22 33 43 正确答案:【12】【21】【24】【33】 解析: 建立邻居关系 RouterA的一个连接到广…

DIskgenius使用说明

文章目录 一、概述1. 软件简介2. 系统要求 二、核心功能1. 分区管理(1) 查看磁盘分区(2) 创建与删除分区(3) 调整分区大小(4) 格式化分区 2. 数据恢复(1) 恢复已删除文件(2) 恢复丢失分区(3) 恢复误格式化分区 3. 磁盘复制(1) 克隆磁盘(2) 磁盘镜像 4. 文件操作(1) 文件复制与移…

linux--------------进程控制(上)

1.进程创建 1.1fork函数初识 在linux中fork函数是⾮常重要的函数&#xff0c;它从已存在进程中创建⼀个新进程。新进程为⼦进程&#xff0c;⽽原进 程为⽗进程。 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;⾃进程中返回0&#xff0c;⽗进程返回⼦进程id…

windows免密SSH连接 ubuntu教程

文章目录 前情提要step1. 在windows下生成SSH密钥step2. SSH公钥copy到ubuntu的~/.ssh/authorized_keys内step3. 修改文件权限&#xff08;这一步完成后就可以实现免密SSH连接了&#xff09; 前情提要 ubuntu下安装SSH服务 sudo apt-get install openssh-serverwindows下安装…

中级:数组算法面试题全解析

一、引言 在Java面试中&#xff0c;数组相关的算法题是考察候选人基础算法能力的常见类型。面试官通过这些问题了解候选人在面对具体问题时的逻辑思维和代码实现能力。本文将深入剖析常见的数组算法面试题&#xff0c;结合实际开发场景&#xff0c;帮助读者全面掌握这些知识点…

《Linux运维实战:Ubuntu 22.04配置pam实现密码复杂度策略》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;Linux运维实战总结 一、背景信息 由于安全方面的考虑&#xff0c;先要求Ubuntu 22.04系统需配置密码复杂度策略&#xff0c;先要求如下&#xff1…

JavaScript数据结构

目录 JavaScript数据结构 一、基础数据结构 1. 数组&#xff08;Array&#xff09; 2. 对象&#xff08;Object&#xff09; 二、ES6 高级数据结构 1. Map 2. Set 3. WeakMap 与 WeakSet 三、类型化数组&#xff08;Typed Arrays&#xff09; 四、其他数据结构实现 …

魔改chromium——基础环境搭建

谷歌chromium环境要求详细文档 软件和环境要求&#xff0c;必须安装&#xff0c;硬性要求 系统环境&#xff1a;Windows 10&#xff0c;内存最小8GB&#xff0c;推荐16GB&#xff0c;NTFS格式磁盘最少100GB空间Git版本&#xff1a;安装最新版本即可&#xff0c;Git桌面端下载…

电子文档安全管理系统V6.0接口backup存在任意文件下载漏洞

免责声明&#xff1a;本号提供的网络安全信息仅供参考&#xff0c;不构成专业建议。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权&#xff0c;请及时与我联系&#xff0c;我将尽快处理并删除相关内容。 漏洞描述 电子文档安全管理系统 V6.0 reso…

5.3 MVVM模型

一、MVVM的基本概念 MVVM的基本概念&#xff1a;Model、View、ViewModel 组件职责示例内容Model封装业务数据User类&#xff0c;包含姓名、年龄属性View负责UI呈现XAML界面&#xff0c;包含数据绑定ViewModel连接View和Model&#xff0c;处理视图逻辑MainViewModel包含命令和…

python采集淘宝拍立淘按图搜索API接口,json数据示例参考

以下是关于淘宝拍立淘按图搜索API接口的详细说明及JSON数据示例&#xff1a; 一、接口概述 淘宝拍立淘按图搜索API接口是淘宝开放平台提供的一项基于图像识别技术的服务&#xff0c;允许开发者通过上传商品图片&#xff0c;获取与图片相似或相同的商品列表。该接口广泛应用于…

每天学一个 Linux 命令(8):ls

大家好,欢迎来到《每天掌握一个Linux命令》系列。在这个系列中,我们将逐步学习并熟练掌握Linux命令,今天,我们要学习的命令是ls。 01 什么是ls命令 在Linux系统中,ls命令是“list”的缩写,其英文全称为“list directory contents”,即“列出目录内容”。该命令非常实用…

00.【Linux系统编程】 Linux初识(云服务器设置CentOS并使用、Xshell链接云服务器)

目录 一、华为云服务器免费体验申请 二、Xshell远程链接创建好的华为云服务器 2.1 下载Xshell 2.2 Xshell远程连接华为云服务器 一、华为云服务器免费体验申请 华为云官网 1. 进入华为云官网&#xff0c;最上面一栏点活动&#xff0c;并进入免费体验中心。 2. 找到含有“…

arm非对齐访问编译器选项

gcc编译选项&#xff1a; -munaligned-access gcc编译选项&#xff1a; -mno-unaligned-access Enables (or disables) reading and writing of 16- and 32- bit values from addresses that are not 16- or 32- bit aligned. By default unaligned access is disabled for…

jmeter线程组高并发(详细讲解)

在 JMeter 中&#xff0c;线程组是测试计划的核心组件&#xff0c;用于定义虚拟用户&#xff08;线程&#xff09;的行为。线程组的属性决定了测试的并发用户数、加载速度、运行时间等。以下是线程组属性的详细讲解&#xff1a; 1. 名称&#xff08;Name&#xff09; 定义&…