Java SHA-256哈希算法

news2024/9/24 15:26:01

一、SHA-256算法简介

SHA-2(Secure Hash Algorithm 2),一种散列函数算法标准,由美国国家安全局研发,由美国国家标准与技术研究院(NIST)在2001年发布,属于SHA算法之一,是SHA-1的后继者。其下又分为六个不同的算法标准,包括:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。这些变体除了生成摘要的长度、循环运行的次数等一些细微差异之外,基本结构是一致的。

本文主要介绍SHA-256。

SHA-256(Secure Hash Algorithm 256-bit)是一种广泛使用的安全哈希函数算法,SHA-256是SHA-2系列中的一部分,也被称为SHA-224和SHA-256。

SHA-256的主要目标是提供一种算法,可以将输入(无论长度如何)生成为一个固定长度大小【256位(32字节)】的输出值。这个输出值称为哈希值或信息摘要。可以用于验证数据的完整性和来源。

SHA-256主要用于安全相关的应用,如数字签名、文件校验、检测数据是否被篡改等。

SHA-256算法特点:

  • 不可逆性:无法通过散列值反向推导出原始数据;
  • 高强度:对于相同的输入,即使改变一个字符也会得到完全不同的散列值;
  • 哈希冲突率低:即使SHA-256输出的256位二进制值空间庞大,但仍有可能出现不同的输入得到相同的散列值,这种情况称为哈希冲突。

注意:

  • SHA-256本身是一个哈希函数,它并不加密数据,而是生成数据的哈希值(或称消息摘要)。这个哈希值是一个复杂的数字指纹,对于任何给定的输入,它几乎是唯一的。这意味着,即使输入数据只有微小的变化,其哈希值也会发生显著变化。
  • SHA-256生成的哈希值是一个固定长度的值,具体为256位(32字节)的二进制数据。然而,在数据库中存储时,我们通常会将这些二进制数据转换为十六进制(0-9, A-F)字符串表示,以便阅读和查询。因此256位二进制数据将转换为64个字符的十六进制字符串来存储VARCHAR(64)。

SHA-256算法的主要步骤如下:

  1. 初始化一个256位的信息摘要。
  2. 处理数据块。将数据分成512位的数据块,如果不足512位,则通过填充规则补足。
  3. 最终摘要。将填充的数据块通过一系列的位操作转换为一个新的信息摘要。

二、SHA-256算法工具类

public class SHA256Utils {

