java加密算法–MD5加密和哈希散列带秘钥加密算法源码

yizhihongxing

下面我来详细讲解Java加密算法——MD5加密和哈希散列带秘钥加密算法源码的完整攻略。

MD5加密算法

概述

MD5(Message Digest Algorithm)是一种单向的哈希算法,可以将任意长度的数据加密成一个128位的二进制串。MD5算法将数据经过多次非线性函数变换和数据干扰后,生成一个唯一的128位散列码,具有很高的安全性,被广泛应用于数据的完整性校验和密码保护等领域。

MD5加密实现

Java中MD5加密的实现可以通过java.security.MessageDigest类来完成。实现代码如下:

import java.security.*;

public class MD5Util {
    /**
     * 对字符串进行MD5加密
     * @param src 源字符串
     * @return 加密后的字符串
     */
    public static String MD5(String src) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] bytes = md.digest(src.getBytes());
            StringBuilder sb = new StringBuilder();
            for (byte b : bytes) {
                String str = Integer.toHexString(b & 0xff);
                if (str.length() == 1) {
                    sb.append("0");
                }
                sb.append(str);
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }
}

上面的MD5Util类提供了一个静态方法MD5,参数为源字符串src,返回值为加密后的字符串。该方法通过MessageDigest.getInstance("MD5")获取MD5加密实例,然后通过md.digest(src.getBytes())方法对传入的源字符串进行加密,并返回加密后的字节数组。再通过字节数组转换为十六进制字符串的方式,得到最终的加密结果。

MD5加密示例

下面通过一个简单的示例来演示MD5加密的使用:

public class Test {
    public static void main(String[] args) {
        String src = "123456";
        String result = MD5Util.MD5(src);
        System.out.println("MD5加密后的字符串为:" + result);
    }
}

以上代码输出的结果为:

MD5加密后的字符串为:e10adc3949ba59abbe56e057f20f883e

哈希散列带秘钥加密算法

概述

哈希散列带秘钥加密算法主要用于对数据进行加密和解密,加密时使用秘钥对数据进行哈希计算,生成一个指定长度的哈希值,并用此哈希值异或原始数据作为加密结果。解密时对加密结果进行异或运算,再使用相同的秘钥进行哈希计算,如果生成的哈希值与加密结果中的哈希值相等,则表示解密成功。

哈希散列带秘钥加密实现

Java中哈希散列带秘钥加密的实现可以通过javax.crypto.KeyGenerator类和javax.crypto.Cipher类来完成。实现代码如下:

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.*;

