不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2021-06-13 00:16:29  修改时间:2023-01-30 17:41:14  分类:Java框架/系统  编辑

在写业务功能的过程中,总是有些敏感数据不能明文的储存,需要在进入数据库时进行加密,相应的在取出使用时就需要进行解密处理。加解密的方法有很多种,这次就只介绍一个在当前项目中用到的一个基于hutool工具包的DES加解密方法。

DES简介

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

密钥加密

密钥加密是发送和接收数据的双方,使用相同的或对称的密钥对明文进行加密解密运算的加密方法。

若加密算法是公开的,那么真正的秘密就在于密钥了,密钥必须是保密的,通常是一个字符串,并且可以按需频繁更换。因此,密钥的长度很重要,因为一旦找到解密密钥也就破译了密码,而密钥的长度越长,密钥空间就越大,遍历密钥空间所花费的时间就越长,破译的可能性也就越小。

注意:因为des为对称加密,只有一对单密钥,所以加密的安全性主要在于密钥上,必须保证加密解密时密钥相同且安全。

使用示例

因为是基于hutool工具包下的des加解密,首先应该选择要使用的hutool包版本并导入。

<dependencies>
    <!--工具包-->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>${hutool.version}</version>
    </dependency>
</dependencies>

hutool工具类的加密解密工具SecureUtil

SecureUtil主要针对常用加密算法构建快捷方式,还有提供一些密钥生成的快捷工具方法。

其中我们需要使用到:

  • SecureUtil.des(key)
  • SecureUtil.generateKey

加密

//生成密钥,并转为字符串,可以储存起来,解密时可直接使用
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue()).getEncoded();
String secretKey = new BASE64Encoder().encodeBuffer(key);
 
//info:需要加密的明文
public String encrypt(String info) {
    byte[] key = new byte[0];
    try {
        key = new BASE64Decoder().decodeBuffer(secretKey);
    } catch (IOException e) {
        e.printStackTrace();
    }
    DES des = SecureUtil.des(key);
    String encrypt = des.encryptHex(info);
    return encrypt;
}

解密

//encrypt:需要解密的密文
public static String decode(String encrypt) {
    byte[] key = new byte[0];
    try {
        key = new BASE64Decoder().decodeBuffer(secretKey);
    } catch (IOException e) {
        e.printStackTrace();
    }
    DES des = SecureUtil.des(key);
    return des.decryptStr(encrypt);
}

偏移

相应的,在des加密的基础上可以在添加一些自己的操作。比如加密后,在密文上固定位置插入某个字符或字符串,或者将密文中的字符进行位置交换等。只要在解密时进行还原就可以,也是可以提高一些数据的安全性。

 


干脆再封装成一个工具类:SecureDESUtil

package com.wenjianbao.util;

import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.DES;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.IOException;

/**
 * DES加密助手
 */
public class SecureDESUtil {
    /**
     * 注意:通过方法 SecureDESUtil.generateSecretKey() 生产一个秘钥Key
     */
    private static final String secretKey = "N1J1Al2KNGE=";

    /**
     * 生成秘钥Key
     */
    public static String generateSecretKey() {
        byte[] keyBytes = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue()).getEncoded();
        return new BASE64Encoder().encodeBuffer(keyBytes);
    }

    /**
     * 获取秘钥Key的byte[]数组
     */
    private static byte[] getKeyBytes() {
        byte[] keyBytes = new byte[0];
        try {
            keyBytes = new BASE64Decoder().decodeBuffer(secretKey);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return keyBytes;
    }

    /**
     * 加密字符串
     */
    public static String encrypt(String info) {
        DES des = SecureUtil.des(getKeyBytes());
        return des.encryptHex(info);
    }

    /**
     * 解密字符串
     */
    public static String decrypt(String encrypt) {
        DES des = SecureUtil.des(getKeyBytes());
        return des.decryptStr(encrypt);
    }
}

 

 

参考:

Hutool官方教程:对称加密

PHP 中 DES 加密、解密 以及和 Java 互通

常用加密、解密算法(MD5、SHA1、DES、AES、RSA)介绍和使用