文本加密工具类-支持MD5、SHA1、SHA256、SHA224、SHA512、SHA384、SHA3、RIPMD160算法

news2024/11/26 20:30:58

文本加密工具类

    • 1.算法简介
      • 1.1 MD5
      • 1.2 SHA-1
      • 1.3 SHA-2(推荐使用)
      • 1.4 SHA-3(推荐使用)
      • 1.5 RIPEMD-160
    • 2.工具类案例
      • 2.1POM导入
      • 2.2代码编写
      • 2.3 输出示例

1.算法简介

1.1 MD5

MD5 (Message-Digest Algorithm 5)

  • 描述:MD5 是一种广泛使用的哈希算法,它生成一个 128 位(16 字节)的散列值。
  • 用途:最初用于数据完整性检查、密码散列等。
  • 安全性:由于已知的安全漏洞,MD5 不再推荐用于安全性要求高的场景,例如密码存储。但仍然用于某些非安全相关的情景,如数据校验。

1.2 SHA-1

SHA-1 (Secure Hash Algorithm 1)

  • 描述:SHA-1 生成一个 160 位(20 字节)的散列值。
  • 用途:广泛应用于数字签名标准(Digital Signature Standard, DSS)以及其他需要数据完整性的场合。
  • 安全性:由于存在碰撞攻击的风险,SHA-1 已不再被认为是安全的,特别是在密码学安全方面。

1.3 SHA-2(推荐使用)

SHA-2 (Secure Hash Algorithm 2)

  • 描述:SHA-2 是一组散列函数,包括 SHA-224、SHA-256、SHA-384 和 SHA-512,分别生成 224、256、384 和 512 位的散列值。
  • 用途:用于密码存储、数字签名、安全协议等。
  • 安全性:SHA-2 被认为是目前比较安全的散列算法之一,尤其是 SHA-256 和 SHA-512,在大多数安全应用中被广泛推荐使用。

1.4 SHA-3(推荐使用)

SHA-3 (Keccak)

  • 描述:SHA-3 是 NIST 于 2012 年公布的一种新的哈希函数标准,基于 Keccak 算法,提供了多种输出长度(224、256、384 和 512 位)。
  • 用途:SHA-3 被设计用于替代 SHA-2,提供更高的安全性保证。
  • 安全性:SHA-3 被认为是非常安全的,适用于各种密码学安全场景。

1.5 RIPEMD-160

RIPEMD-160 (RACE Integrity Primitives Evaluation Message Digest)

  • 描述:RIPEMD-160 生成一个 160 位(20 字节)的散列值。
  • 用途:常用于比特币等加密货币中,用于地址生成。
  • 安全性:虽然 RIPEMD-160 在加密货币领域被广泛应用,但在其他领域,特别是需要高度安全性的场合,它的使用较少

2.工具类案例

2.1POM导入

	<dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.70</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpkix-jdk15on</artifactId>
            <version>1.70</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>33.2.1-jre</version>
        </dependency>

2.2代码编写

package cn.zhangsan.tools.enums;

/**
 * @ClassName Algorithm
 * @Description TODO
 * @Author ZhangSan_Plus
 * @Date 2024/7/29 20:45
 * @Version 1.0
 **/
public enum Algorithm {
    MD5, SHA1, SHA256, SHA512, RIPEMD160, SHA224, SHA384, SHA3;
}



package cn.zhangsan.tools.utils;

import cn.zhangsan.tools.enums.Algorithm;
import com.google.common.collect.Maps;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;

import java.net.MalformedURLException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import java.util.Base64;
import java.util.Map;

/**
 * @ClassName HashGeneratorUtils
 * @Description TODO
 * @Author ZhangSan_Plus
 * @Date 2024/7/29 20:04
 * @Version 1.0
 **/
public class HashGeneratorUtils {
    static Map<Object, String> map = Maps.newLinkedHashMap();
    static {
        Security.addProvider(new BouncyCastleProvider());
    }
    public static void main(String[] args) {
        String input = "张三";
        try {
            Map<Object, String> hashText = getHashText(input, 4);
            hashText.forEach((k, v) -> System.out.println(k + ":" + v));
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }

    public static String extractDomain(String urlString) {
            try {
                URL url = new URL(urlString);
                return url.getHost();
            } catch (MalformedURLException e) {
                e.printStackTrace();
                return null;
            }
    }
    private static Map<Object, String> getHashText(String text, int digest) throws NoSuchAlgorithmException {
        map.put(Algorithm.MD5, encryption(md5(text), digest));
        map.put(Algorithm.SHA1, encryption(sha1(text), digest));
        map.put(Algorithm.SHA256, encryption(sha224(text), digest));
        map.put(Algorithm.SHA224, encryption(sha256(text), digest));
        map.put(Algorithm.SHA512, encryption(sha384(text), digest));
        map.put(Algorithm.SHA384, encryption(sha512(text), digest));
        map.put(Algorithm.SHA3, encryption(sha3_256(text), digest));
        map.put(Algorithm.RIPEMD160, encryption(ripemd160(text), digest));
        return map;
    }
    private static byte[] md5(String input) throws NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("MD5");
        return digest.digest(input.getBytes());
    }

