Java加密工具类EncryptUtils

2023-11-05

Java 提供了一些常见的加密算法,如 MD5、SHA、AES、DES,现将这些实现方法放进加密工具类 EncryptionUtils

  • 使用了 String.format() 来确保每个字节都能够正确的被转化为成十六进制字符串,而且不会因为缺少前导零而导致结果不正确
  • 配合 StringBuilder 提高字符串处理效率
  • 使用标准字符集 UTF-8 替换默认字符集,保证不同系统的兼容性和一致性。
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Base64;

public class EncryptUtils {
	/**
	 * 将字节数组转化为 16 进制字符串
	 * @param bytes 字节数组
	 * @return 16 进制字符串
	 */
	private static String byteArrayToHexString(byte[] bytes) {
		StringBuilder sb = new StringBuilder();
		for (byte b : bytes) {
			sb.append(String.format("%02x", b & 0xff));
		}
		return sb.toString();
	}

	/**
	 * 将 16 进制字符串转化为字节数组
	 * @param hexString 16 进制字符串
	 * @return 字节数组
	 */
	private static byte[] hexStringToByteArray(String hexString) {
		int len = hexString.length();
		byte[] bytes = new byte[len / 2];
		for (int i = 0; i < len; i += 2) {
			bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4)
					+ Character.digit(hexString.charAt(i+1), 16));
		}
		return bytes;
	}

	/**
	 * 对字符串进行 Base64 编码
	 * @param str 需要进行编码的字符串
	 * @return Base64 编码后的字符串
	 */
	public static String encodeWithBase64(String str) {
		byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
		byte[] encoded = Base64.getEncoder().encode(bytes);
		return new String(encoded, StandardCharsets.UTF_8);
	}

	/**
	 * 对 Base64 编码的字符串进行解码
	 * @param encodedStr 需要进行解码的 Base64 编码后的字符串
	 * @return 解码后的字符串
	 */
	public static String decodeWithBase64(String encodedStr) {
		byte[] encoded = encodedStr.getBytes(StandardCharsets.UTF_8);
		byte[] bytes = Base64.getDecoder().decode(encoded);
		return new String(bytes, StandardCharsets.UTF_8);
	}

	/**
	 * 使用 MD5 算法加密字符串
	 * @param str 待加密的字符串
	 * @return 加密后的字符串
	 */
	public static String encryptWithMD5(String str) {
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			byte[] hash = md.digest(str.getBytes());
			return byteArrayToHexString(hash);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 使用 SHA-1 算法加密字符串
	 * @param str 待加密的字符串
	 * @return 加密后的字符串
	 */
	public static String encryptWithSHA1(String str) {
		try {
			MessageDigest md = MessageDigest.getInstance("SHA-1");
			byte[] hash = md.digest(str.getBytes(StandardCharsets.ISO_8859_1));
			return byteArrayToHexString(hash);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 使用 SHA-256 算法加密字符串
	 * @param str 待加密的字符串
	 * @return 加密后的字符串
	 */
	public static String encryptWithSHA256(String str) {
		try {
			MessageDigest md = MessageDigest.getInstance("SHA-256");
			byte[] hash = md.digest(str.getBytes(StandardCharsets.UTF_8));
			return byteArrayToHexString(hash);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 使用 SHA-512 算法加密字符串
	 * @param str 待加密的字符串
	 * @return 加密后的字符串
	 */
	public static String encryptWithSHA512(String str) {
		try {
			MessageDigest md = MessageDigest.getInstance("SHA-512");
			byte[] hash = md.digest(str.getBytes(StandardCharsets.UTF_8));
			return byteArrayToHexString(hash);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 使用 SHA3-256 算法加密字符串
	 * @param str 待加密的字符串
	 * @return 加密后的字符串
	 */
	public static String encryptWithSHA3_256(String str) {
		try {
			MessageDigest md = MessageDigest.getInstance("SHA3-256");
			byte[] hash = md.digest(str.getBytes(StandardCharsets.UTF_8));
			return byteArrayToHexString(hash);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 使用 SHA3-512 算法加密字符串
	 * @param str 待加密的字符串
	 * @return 加密后的字符串
	 */
	public static String encryptWithSHA3_512(String str) {
		try {
			MessageDigest md = MessageDigest.getInstance("SHA3-512");
			byte[] hash = md.digest(str.getBytes(StandardCharsets.UTF_8));
			return byteArrayToHexString(hash);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 使用 AES 算法加密字符串
	 * @param key 密钥
	 * @param str 需要加密的数据
	 * @return 加密后的字符串
	 */
	public static String encryptWithAES(String str, String key) {
		try {
			byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
			SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
			Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
			cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
			byte[] encrypted = cipher.doFinal(str.getBytes(StandardCharsets.UTF_8));
			return Base64.getEncoder().encodeToString(encrypted);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 使用 AES 算法解密字符串
	 * @param key 密钥
	 * @param str 需要加密的数据
	 * @return 解密后的字符串
	 */
	public static String decryptWithAES(String str, String key) {
		try {
			byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
			SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
			Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
			cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
			byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(str));
			return new String(decrypted, StandardCharsets.UTF_8);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 使用 DES 算法加密字符串
	 * @param key 密钥
	 * @param str 需要加密的字符串
	 * @return 加密后的字符串
	 */

	public static String encryptWithDES(String str, String key) {
		try {
			byte[] iv = new byte[8];
			new SecureRandom().nextBytes(iv);

			DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(StandardCharsets.UTF_8));
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			SecretKey secretKey = keyFactory.generateSecret(desKeySpec);

			Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
			IvParameterSpec ivSpec = new IvParameterSpec(iv);
			cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);

			byte[] encrypted = cipher.doFinal(str.getBytes(StandardCharsets.UTF_8));
			byte[] combined = Arrays.copyOf(iv, iv.length + encrypted.length);
			System.arraycopy(encrypted, 0, combined, iv.length, encrypted.length);

			return Base64.getEncoder().encodeToString(combined);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 使用 DES 算法解密字符串
	 * @param key 密钥
	 * @param str 需要加密的字符串
	 * @return 加密后的字符串
	 */
	public static String decryptWithDES(String str, String key) {
		try {
			Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
			DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(StandardCharsets.UTF_8));
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
			cipher.init(Cipher.DECRYPT_MODE, secretKey);
			byte[] decoded = Base64.getDecoder().decode(str);
			byte[] decrypted = cipher.doFinal(decoded);
			return new String(decrypted, StandardCharsets.UTF_8);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 获取字符串的加密值
	 * @param plainText 明文字符串
	 * @param encryptType 加密算法
	 * @return 加密值
	 */
	private static String encrypt(String plainText, String encryptType) {
		try {
			MessageDigest messageDigest = MessageDigest.getInstance(encryptType);
			messageDigest.update(plainText.getBytes(StandardCharsets.UTF_8));
			byte[] bytes = messageDigest.digest();
			return byteArrayToHexString(bytes);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null;
		}
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java加密工具类EncryptUtils 的相关文章

  • JPA 中的复合键

    我想创建一个具有自动生成的主键的实体 而且还有一个由其他两个字段组成的唯一复合键 我如何在 JPA 中执行此操作 我想这样做是因为主键应该用作另一个表中的外键 并且使其复合并不好 在下面的代码片段中 我需要命令和模型是唯一的 pk当然是主键
  • 存根方法时出现 InvalidUseOfMatchersException

    我有这个 TestNG 测试方法代码 InjectMocks private FilmeService filmeService new FilmeServiceImpl Mock private FilmeDAO filmeDao Bef
  • 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?

    我正在基于 MySQL 数据库中的现有表创建 Java 持久性实体 Bean 使用 NetBeans IDE 8 0 1 我在这个表中遇到了一个字段 其类型为 无符号 TINYINT 3 我发现可以执行以下操作将列的类型定义为 unsign
  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • “java.net.MalformedURLException:未找到协议”读取到 html 文件

    我收到一个错误 java net MalformedURLException Protocol not found 我想读取网络上的 HTML 文件 mainfest uses permission android name android
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • Spring Security SAML2 使用 G Suite 作为 Idp

    我正在尝试使用 Spring Security 5 3 3 RELEASE 来处理 Spring Boot 应用程序中的 SAML2 身份验证 Spring Boot 应用程序将成为 SP G Suite 将成为 IDP 在我的 Maven
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐

  • 学习笔记TF043:TF.Learn 机器学习Estimator、DataFrame、监督器Monitors

    线性 逻辑回归 input fn 建立简单两个特征列数据 用特证列API建立特征列 特征列传入LinearClassifier建立逻辑回归分类器 fit evaluate 函数 get variable names 得到所有模型变量名称 可
  • Documentation/x86/entry_64.txt

    Chinese translated version of Documentation x86 entry 64 txt If you have any comment or update to the content please con
  • 【Linux操作系统】【综合实验三 用户帐号、文件系统与系统安全管理】【未整理】

    文章目录 一 实验目的 二 实验要求 三 实验内容 1 创建新用户帐号 并在用户主目录下放置用户文件 2 增添新的用户组 3 掌握chmod chgrp chown等命令的操作 熟悉其选择项功能 4 用户与用户组的修改 删除等操作及用户信息
  • 7.网络爬虫—正则表达式详讲

    7 网络爬虫 正则表达式详讲与实战 Python 正则表达式 re match 函数 re search方法 re match与re search的区别 re compile 函数 检索和替换 检索 替换 findall re findit
  • linux free命令详解

    一 作用 free命令可以显示当前系统未使用的和已使用的内存数目 还可以显示被内核使用的内存缓冲区 二 语法 free 选项 三 选项 默认情况下 即在没有选项的情况下 free 命令显示内存的使用信息 默认按照k b 的计数单位统计 to
  • vue+elementUI上传单张、多张图片/视频至oss

    1 上传单张图片 效果 创建oss js接口配置文件 import request from utils re js 封装的请求文件 import axios from axios export function policy1 retur
  • U盘启动盘安装Windows11 提示此电脑不符合安装windows11的最低系统要求

    1 Windows11安装失败 为了体验 Windows 11 系统 笔者也制作了 Win11 的 U盘 启动盘 来为自己的电脑安装 Windows 11 但是问题发生了 在使用 U盘 启动盘安装过程中提示笔者说 提示此电脑不符合安装win
  • 2023华为OD机试真题【同时出现的整数】

    题目内容 现有两个整数数组 需要你找出两个数组中同时出现的整数 并按照如下要求输出 1 有同时出现的整教时 先按照同时出现次数 整数在两人数组中都出现并目出现次数较少的那人 进行归类 然后按照出现次数从小到大依次按行输出 2 没有同时出现的
  • 攻防世界-level0

    攻防世界 level0 gdb peda run Starting program home giantbranch Desktop study level0 Hello World C Program received signal SI
  • 缓存与数据库的双写一致性

    背景 在高并发的业务场景下 系统的性能瓶颈往往是出现在数据库上 用户并发访问过大 压力都打到数据库上 所以一般都会用redis做缓存层 起到一个缓冲作用 让请求先访问到缓存层 而不是直接去访问数据库 减轻数据库压力 从而减少网络请求的延迟响
  • 你不知道的正则表达式理解

    正则表达式 Regular Expression 简称正则 一 什么是正则 在我们实际开发过程中经常会遇到 有查找符合某些复杂规则的字符串的需要 比如 我们要查找用户名 邮箱 手机号码等 这时候想匹配或者查找符合某些规则的字符串 就可以使用
  • ODS 、DW、 DM、CDC等名词解释

    Q ODS层 DW层 DM层是什么意思 A ODS层 DW层和DM层是数据仓库中的三个重要组成部分 它们分别代表了操作数据存储层 数据仓库层和数据集市层 ODS层 Operational Data Store 操作数据存储层 ODS层是数据
  • 金融ARQC、ARPC验证生成规则

    从2012年从事金融行业的IT开发和实施工作以来 接触最多的就是IC卡片的ARQC等安全验证 只从发行IC卡以来 行业里面安全验证就是使用ARQC来验证交易的安全性 最近在项目中实施改造的时候因为前段读卡上送过来的ARQC到我系统 我系统去
  • kafka对单分区重设偏移量

    一 整个kafka设置偏移量 对kafka整个集群设置偏移量大家使用较多 适合测试环境 丢弃整个消息队列中的数据 kafka consumer groups sh bootstrap server localhost 9092 group
  • arduino笔记28:使用TM1637四位数码管显示模块

    TM1637模块有四个引脚 相比于使用四位数码管的10个引脚 使用TM1637模块可以大大节省引脚数量 四个引脚的意义如下 GND 电源负级 VCC 电源正极 5V DIO 数据IO模块 可以接任意的数字引脚 CLK 时钟引脚 可以接任意的
  • yolo deepsort_基于YOLOv5和DeepSort的目标跟踪

    软硬件环境 windows 10 64bit pytorch yolov5 deepsort YOLOv5 前文 YOLOv5目标检测 和 YOLOv5模型训练 已经介绍过了YOLOv5相关的内容 在目标检测中效果不错 DeepSort S
  • 这可能是介绍Android UvcCamera最详细的文章了

    设备外接usb摄像头 进行基本的预览 拍照 录像 相信有些同学在工作中有遇到类似的需求 uvc camera 不管你之前有没用过 有没遇到过 相信看完这篇文章 一定会带给你一些收获 这篇文章将从下面几点展开讲解 一 什么是UVC 二 UVC
  • MySQL:MySQL8用户与角色管理

    文章目录 MySQL用户管理 创建用户 查看用户权限 添加 删除权限 查询表权限 使用新创建的用户登陆 修改密码 删除用户 mysql用户管理表 caching sha2 password插件 validate password组件的安装和
  • CSS3 连续向下循环播放动画

    向下动画是在 animate css 的基础上进行修改的 效果展示
  • Java加密工具类EncryptUtils

    Java 提供了一些常见的加密算法 如 MD5 SHA AES DES 现将这些实现方法放进加密工具类 EncryptionUtils 使用了 String format 来确保每个字节都能够正确的被转化为成十六进制字符串 而且不会因为缺少