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

下面我来详细讲解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日

相关文章

  • 分析python动态规划的递归、非递归实现

    针对“分析Python动态规划的递归、非递归实现”这个主题,我将分为以下几个部分进行完整的讲解。 1. 什么是动态规划 动态规划(Dynamic Programming)是一种通过把原问题分解为相对简单的子问题的方式,以递推的方式求解复杂问题的技术。在动态规划中,我们通常会用到“备忘录”或“DP表”来记录以前求解过的值,从而避免重复计算,提高程序效率。 动态…

    Java 2023年5月26日
    00
  • Java之JSP教程九大内置对象详解(上篇)

    下面我来详细讲解“Java之JSP教程九大内置对象详解(上篇)”的完整攻略。 什么是九大内置对象? JSP的九大内置对象是指在JSP页面中JSP引擎默认提供的九个对象,包括request、response、session、application、page、out、config、pageContext、exception对象。 request对象 reques…

    Java 2023年5月26日
    00
  • Java 定时器(Timer,TimerTask)详解及实例代码

    Java 定时器(Timer,TimerTask)详解及实例代码 什么是定时器 在 Java 中,我们可以使用定时器(Timer)来实现一些定时任务,比如定时执行某个任务或者在一定时间后自动执行某个操作。 在 Java 中,我们可以通过 Timer 类来创建一个定时器对象,然后通过 TimerTask 类来创建一个定时任务对象,最后调用定时器对象的 sche…

    Java 2023年5月20日
    00
  • java8、jdk8日期转化成字符串详解

    Java 8/JDK 8 日期转化成字符串详解 在 Java 8/JDK 8 中,我们有多种选择将日期转化成字符串。本篇文章将会详细讲解一些转化日期的方法。 SimpleDateFormat SimpleDateFormat 是 Java 中一个比较常见的日期格式化工具。使用 SimpleDateFormat 可以将 Date 对象格式化成字符串,也可以将字…

    Java 2023年5月20日
    00
  • PHP实现压缩图片尺寸并转为jpg格式的方法示例

    要实现压缩图片尺寸并转为jpg格式,可以使用PHP语言的GD库来实现。GD库提供了丰富的图像处理功能,可以帮助我们快速地处理图片。以下是步骤: 步骤一:安装GD库 在PHP安装中,GD库一般都是预装的,我们可以通过phpinfo()函数来确认是否已经开启GD库。如果没有开启,需要修改php.ini文件,把extension=gd.so前面的分号去掉即可。 步…

    Java 2023年5月23日
    00
  • Hadoop中的压缩与解压缩案例详解

    下面就为您详细讲解“Hadoop中的压缩与解压缩案例详解”的完整攻略。 什么是Hadoop中的压缩与解压缩? 在Hadoop中,由于数据量通常都很大,为了提高数据的存储效率和运行效率,我们经常需要将数据进行压缩。同时,在MapReduce的过程中,也需要对数据进行解压缩以方便处理。 Hadoop支持多种数据压缩格式,包括Gzip、Bzip2、LZO等。在使用…

    Java 2023年5月20日
    00
  • Java异常 Factory method’sqlSessionFactory’rew exception;ested exception is java.lang.NoSuchMethodError:

    题目中描述的异常信息 “Factory method ‘sqlSessionFactory’ threw exception; nested exception is java.lang.NoSuchMethodError:” 实际上提供了有用的提示信息,可以作为排除问题的起点。异常信息中的 “Factory method ‘sqlSessionFactor…

    Java 2023年5月27日
    00
  • Java中String判断值为null或空及地址是否相等的问题

    下面我来详细讲解一下Java中String判断值为null或空及地址是否相等的问题的攻略。 判断字符串是否为空 在Java中,判断字符串是否为空可以用以下三种方式。 1.使用length()方法 String str = ""; if (str.length() == 0) { System.out.println("字符串为空…

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