在写业务功能的过程中,总是有些敏感数据不能明文的储存,需要在进入数据库时进行加密,相应的在取出使用时就需要进行解密处理。加解密的方法有很多种,这次就只介绍一个在当前项目中用到的一个基于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官方教程:对称加密