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