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;}}
}

Java加密工具类EncryptUtils相关推荐

  1. JAVA加密工具类实例

    工具类还是老套路,要让用户可扩展,同时提供一个基础工具即可,本文分享BeginCode的用户密码加密工具类的使用, 如果不为了扩展性,可以写成工具类即可,提供两个静态方法如下 一个方法是直接MD5加密 ...

  2. java 加密工具类

    /*** 加密工具类* @version 1.0* @date 2019-09-02 0:41**/ public class EncryptUtils {/*** 盐值生成的长度,需要的长度除以二* ...

  3. 加密工具类 - CryptoUtils.java

    加密工具类,包含MD5,BASE64,SHA,CRC32的加密与解密方法. 源码如下:(点击下载  - CryptoUtils.java.commons-io-2.4.jar.commons-code ...

  4. md5加密工具类_贼好用的 Java 工具类库! GitHub 星标 10k+,你在用吗?

    来源:ryanc.cc/archives/hutool-java-tools-lib 简介 Hutool是Hu + tool的自造词,前者致敬我的"前任公司",后者为工具之意,谐音 ...

  5. java在线支付---04_编写易宝支付的客户端加密工具类

    2013/5/30 04_编写易宝支付的客户端加密工具类 创梦综合技术qq交流群:CreDream:251572072 ---------------------------------------- ...

  6. java 随机md5_java常用工具类 Random随机数、MD5加密工具类

    本文实例为大家分享了java常用工具类的具体代码,供大家参考,具体内容如下 random随机数工具类 package com.jarvis.base.util; import java.util.ra ...

  7. Java教程:微信排序并加密工具类

    Java教程:微信排序并加密工具类 源码: import cn.bsit.commons.md5.MD5Utils;import java.util.Arrays; import java.util. ...

  8. Java实现几种加密工具类

    在我们的程序员之路上,肯定少不了加密的协助,比如最常见的MD5与sha这两种加密,这次我给大家带来的是不用任何操作,直接粘上就能用的加密工具类(懒惰程序员的福音),好了话不多说,直接如下: impor ...

  9. 一、java项目常用工具类之加密工具类

    项目环境: jdk1.8+spring4.3.12 一.问题描述及试用场景: 在项目规范中,有时需要对一些数据进行加密解密,常见的就是前后端加密参数在网络上传输.一方面,数据在网络上是以加密的方式传输 ...

最新文章

  1. Linux那些事儿之我是Sysfs(1)sysfs初探
  2. vim编辑文章后不能修改
  3. axure 下拉多选 元件_Axure教程:下拉多选列表集合(多选下拉列表+单选下拉列表+分级下拉列表)...
  4. LTE: 系统内移动性知识点总结
  5. 常见的Java WEB服务器
  6. 逻辑运算符和||与(和|)的区别
  7. 国内“重量级”单体数据中心开始运营 火了这个县
  8. 化工设备与反应器 第三章 直梁的弯曲
  9. boost::hana::greater_equal用法的测试程序
  10. jw摄像_Java命令行界面(第17部分):jw-options
  11. 搞生物的速看!有了它,30分钟可以把一天的工作都给干完!
  12. 【实习生笔试面试题】2013年搜狐SOHU实习生技术笔试题
  13. idea mac 查找文件快捷键_idea for mac 最全快捷键整理
  14. 不越狱 继续逆向 微信运动
  15. FL Studio 20.8中文进阶高级完整版 安装下载教程
  16. ICCV2021 多目标跟踪(MOT)汇总
  17. 文本加密(PTA厦大慕课)
  18. 2021充电必备:推荐一些免费的电子书网站及TXT阅读器
  19. Excel数据分析(八)图表
  20. sublime text 3 插件 OmniMarkupPreviewer 报404解决办法

热门文章

  1. [Excel]用vlookup和Column组合,轻松转移一整个表数据
  2. 面条html5,6道面条分享,味道都不错,做法也简单
  3. 图神经网络17-DGL实战:节点分类/回归
  4. 项目二 基于单片机的八层电梯
  5. ATU中GSM Layer3
  6. 多个应用连接wifi热点的切换问题--WifiConfiguration的添加--Android M
  7. python爬虫系列(2):分析Ajax 爬取搜狗高清壁纸
  8. 测序平台和测序技术是怎么对应的?
  9. 计算机教师评语,小学信息技术教师-评语
  10. myBatis 简单的增删改查