public class HashEncryptUtil {
    /**
     * 对字符串进行哈希散列带秘钥加密
     * @param src 源字符串
     * @param secretKey 秘钥
     * @param algorithm 加密算法
     * @return 加密后的字符串
     */
    public static String hashEncrypt(String src, String secretKey, String algorithm) {
        try {
            KeyGenerator keyGen = KeyGenerator.getInstance(algorithm);
            SecureRandom random = new SecureRandom(secretKey.getBytes());
            keyGen.init(random);
            SecretKey key = keyGen.generateKey();
            Cipher cipher = Cipher.getInstance(algorithm);
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] bytes = src.getBytes();
            bytes = cipher.doFinal(bytes);
            StringBuilder sb = new StringBuilder();
            for (byte b : bytes) {
                String str = Integer.toHexString(b & 0xff);
                if (str.length() == 1) {
                    sb.append("0");
                }
                sb.append(str);
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 对字符串进行哈希散列带秘钥解密
     * @param encryptedStr 加密后的字符串
     * @param secretKey 秘钥
     * @param algorithm 加密算法
     * @return 解密后的字符串
     */
    public static String hashDecrypt(String encryptedStr, String secretKey, String algorithm) {
        try {
            KeyGenerator keyGen = KeyGenerator.getInstance(algorithm);
            SecureRandom random = new SecureRandom(secretKey.getBytes());
            keyGen.init(random);
            SecretKey key = keyGen.generateKey();
            Cipher cipher = Cipher.getInstance(algorithm);
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] bytes = hex2Bytes(encryptedStr);
            bytes = cipher.doFinal(bytes);
            return new String(bytes);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将十六进制字符串转换为字节数组
     * @param hexString 十六进制字符串
     * @return 字节数组
     */
    private static byte[] hex2Bytes(String hexString) {
        if (hexString == null || hexString.equals("")) {
            return null;
        }
        hexString = hexString.toUpperCase();
        int length = hexString.length() / 2;
        char[] hexChars = hexString.toCharArray();
        byte[] bytes = new byte[length];
        for (int i = 0; i < length; i++) {
            int pos = i * 2;
            bytes[i] = (byte) (char2Byte(hexChars[pos]) << 4 | char2Byte(hexChars[pos + 1]));
        }
        return bytes;
    }

    /**
     * 将字符转换为字节
     * @param c 字符
     * @return 字节
     */
    private static byte char2Byte(char c) {
        return (byte) "0123456789ABCDEF".indexOf(c);
    }
}

上面的HashEncryptUtil类提供了两个静态方法hashEncrypt和hashDecrypt,分别用于对字符串进行加密和解密,参数为源字符串src、秘钥secretKey、加密算法algorithm,返回值为加密或解密后的字符串。加密方法中使用KeyGenerator.generateKey()方法生成一个秘钥;使用Cipher.getInstance(algorithm)方法获取Cipher实例;通过cipher.init(Cipher.ENCRYPT_MODE, key)初始化Cipher实例为加密模式,然后对源字符串进行加密,并将结果转换为十六进制字符串。解密方法中仍然使用KeyGenerator.generateKey()方法生成一个秘钥;使用Cipher.getInstance(algorithm)方法获取Cipher实例;通过cipher.init(Cipher.DECRYPT_MODE, key)初始化Cipher实例为解密模式,然后对加密后的字符串进行解密,并将结果还原为原始字符串。

哈希散列带秘钥加密示例

下面通过一个简单的示例来演示哈希散列带秘钥加密的使用:

public class Test {
    public static void main(String[] args) {
        String src = "123456";
        String secretKey = "abcd1234";
        String algorithm = "AES";
        String encryptedStr = HashEncryptUtil.hashEncrypt(src, secretKey, algorithm);
        System.out.println("加密后的字符串为:" + encryptedStr);
        String decryptedStr = HashEncryptUtil.hashDecrypt(encryptedStr, secretKey, algorithm);
        System.out.println("解密后的字符串为:" + decryptedStr);
    }
}

以上代码输出的结果为:

加密后的字符串为:1d452be8beed39a1f1f4d08723b21ea9
解密后的字符串为:123456

以上就是Java加密算法——MD5加密和哈希散列带秘钥加密算法源码的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java加密算法–MD5加密和哈希散列带秘钥加密算法源码 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 详解如何在Java中实现懒加载

    使用懒加载(Lazy Loading)可以有效地减少程序的资源占用,同时提高程序启动和运行时的响应速度。在Java中,懒加载常用于操作系统资源、数据库连接或其他需要大量资源的操作。 以下是如何在Java中实现懒加载的详细攻略: 1. 创建需要懒加载的对象 首先,需要在Java代码中创建一个需要懒加载的对象,这个对象可以是任何Java对象,例如一个数据库连接、…

    Java 2023年5月27日
    00
  • Java函数式编程(四):在集合中查找元素

    Java函数式编程(四):在集合中查找元素 在Java中,集合是一种非常常用的数据结构。在我们处理集合时,有时候需要从中查找某个元素,这就需要用到一些查找函数。 在这篇文章中,我们将介绍如何使用函数式编程的方式在集合中查找元素。 集合查找函数 在Java 8中,集合提供了一个函数式接口Predicate,用于测试集合中的元素是否符合某个条件。它提供了一个名为…

    Java 2023年5月26日
    00
  • java实现文件编码转换的方法

    首先我们需要明确一下,文件编码转换的方法主要包括文件读取、编码转换以及文件写入三个过程,接下来我将一步一步地讲解如何在Java中实现文件编码转换。 第一步:确定源文件编码 在进行文件编码转换之前,我们需要先了解清楚源文件的编码格式,因为不同的编码格式需要采用不同的解码方式。具体的获取编码格式的方法可以使用Java自带的CharsetDetector类来实现,…

    Java 2023年5月20日
    00
  • JSP 开发之hibernate的hql查询多对多查询

    让我来详细讲解一下“JSP 开发之Hibernate的HQL查询多对多查询”的完整攻略。 首先,我们需要了解HQL是什么。HQL全称Hibernate Query Language,是一种面向对象的查询语言,它类似于SQL语言,但是针对的是Hibernate的对象。通过HQL语句,我们可以从Hibernate的对象中完成各种查询操作。在进行多对多查询时,我们…

    Java 2023年5月20日
    00
  • jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签

    这里是详细的攻略: 1. 发送Ajax请求获取list数据 在jQuery中,要使用$.ajax()函数发送请求从服务器获取list数据,将其赋值给input标签前,需要先确保你能够得到list数据。在$.ajax()函数的success回调函数中处理从服务器返回的数据,如下所示: $.ajax({ url: "your/url/here&quot…

    Java 2023年6月15日
    00
  • Java线程阻塞方法sleep()与wait()的全面讲解

    Java线程阻塞方法sleep()与wait()的全面讲解 简介 在Java多线程编程中,线程状态的控制是非常重要的一个部分。线程可以处于多种状态,例如就绪状态,运行状态,阻塞状态等等。本篇文章主要讲解Java线程阻塞方法sleep()与wait()的使用和区别。 sleep()方法 sleep()方法是Thread类中一个静态方法。sleep()方法的作用…

    Java 2023年5月19日
    00
  • JavaWeb核心技术中Session与Cookie浅析

    JavaWeb核心技术中Session与Cookie浅析 在Java Web应用程序开发中,Session 和 Cookie 是实现用户持久化登录和状态管理的两种基本机制,下面我们将介绍Session与Cookie的概念和使用。 Session 什么是Session? Session 是Web服务端存储客户端会话信息的一种机制。通过使用唯一的session …

    Java 2023年5月20日
    00
  • Spring中校验器(Validator)的深入讲解

    下面是Spring中校验器(Validator)的深入讲解的完整攻略: 什么是校验器? 校验器是Spring框架中用于对入参进行校验的机制,也是一种对提交表单或者JSON数据做前端校验的技术。 校验器的作用 校验器能够帮助我们对参数进行格式和业务上的校验,避免一些无效的操作,提高了操作的正确性和安全性。 校验器的使用 1. 自定义校验器 使用校验器需要按照S…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部