    private static byte[] sha1(String input) throws NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("SHA-1");
        return digest.digest(input.getBytes());
    }

    private static byte[] sha224(String input) throws NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("SHA-224");
        return digest.digest(input.getBytes());
    }

    private static byte[] sha256(String input) throws NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        return digest.digest(input.getBytes());
    }

    private static byte[] sha384(String input) throws NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("SHA-384");
        return digest.digest(input.getBytes());
    }

    private static byte[] sha512(String input) throws NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("SHA-512");
        return digest.digest(input.getBytes());
    }

    private static byte[] sha3_256(String input) throws NoSuchAlgorithmException {
        MessageDigest digest = null;
        try {
            digest = MessageDigest.getInstance("SHA3-256", "BC");
        } catch (NoSuchProviderException e) {
            throw new RuntimeException(e);
        }
        return digest.digest(input.getBytes());
    }

    private static byte[] ripemd160(String input) throws NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("RIPEMD160");
        return digest.digest(input.getBytes());
    }

    private static String toHexString(byte[] bytes) {
        return Hex.toHexString(bytes);
    }

    private static String toBase64(byte[] bytes) {
        return Base64.getEncoder().encodeToString(bytes);
    }

    private static String toBase64Url(byte[] bytes) {
        return Base64.getUrlEncoder().withoutPadding().encodeToString(bytes);
    }

    private static String toBinary(byte[] bytes) {
        StringBuilder binaryString = new StringBuilder();
        for (byte b : bytes) {
            for (int i = 7; i >= 0; i--) {
                binaryString.append(((b >> i) & 1) == 1 ? '1' : '0');
            }
            binaryString.append("");
        }
        return binaryString.toString().trim();
    }

    private static String encryption(byte[] bytes, int encoding) {
        switch (encoding) {
            case 1:
                return toHexString(bytes);
            case 2:
                return toBinary(bytes);
            case 3:
                return toBase64(bytes);
            case 4:
                return toBase64Url(bytes);
            default:
                return "";
        }
    }
}

2.3 输出示例

在这里插入图片描述

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

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

相关文章

一文理清生产管理的“4管”和“8理”!

一提到生产管理&#xff0c;很多人的第一反应可能是车间里忙碌的身影、流水线上飞速运转的机器&#xff0c;还有一张张密密麻麻的生产计划表。但实际上&#xff0c;生产管理远不止于此。 “科学管理之父”弗雷德里克温斯洛泰勒认为&#xff1a;管理就是确切地知道你要别人干什…

【Python】数据类型之元组

列表&#xff08;list&#xff09;是一个有序且可变的容器&#xff0c;在里面可以存放多个不同类型的元素。 元组&#xff08;tuple&#xff09;是一个有序且不可变的容器&#xff0c;在里面可以存放多个不同类型的元素。 1、定义 元组中的元素与元素之间用逗号相隔&#xf…

mybatis插件代码生成。

mybatis插件代码生成。 第一步连接数据库&#xff1a;第二步&#xff0c;选择数据库表&#xff1a;第三步&#xff0c;进行配置选择第四步、就生成了有关于表的实体类和其他的表数据。 第一步连接数据库&#xff1a; 在右边&#xff0c;拉出数据库的操作栏 输入用户名密码&am…

虚拟机Windows10系统安装QEMU

文章目录 1. QEMU安装1.1 安装准备1.1.1 安装平台1.1.2 软件下载 1.2 安装QEMU1.2.1 找到下载的QEMU软件&#xff0c;双击开始安装1.2.2 设置语言1.2.3 安装向导&#xff0c;点击 Next1.2.4 点击“I Agree”1.2.5 点击Next1.2.6 设置软件安装位置1.2.7 点击 finish1.2.8 编辑系…

Wi-Fi 7信号标志着行业新的关注重点:稳定性

多链路操作和 6GHz 频段保证了比以往更高的可靠性 Wi-Fi 无疑是我们生活中一项广泛使用的成功技术,但它仍存在一些缺陷,如服务质量不稳定、网速较慢或网络总是中断等问题,给人一种可靠性不佳的印象。 随着 Wi-Fi 7 在今年问世,这一代 Wi-Fi 的重点将转向改善其可靠性。以往每…

【C++】STL | vector 详解及重要函数的实现

目录 前言 总代码 vector类框架建立&#xff08;模板与成员变量&#xff09; 构造、析构、swap 与 赋值重载 构造 析构 swap 赋值重载 reserve 扩容&#xff08;重要&#xff01;&#xff01;&#xff09;、size、capacity operator[ ]重载 insert 插入 逻辑讲解 i…

手撸高性能日志系统(一):百万日志,秒秒落盘(小试牛刀篇)

一、需求一丢&#xff0c;谁累成狗 最近由于某些需要&#xff0c;计划手撸一个高性能的日志系统。需求很简单&#xff1a; 1、 不允许丢一条日志信息&#xff08;很重要很重要&#xff09; 2、支持多线程&#xff0c;必须线程安全 3、性能要越优越好&#xff0c;尽量百万可秒级…

