java中使用sm3算法获取文件hash值

国产加密算法 SM3 国密算法工具-SmUtil 介绍 Hutool针对Bouncy Castle做了简化包装,用于实现国密算法中的SM2、SM3、SM4。 国密算法工具封装包括: 非对称加密和签名:SM2 摘要签名算法:SM3 对称加密:SM4 国密算法需要引入Bouncy Castle库的依赖。 使用 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId 阅读详情

需求背景

工作中需要使用国密算法获取文件hash值做安全校验。

依赖安装 

在pom中添加hutool依赖,注意,只有5.x版本才会有SM3算法支持。

 <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>5.8.16</version>
 </dependency>
 <!-- BouncyCastle 加密库 -->
 <dependency>
     <groupId>org.bouncycastle</groupId>
     <artifactId>bcpkix-jdk15on</artifactId>
     <version>1.70</version>
 </dependency>
 <dependency>
     <groupId>org.bouncycastle</groupId>
     <artifactId>bcprov-jdk15on</artifactId>
     <version>1.70</version>
 </dependency>

代码实现

下面代码是最终版可成功运行的,踩过的坑在下面会介绍,如果能给大家遇到问题时带来一些启发就更好了。

    // 静态方法进行手动注册
    static {
        // 注册BouncyCastle Provider以支持SM3算法
        if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
            Security.addProvider(new BouncyCastleProvider());
            log.info("BouncyCastle Provider已注册");
        }
    }


    /**
     * 使用SM3算法计算文件的hash值
     * @param filePath 文件路径
     * @return SM3 hash值(十六进制字符串)
     */
    public static String calculateSM3Hash(String filePath) {
        try {
            File file = new File(filePath);
            if (!file.exists() || !file.isFile()) {
                log.error("文件不存在或不是有效文件: {}", filePath);
                return null;
            }
            
            SM3 sm3 = new SM3();
            String hash = sm3.digestHex(file);
            log.info("文件 {} 的SM3 hash值: {}", filePath, hash);
            return hash;
        } catch (Exception e) {
            log.error("计算文件SM3 hash值失败: {}, 错误信息: {}", filePath, e.getMessage(), e);
            // 打印可用的Provider信息用于调试
            log.error("当前可用的Security Providers:");
            for (java.security.Provider provider : Security.getProviders()) {
                log.error("Provider: {} - {}", provider.getName(), provider.getVersion());
            }
            return null;
        }
    }

    /**
     * 使用SM3算法计算文件的hash值
     * @param file 文件对象
     * @return SM3 hash值(十六进制字符串)
     */
    public static String calculateSM3Hash(File file) {
        try {
            if (file == null || !file.exists() || !file.isFile()) {
                log.error("文件对象为null或文件不存在或不是有效文件");
                return null;
            }
            
            SM3 sm3 = new SM3();
            String hash = sm3.digestHex(file);
            log.info("文件 {} 的SM3 hash值: {}", file.getAbsolutePath(), hash);
            return hash;
        } catch (Exception e) {
            log.error("计算文件SM3 hash值失败, 错误信息: {}", e.getMessage(), e);
            return null;
        }
    }

    /**
     * 使用SM3算法计算输入流的hash值
     * @param inputStream 输入流
     * @return SM3 hash值(十六进制字符串)
     */
    public static String calculateSM3Hash(InputStream inputStream) {
        try {
            if (inputStream == null) {
                log.error("输入流为null");
                return null;
            }
            
            SM3 sm3 = new SM3();
            String hash = sm3.digestHex(inputStream);
            log.info("输入流的SM3 hash值: {}", hash);
            return hash;
        } catch (Exception e) {
            log.error("计算输入流SM3 hash值失败, 错误信息: {}", e.getMessage(), e);
            return null;
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    log.error("关闭输入流失败: {}", e.getMessage(), e);
                }
            }
        }
    }

遇到问题

运行时首先遇到:No  SuchAlgorithemExcepetion: no such algorithm:  SM3 for provider BC