    /**
     * 使用SHA-256算法计算多个对象(字符串)的联合哈希值
     *
     * @param inputs 输入的对象数组
     * @return 十六进制的哈希值
     */
    public static String getSHA256Hex(Object... inputs) {
        try {
            // 创建MessageDigest实例,初始化为SHA-256算法
            MessageDigest md = MessageDigest.getInstance("SHA-256");

            // 遍历所有输入字符串,将它们添加到哈希计算中
            for (Object input : inputs) {
                // 如果为空,则设置为null字符串
                String inputStr = input== null ? "null" : input.toString();
                md.update(inputStr.getBytes(StandardCharsets.UTF_8));
            }

            // 计算哈希值
            byte[] hash = md.digest();

            // 将字节数组转换为十六进制字符串
            StringBuilder hexString = new StringBuilder();
            for (byte b : hash) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 验证数据的哈希值是否匹配
     *
     * @param storedHash 存储的哈希值
     * @param inputs     要验证的输入对象数组
     * @return 如果哈希值匹配,则返回true;否则返回false
     */
    public static boolean verifyHash(String storedHash, Object... inputs) {
        String computedHash = getSHA256Hex(inputs);
        return computedHash.equals(storedHash);
    }

    public static void main(String[] args) {
        String[] inputs = {"Hello, ", "SHA-256!", " Multiple", " inputs", null};
        String hash = getSHA256Hex(inputs);
        System.out.println("Combined Hash : " + hash);
        System.out.println("Combined Hash1: " + getSHA256Hex("a1"));
        System.out.println("Combined Hash2: " + getSHA256Hex("a1", "a2"));

        // 假设这是之前存储的哈希值
        String storedHash = hash; // 在实际应用中,这将是从某处检索的

        // 验证哈希值
        boolean isVerified = verifyHash(storedHash, inputs);
        System.out.println("Data Verified: " + isVerified);

        String[] inputs2 = {"Hello, ", "SHA-256!", " Multiple", " inputs"};
        boolean isVerified2 = verifyHash(storedHash, inputs2);
        System.out.println("Data Verified2: " + isVerified2);

        // 修改输入后尝试验证
        String[] modifiedInputs = {"Hello, ", "SHA-256?!", " Modified", " inputs"};
        boolean isModifiedVerified = verifyHash(storedHash, modifiedInputs);
        System.out.println("Modified Data Verified: " + isModifiedVerified);
        System.out.println("Modified Data Verified2: " + verifyHash(null, modifiedInputs));
    }
}

在这里插入图片描述

– 求知若饥,虚心若愚。

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

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

相关文章

C++ std::lock_guard和 std::unique_lock

二者都是 C 标准库中用于管理互斥锁(mutex)的 RAII(Resource Acquisition Is Initialization)机制的类。这些类可以确保互斥锁在构造时被获取,在析构时被释放,从而避免死锁和资源泄漏问题。不过&#xff0c…

使用windows批量解压和布局ImageNet ISLVRC2012数据集

使用的系统是windows,找到的解压命令很多都linux系统中的,为了能在windows系统下使用,因此下载Git这个软件,在其中的Git Bash中使用以下命令,因为Git Bash集成了很多linux的命令,方便我们的使用。 ImageNe…

【博士每天一篇文献-算法】 PNN网络启发的神经网络结构搜索算法Progressive neural architecture search

阅读时间:2023-12-23 1 介绍 年份:2018 :Chenxi Liu,Google DeepMind研究科学家;Barret Zoph,OpenAI;Maxim Neumann,Goolge 会议:B区会议, Proceedings of the European conference on computer vision (ECCV). 引用…

【Android14 ShellTransitions】(七)Transition就绪

Transition.onTransactionReady的内容比较长,我们挑重点的部分逐段分析(跳过的地方并非不重要,而是我柿子挑软的捏)。 1 窗口绘制状态的流转以及显示SurfaceControl 注意我们这里的SurfaceControl特指的是WindowSurfaceControll…

Excel办公技巧:制作二级联动下拉菜单

分享制作二级联动下拉菜单的方法,即使数据有增删,菜单也能自动更新! 可以通过先定义名称,再结合数据验证,来做二级联动下拉菜单。 1. 准备数据 首先,我们需要准备好要进行二级联动下拉菜单的数据&#xff…

K8S 上部署 Emqx

文章目录 安装方式一:快速部署安装方式二:定制化部署1. 使用 Pod 直接部署 EMQX Broker2. 使用 Deoloyment 部署 Pod3. 使用 Services 公开 EMQX Broker Pod 服务4. 通过 kubernetes 自动集群 EMQX MQTT 服务器5. 修改 EMQX Broker 的配置6. 赋予 Pod 访…

共享自助台球厅系统,扫码开台,物联网开灯,智能计费

共享自助台球厅系统,扫码开台,物联网开灯,智能计费 含小程序,商家手机端和pc管理端 后端php 前端uniapp 纯开源 可定制 持续更新

常用的点云预处理算法

点云预处理是处理点云数据时的重要部分,其目的是提高点云数据的质量和处理效率。通过去除离群点、减少点云密度和增强特征,可以消除噪声、减少计算量、提高算法的准确性和鲁棒性,从而为后续的点云处理和分析步骤(如配准、分割和重…

实战打靶集锦-31-monitoring

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 ssh服务4.2 smtp服务4.3 http/https服务 5. 系统提权5.1 枚举系统信息5.2 枚举passwd文件5.3 枚举定时任务5.4 linpeas提权 6. 获取flag 靶机地址:https://download.vulnhub.com/monitoring/Monitoring.o…

算法力扣刷题记录 四十九【112. 路径总和】和【113. 路径总和ii】

前言 二叉树篇继续。 记录 四十九【112. 路径总和】和【113. 路径总和ii】 一、【112. 路径总和】题目阅读 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 target…

VsCode远程ssh连接失败:Could not establish connection to XXX

一、问题描述 在VsCode中按下"F1",选择Remote-SSH:Connect to Host 选择一个已经配置好的SSH主机,比如我选择的是192.168.0.104: 结果提示:Could not establish connection to XXX 二、解决方法 观察VsCode的输出信息…

走进NoSql

一、引入 1.1什么是NoSql NoSQL(Not Only SQL)是一组非关系型数据库(或称为非SQL数据库)的统称,它们提供了与传统的关系型数据库不同的数据存储和检索方式。NoSQL数据库通常用于处理大量的、分布式的、非结构化或半结…

STM32使用Wifi连接阿里云

目录 1 实现功能 2 器件 3 AT指令 4 阿里云配置 4.1 打开阿里云 4.2 创建产品 4.3 添加设备 5 STM32配置 5.1 基础参数 5.2 功能定义 6 STM32代码 本文主要是记述一下,如何使用阿里云物联网平台,创建一个简单的远程控制小灯示例。 完整工程&a…

BurpSuit的intruder模块结果进行筛选和导出

文章目录 一、搭建的测试网站第一步 先抓去数据包,查看数据包第二步 可以控制返回信息一条一条的显示第三步 使用intrude模块进行遍历,每次只显示一条用户信息第四步 配置过滤规则第五步 查看结果显示第六步 进行数据导出第七步 查看导出的表格二、实际项目中使用免责声明一、…

PCIe驱动开发(3)— 驱动设备文件的创建与操作

PCIe驱动开发(3)— 驱动设备文件的创建与操作 一、前言 在 Linux 中一切皆为文件,驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应用程序通过对这个名为“/dev/xxx” (xxx 是具体的驱动文件名字)的文件进行相应的操作即…

Azure Repos 仓库管理

从远端仓库克隆到本地 前提:本地要安装git,并且登录了账户 1.在要放这个远程仓库的路径下,打git 然后 git clone https://.. 如果要登录验证,那就验证下,点 generate git credentials,复制password 克隆完后,cd 到克隆的路径, 可以用 git branch -a //查看分…

Spring Cloud环境搭建

🎥 个人主页:Dikz12🔥个人专栏:Spring学习之路📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 1. 开发环境安装 1.1 安装JDK ​1.2 安装MySQL 2. 案列介绍 2.1 …

Linux 命令 —— top命令(查看进程资源占用)

文章目录 top 命令显示信息介绍top 命令使用 top 命令显示信息介绍 top 命令是 Linux/Unix 系统中常用的进程监控工具,可以实时动态显示系统中各个进程的资源占用情况,包括CPU、内存等。 进入 linux 系统,直接输入 top,回车&…

全网超详细Redis主从部署(附出现bug原因)

主从部署 整体架构图 需要再建两个CentOs7,过程重复单机部署 http://t.csdnimg.cn/zkpBE http://t.csdnimg.cn/lUU5gLinux环境下配置redis 查看自己ip地址命令 ifconfig 192.168.187.137 进入redis所在目录 cd /opt/software/redis cd redis-stable 进入配置文件 vim redi…

书生大模型第三关-Git基础

1.任务1: 破冰活动:自我介绍 目标: 每位参与者提交一份自我介绍。 提交地址:https://github.com/InternLM/Tutorial 的 camp3 分支~ 行动: 首先Fork项目到自己Repo中,然后git clone在本地上 然后创建一个…