【逗老师的无线电】QRZ快速得到Incoming请求的准确QSO时间

各位友台&#xff0c;有没有遇到过别人从QRZ发过来了Incoming的QSO请求&#xff0c;但是我完全不记得QSO的时间和波段&#xff0c;盲猜要猜好久。尤其是下面这种&#xff0c;8月份发来的6月份的通联记录&#xff0c;这我天天FT8&#xff0c;上哪翻当天的记录啊&#xff08;大概…

第6章>>实验6:PS(ARM)端Linux RT与PL端FPGA之间(通过Reg寄存器进行通信和交互)-《LabVIEW ZYNQ FPGA宝典》

1、实验内容 前面第五章入门实验和上一个实验5里面我们向大家展示通过了布尔类型的Reg寄存器通道实现了ZYNQ PS端ARM和PL端FPGA二者之间的开关量交互&#xff0c;抛砖引玉。 从本节实验开始&#xff0c;接下来4个实验我们将着重向大家讲解更为通用和更为全面的4种交互方式&…

研0 冲刺算法竞赛 day27 P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G

P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 考点&#xff1a;哈夫曼树 思路&#xff1a;建优先队列&#xff0c;自动排序&#xff0c;然后每次取出最小两个即可。本来思路是数组的&#xff0c;但是一直写…

这才是你需要的C语言、C++学习路线!

大家好&#xff0c;我已经整理好了关于学习 C 语言和 C 的路径图。 接下来&#xff0c;让我们先聊一些有趣且常见的话题。 这些问题是我经常在私信中收到的&#xff0c;同时也是我在学习过程中曾经感到困惑的地方。 粉丝福利&#xff0c; 免费领取C/C 开发学习资料包、技术视…

Jenkins保姆笔记(2)——基于Java8的Jenkins插件安装

前面我们介绍过&#xff1a; Jenkins保姆笔记&#xff08;1&#xff09;——基于Java8的Jenkins安装部署 本篇主要介绍下基于Java8的Jenkins插件安装。为什么要单独讲一个插件安装&#xff1f;因为一些原因&#xff0c;Jenkins自带的插件源下载几乎都会失败&#xff0c;如图…

小怡分享之Java的String类

前言&#xff1a; &#x1f308;✨之前小怡给大家分享了图书管理系统这个项目&#xff0c;今天小怡给大家分享Java的String类。 1.String类的重要性 String是字符串类型&#xff0c;C语言中没有字符串类型。 Java当中没有说字符串的结尾是 \0这样的说法。C语言中要表示字符串只…

【爬虫实战】利用代理爬取Temu电商数据

引言 在行业竞争激烈、市场变化快速的跨境电商领域&#xff0c;数据采集可以帮助企业深入了解客户需求和行为&#xff0c;分析市场趋势和竞争情况&#xff0c;从而优化产品和服务&#xff0c;提高客户满意度和忠诚度。同时&#xff0c;数据采集可以实时跟踪库存水平和销售情况&…

Windows10上安装SQL Server 2022 Express

Microsoft SQL Server 2022 Express是一个功能强大且可靠的免费数据管理系统&#xff0c;可为轻量级网站和桌面应用程序提供丰富可靠的数据存储&#xff0c;为关系数据库&#xff1a; (1).LocalDB(SqlLocalDB)&#xff1a;是Express的一种轻型版本&#xff0c;该版本具备所有可…

常见中间件漏洞复现之【Tomcat】!

Tomcat介绍 tomcat是⼀个开源⽽且免费的jsp服务器&#xff0c;默认端⼝ : 8080&#xff0c;属于轻量级应⽤服务器。它可以实现 JavaWeb程序的装载&#xff0c;是配置JSP&#xff08;Java Server Page&#xff09;和JAVA系统必备的⼀款环境。 在历史上也披露出来了很多的漏洞 …

Python爬虫实战:利用代理IP爬取百度翻译

文章目录 一、爬取目标二、环境准备三、代理IP获取3.1 爬虫和代理IP的关系3.2 巨量IP介绍3.3 超值企业极速池推荐3.4 IP领取3.5 代码获取IP 四、爬虫代码实战4.1分析网页4.2 寻找接口4.3 参数构建4.4 完整代码 一、爬取目标 本次目标网站&#xff1a;百度翻译&#xff08;http…

Java I/O (Input/Output)——文件字节流

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java SE 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Java I/O 简介 Java I/O&#xff08;输入/输出&#xff09;是 Java 程序中…

抖音ip地址怎么换到别的地方

在数字化时代&#xff0c;抖音作为一款风靡全球的短视频社交平台&#xff0c;让我们的生活充满了无限乐趣与创意。然而&#xff0c;有时我们可能希望自己的抖音能够显示一个不同于当前所在地的IP地址&#xff0c;无论是出于隐私保护、还是其他个性化需求。那么&#xff0c;如何…

Linux学习记录(三)-----文件io和标准io的区别

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言文件IO和标准IO的区别1.\r和\n的区别2.缓冲2.1缓冲区的概念2.2.缓冲区的分类 3.文件IO和标准IO的区别 前言 文件IO和标准IO的区别 1.\r和\n的区别 \r 回车操作…