初步判断原因:项目中没有BouncyCastle依赖,需要添加。添加 BouncyCastle依赖,最开始只有hutool依赖,添加完BouncyCastle依赖后需要在static方法中对Provider进行手动注册,修改完后运行还是会报这个错。

百度问题的时候发现了一位前辈发的博文,写的特别清晰:no such algorithm:sm4 for provider BC报错解决方法_no such algorithm: sm4 for provider bc-优快云博客

参考前辈的问题排查方法,在calculateSM3Hash方法中打印了一下BouncyCastleProvider的版本,果然版本打印为1.38,并非我后面引入的高版本,然后排查项目依赖,发现有其它一个依赖中依赖了1.38的低版本,将低版本排除掉就OK了。

国密算法SM2、SM3、SM4 的JAVA实现(结合Hutool) 阅读详情

相关推荐

国产SM3hash算法加盐使用实例

SM3加盐使用实例使用介绍 环境:java的运行环境 以及添加包含SM3的包(我这里使用的是bouncycastle的jar) 什么要加盐:当hash算法的强碰撞和弱碰撞都保证了的时候,我们还是可以使用彩虹表去"碰撞",从而导致口令泄露,为了防止这一情况,我们可以使用加盐操作,即不是单纯的对口令进行hash然后就存入数据库,而是构造一个盐值来和口令进行混合再进行hash。这样就可以避免彩虹表碰撞的问题了。 话不多说上代码: ```java import java.security.SecureRand

weixin_43836806的博客 8636

Java使用国密SM3对文件或者字符串进行哈希

提到哈希,可能我们就会想到等算法,最近遇到项目,对象要求必须使用国密对文件进行哈希。之前对国密的相关算法接触的比较少,这里介绍一下如何基于Java语言,对文件或数据进行哈希。具体的SM3算法就不再介绍了,网上很多。

做GIS梦的人 2778

我国信息安全中的哈希算法(HASH Algorithm)现状及WJLHA2优势和用法

2020年8月14日,我发布了WJLHA2.0.1版的哈希算法,该算法对标于SHA256、MD5、SM3等哈希算法。感兴趣的朋友可以测试一下碰撞。另外,请测试后再发表评论,至于那些所谓的证明我不想提,去学习一下“生日碰撞”概率。另外请弄明白需要测试一些什么东西再来提测试,否则真的会很没水平。

王杰林(编码技术)的博客 4641

Java实现常用加密算法 —— SM3

在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,其算法公开。据国家密码管理局表示,其安全性及效率与SHA-256相当。本篇主要介绍SM3算法在Java(JDK1.8)中如何实现,借助Java标准库或第三方库,非原始实现,较为基础。一、SM3是什么?SM3算法是一种密码散列函数标准,‌由国家密码管理局发布,‌其安全性和SHA-256相当。‌这种算法主要用于商用密码应用中的数字签名和验证、‌消息认证码生成和验证、‌随机数生成等。

m0_46713218的博客 1万+

嵌入式 GmSSL的SM2,SM3具体使用及对接JAVA的BC库

用嵌入式下的GmSSL库用公钥生成的SM2的密文发送给Java服务端。GmSSL移植到嵌入式可以参考我上一篇博文。

q472599451的专栏 1910

Java项目实战:从MD5迁移到国密SM3哈希算法的完整指南

哈希算法是保障数据完整性和安全性的基础密码学工具,通过将任意长度数据映射为固定长度摘要,确保数据不可篡改。随着MD5和SHA-1等传统算法被证实存在碰撞漏洞,在金融、政务等对安全要求更高的领域,采用更安全的算法成为技术升级的必然选择。国密SM3算法作为我国密码管理局批准的标准杂凑算法,具备与国际主流算法相当的安全性,并满足特定行业的合规性要求。本文基于Bouncy Castle加密库,详细解析了在Java项目中集成SM3算法的完整流程,包括环境配置、核心工具类实现以及密码存储、文件校验、API签名等典型应用

weixin_30564785的博客 347

国密算法(SM3)java语言的实现:利用bcprov和huttol库来实现SM3算法,国产哈希算法

SM3是国产哈希算法,采用一种密码散列函数,其算法公开。SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等。

记录和分享程序人生的点点滴滴 6629

SM3哈希算法逆向实战:从原理到爬虫签名破解

哈希算法作为密码学基础,通过单向函数将任意长度数据映射为固定长度摘要,确保数据完整性与来源认证。其核心原理基于压缩函数迭代,具备抗碰撞性与雪崩效应,在网络安全中用于数字签名与防篡改。在工程实践中,哈希签名广泛应用于API接口认证与数据校验场景。本文聚焦国密SM3算法,详解其消息填充、扩展与迭代压缩流程,并针对爬虫逆向场景,提供通过搜索特征常量、拦截标准库调用、分析参数拼接逻辑等具体方法,定位签名算法与密钥,最终实现本地复现与自动化集成。

weixin_28715953的博客 1043

国密算法SM2与SM3在Java项目中的实践指南

国密算法SM2与SM3在Java项目中的实践指南

乐于分享,共同成长 1303

JAVA实现国密算法SM2/SM3/SM4签名与验签(基于 BouncyCastle)

主要实现了sm2/sm3/sm4算法的签名与验签,以及各个算法签名实用性分析。

weixin_43993310的博客 1974

摘要算法(哈希算法)

1. HASH算法 哈希算法(Hash)又称摘要算法(Digest),它的作用是:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。 哈希函数的主要作用不是完成数据加密与解密工作,它是用来检验数据完整性的重要技术,运算过程具有不可逆性。 通过哈希函数,可以为数据创建"数组指纹"(散列值/哈希值),哈希值通常是一个短的随机字母和数字组成的字符串。消息认证流程如下: 在上述认证流程中,信息收发双方在通信前已经商定好了具体的哈希算法,并且该算法是公开的。 如果消息在传递过程中被篡改,则该消息.

应无所住而生其心 1万+

【SM3哈希算法】算法原理

SM3算法是一种密码散列函数标准,由国家密码管理局发布。它的安全性和SHA-256相当,适用于商用密码应用中的数字签名和验证、消息认证码生成和验证、随机数生成等。

qq_53099119的博客 1万+

可信数据空间:可信空间、区域功能节点、业务功能节点、连接器的关联关系

可信数据空间通过分层架构实现安全数据共享:可信空间作为顶层制定全局规则;区域功能节点协调辖区内功能节点协作;功能节点提供具体数据服务;连接器作为唯一通信通道确保安全交互。系统采用"规则自上而下约束,数据自下而上流动"机制,通过分层治理和标准化连接,在保证数据主权的同时实现跨域协作,具有策略分级执行、去中心化治理等特性,支持灵活扩展业务场景。

友莘居士的博客 1685

常见加密算法——哈希算法(MD)

加密算法是一种利用数学方法对数据进行变换的技术,旨在保护数据的安全,防止未经授权的访问或修改。对称加密算法非对称加密算法和哈希算法(也称为摘要算法)。MD5(Message Digest Algorithm 5)是一种广泛使用的加密哈希函数,它能够接受输入(如一个文件或一段文字)并生成一个固定长度的128位(16字节)的哈希值,通常以32位的十六进制数字表示。MD5算法由罗纳德·李维斯特(Ronald L. Rivest)在1992年设计,旨在确保数据的完整性。

HHX_01的博客 6213

保姆级教程:用Wireshark抓包分析10M汽车以太网PLCA轮询机制(附pcap文件)

本文详细介绍了10M汽车以太网PLCA轮询机制的抓包分析与性能优化方法。通过Wireshark实战教程,解析PLCA协议的时分多址特性、总线型拓扑结构及带宽优化策略,帮助工程师提升车内网络的可靠性和实时性。附赠pcap文件供实践参考。

wdx01234567的博客 239

ROS学习【11】-----基于ubuntu16.04上Gazebo机器人环境搭建的传感器仿真(camera、kinect、Lidar),并通过Rviz进行数据显示

ROS学习-----基于ubuntu16.04上Gazebo机器人环境搭建的传感器仿真目录一、Gazebo环境搭建前的准备1、将搭建模型下载到我们的gazebo环境下2、升级我们的gazebo版本二、创建配置launch文件参数的world文件1、进入工程包mbot_gazebo2、创建文件夹worlds3、进入该文件夹4、创建playground.world文件5、创建room.world文件三...

qq_42451251的博客 3606

【国产加密算法-java实现SM3】

国产加密算法-java实现SM3 一、国产加密算法介绍 国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC)那等等。 其中SM1、SM4、SM7、祖冲之密码(ZUC)是对称算法;SM2、SM9是非对称算法;SM3是哈希算法。目前,这些算法已广泛应用于各个领域中,期待有一天会有采用国密算法的区块链应用出现。 其中SM1、SM7算法不公开,调用该算法时,需要通过加密芯片的接口进行调用;比较少人了解这些算法,在这里对这些国密算法做简

二七零零的博客 1万+

【VS Code插件开发】通用功能(二)

本篇主要从command(命令)、menus(菜单)、快捷键三个方面讲解,都归于通用功能。

编码世界 1万+

Java 国密算法 SM3 散列哈希使用

国密算法 SM3 散列哈希使用 文章目录国密算法 SM3 散列哈希使用引入依赖计算散列哈希 引入依赖 <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.65</version> </dependency> 计算散列哈希 BouncyCastlePro

RisenMyth的博客 3601

【WRF运行报错】总结WRF运行时报错及解决方案(持续更新)

总结WRF运行时报错及解决方案(持续更新)

WW、forever的博客 1629

从Safety Manual到系统安全概念

本文系统阐述了构建功能安全"证据链"的工程化方法论,核心要点包括:1)建立"风险→对策→验证→证据"闭环链条;2)SafetyManual和FMEDA作为关键证据支撑点,前者界定系统安全边界,后者量化诊断覆盖率;3)通过四步法继承芯片安全机制并扩展至系统级;4)形成"设计-分析-验证"三维闭环体系,包括安全目标、技术实现和验证矩阵;5)强调证据链闭环对安全认证和OEM认可的重要性。该方法论实现了从理论要求到工程实践的完整转化,确保安全设计可验证、可

VehSwHwDeveloper的博客 720

利用Java实现SM3算法

本篇文章利用java实现了国密算法SM3,SM3是中国国家密码管理局发布的一种密码杂凑算法(哈希算法),主要用于生成数据的摘要(哈希值),具有抗碰撞性强、单向性等特点,广泛应用于数字签名、数据完整性校验、消息认证等领域,加密步骤主要包括消息填充,消息扩展,迭代压缩。

Yinstar2510的博客 1263

YOLOv8改进策略【卷积层】| DEConv: 强度信息与梯度特征融合的细节增强 适用于小目标与细节目标检测任务

本文记录的是利用 模块优化 的目标检测网络模型。(Detail-Enhanced Convolution,细节增强卷积)的设计旨在,解决 目标检测网络中传统普通卷积缺乏目标细节相关先验、对小目标边缘、目标与背景边界等关键细节捕捉能力不足的问题,同时避免引入额外参数量与计算开销,以适配 对实时推理性能与检测精度的双重需求。DEA-Net: Single image dehazing based on detail-enhanced convolution and content-guided atte

Limiiiing的博客 348

国密算法SM1、SM2、SM3、SM4介绍

密算法是由国家密码管理局发布的一系列国产商用密码标准算法

moonNife的专栏 7955

openclaw-cn : 无法将“openclaw-cn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案

本文主要介绍了openclaw-cn : 无法将“openclaw-cn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案,希望能对使用openclaw-cn的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 10万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

HASH 、MD、SHA、MAC、HMAC、SM3

本文主要讲述一些hash、摘要算法相关的概念,算法具体的实现将不会涉及。阅读完本文你将会了解HASH、MD、SHA、MAC、SM3这些术语的概念。

你好 7478

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: VUE+ElementUI+VueDraggable +El-ImageViewer 实现图片批量上传,支持拖拽控制顺序及图片预览
ADKII
博客等级 码龄10年 21粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值