java - 散列算法 SHA-256 hash值计算

2023-09-22 11:27:00

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


java - 散列算法 SHA-256 hash值计算

1. 散列算法是什么?

散列算法(Hashing Algorithm)是一种将任意长度的输入数据转换为固定长度的输出数据(通常是固定大小的哈希值)的数学函数。

2. 散列算法的主要特征是什么?

  1. 固定长度输出:无论输入数据的大小如何,散列算法生成的哈希值都具有相同的固定长度。

  2. 高效性:散列算法通常具有高度的计算效率,能够快速生成哈希值。

  3. 不可逆性:散列算法是单向的,即从哈希值无法还原出原始数据。这意味着无法通过哈希值来获取原始数据的内容。

  4. 唯一性:不同的输入数据经过散列算法处理后应该生成不同的哈希值,但由于输出长度是固定的,可能会发生哈希冲突,即不同的输入生成相同的哈希值。

  5. 相似输入产生不同输出:即使输入数据只有微小的变化,也会导致生成完全不同的哈希值。这被称为“雪崩效应”。

注意的是散列算法生成固定长度的哈希值,但是哈希值是不可逆的,无法还原回原始数据。

3. 计算SHA-256值有没有可能重复

SHA-256(Secure Hash Algorithm 256-bit)是一个加密哈希函数,它的设计目标是尽可能地降低哈希冲突的概率,即不同的输入数据尽量生成不同的哈希值。SHA-256 算法的输出长度是256位(32字节),这意味着它可以表示的不同哈希值数量非常庞大,大约为 2^256(约等于 1.1579209e+77)个。

由于SHA-256 算法的输出空间如此巨大,理论上来说,对于不同的输入数据,生成相同的SHA-256哈希值的可能性是极其微小的,几乎可以忽略不计。这种微小的可能性通常只有在恶意的攻击(如碰撞攻击)或者算法本身存在漏洞的情况下才会出现。

4. SHA-256算法实现示例


import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA {

    public static String encrypt(String msg){
        MessageDigest digest = null;
        try {
            digest = MessageDigest.getInstance("SHA-256");
            byte[] hash = digest.digest(msg.getBytes());
            StringBuilder hexString = new StringBuilder();
            for (byte b : hash) {
                hexString.append(String.format("%02x", b));
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            // 处理算法不可用的情况
            e.printStackTrace();
        }
        return null;
    }


}

测试类:

import lombok.extern.slf4j.Slf4j;
import org.example.DemoCommonTool;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoCommonTool.class)
@Slf4j
public class SHATest  {

    @Test
    public void test(){
        for (int i = 0;i<20;i++) {
            log.info("========================start==================================");
            log.info(SHA.encrypt("sahihalfh那可是当年卢卡斯电话撒豆i阿娇哦i骄傲啊搜饿哦i回复还是分开爱上了凯迪拉克三分而我和日和坊双方的哈利好的啊合法身份安徽疯狂撒法鲁克安家费 "));
            log.info(SHA.encrypt("还是分开23432 和开发建设234 大佬"));
            log.info(SHA.encrypt("DSHFKJ32"));
            log.info("========================end==================================");
        }
    }

}



测试结果:

在这里插入图片描述

测试成功!!!

更多推荐

Xilinx FPGA未使用管脚上下拉状态配置(ISE和Vivado环境)

文章目录ISE开发环境Vivado开发环境方式1:XDC文件约束方式2:生成选项配置ISE开发环境ISE开发环境,可在如下Bit流文件生成选项中配置。右键点击GenerateProgrammingFile,选择ProcessProperties,在弹出的窗口选择ConfigurationOptions->UnusedP

排序算法-插入排序

属性当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移直接插入排序的特性总结:1.元素集合越接近有序

redis的基础底层篇 zset的详解

一zset的作用以及结构1.1zset作用redis的zset是一个有序的集合,和普通集合set非常相似,是一个没有重复元素的字符串集合。常用作排行榜等功能,以用户id为value,关注时间或者分数作为score进行排序。1.2zset的底层结构1.zset是一个特别的数据结构,一方面它等价于Java的数据结构Map<

Layui快速入门之第十节 表单

目录一:基本用法二:输入框普通输入框输入框点缀前置和后置前缀和后缀动态点缀密码显隐内容清除自定义动态点缀点缀事件三:复选框默认风格标签风格开关风格复选框事件四:单选框普通单选框自定义标题模板单选框事件五:选择框普通选择框分组选择框搜索选择框选择框事件六:表单相关操作API属性渲染常规渲染定向渲染2.7+忽略渲染验证自定

理清SpringBoot CURD处理逻辑、顺序

💗wei_shuo的个人主页💫wei_shuo的学习社区🌐HelloWorld!理清SpringBootCURD处理逻辑、顺序Controller(控制器):控制器接收来自客户端的请求,并负责处理请求的路由和参数解析。控制器通常会调用相应的服务层方法来处理业务逻辑,并将结果返回给客户端。Service(服务层):

keepalived高可用学习 keepalived+nginx高可用负载均衡配置

文章目录Keepalived1、概述2、配置文件说明3、简洁版配置过程4、keepalived+lvs配置5、主lvs不可用可能性6、防止脑裂,解决方式7、keepalived的配置补充keepalived+nginx高可用配置nginx的负载均衡nginx遇到的问题之负载均衡后获取客户端IPnginx配置中upstr

Spring整合RabbitMQ

一、步骤生产者①创建生产者工程②添加依赖③配置整合④编写代码发送消息消费者①创建消费者工程②添加依赖③配置整合④编写消息监听器二、代码生产者工程1.在生产者工程和消费者工程中都导入如下依赖<dependencies><dependency><groupId>org.springframework</groupId><a

单片机C语言实例:32、实用密码锁

程序实例1:延时函数#ifndef__DELAY_H__#define__DELAY_H__/*------------------------------------------------uS延时函数,含有输入参数unsignedchart,无返回值unsignedchar是定义无符号字符变量,其值的范围是0~25

【2023】数据挖掘课程设计:基于TF-IDF的文本分类

目录一、课程设计题目基于TF-IDF的文本分类二、课程设计设置1.操作系统2.IDE3.python4.相关的库三、课程设计目标1.掌握数据预处理的方法,对训练集数据进行预处理;2.掌握文本分类建模的方法,对语料库的文档进行建模;3.掌握分类算法的原理,基于有监督的机器学习方法,训练文本分类器。四、课程设计内容1.数据

【LeetCode-中等题】347. 前 K 个高频元素

文章目录题目方法一:优先队列(基于大顶堆实现)方法二:优先队列(基于小顶堆实现,队列只需维护k个元素)题目方法一:优先队列(基于大顶堆实现)PriorityQueue<int[]>queue=newPriorityQueue<>((a,b)->b[1]-a[1]);优先队列按照队列中的数组的第二个元素从大到小排序((a

华为云云耀云服务器L实例评测|华为云云耀云服务器L实例开展性能评测

作者简介:辭七七,目前大二,正在学习C/C++,Java,Python等作者主页:七七的个人主页文章收录专栏:七七的闲谈欢迎大家点赞👍收藏⭐加关注哦!💖💖华为云云耀云服务器L实例开展性能评测云耀云服务器L实例产品核心卖点评测实例测试环境性能评测指标在MySQL评测场景下的评测数据作为一款专为中小企业和开发者群体设

热文推荐