发表于: 2020-08-13 23:03:52
1 1401
今天完成的事情:
1.使用DES对用户ID和登录时间加密和解密。
DES工具类
public class DESUtil {
//字符编码格式
private static final String CHARSET = "utf-8";
/**
* key的输入位数限制常量
*/
private static final int LIMIT = 8;
private static Logger logger = LoggerFactory.getLogger(DESUtil.class);
/**
*
* @param mode 模式,解密或者加密
* @param data 混淆条件,比如登录时间,用户id等
* @param keyData 密码!
* @return
*/
public static byte[] des(int mode, byte[] data, byte[] keyData) {
byte[] ret = null;
if (data != null && keyData != null && keyData.length == 8) {
try {
// 获取Cipher对象,设置加密算法
//使用Cipher进行加密,解密处理,需要创建实例对象并初始化。采用工厂模式创建对象
Cipher cipher = Cipher.getInstance("DES");
//生成key对象
//DES加密算法使用DESKeySpec类,构造方法参数需要为8个字节的密码,也就是传入的keydata
DESKeySpec desKeySpec = new DESKeySpec(keyData);
//转换成key对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(desKeySpec);
//设置Cipher模式,解密或者加密
cipher.init(mode, key);
//返回加密结果,参数为加密内容
ret = cipher.doFinal(data);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
}
return ret;
}
/**
* DES加密
*/
public static String desEncrypt(String data, String keydata) {
if (keydata == null || keydata.length() < LIMIT) {
throw new RuntimeException("加密失败,key不能小于8位");
}
//如果混淆对象为空就返回空
if (data == null) {
return null;
}
try {
//将传入的字符串类型加密数据和使用的Key转换为byte数组
byte[] dataByte = data.getBytes(CHARSET);
byte[] keyByte = keydata.getBytes(CHARSET);
//返回的结果
byte[] dataResult = des(Cipher.ENCRYPT_MODE, dataByte, keyByte);
//new String返回字符串
//Base64用于传输8Bit字节码
return new String(Base64.getMimeEncoder().encode(dataResult));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return data;
}
}
/**
* DES解密
*/
public static String desDecrypt(String data, String keydata) {
if (keydata == null || keydata.length() < LIMIT) {
throw new RuntimeException("解密失败,key不能小于8位");
}
if (data == null) {
return null;
}
try {
byte[] dataByte = data.getBytes(CHARSET);
byte[] keyByte = keydata.getBytes(CHARSET);
byte[] dataResult = des(Cipher.DECRYPT_MODE, Base64.getMimeDecoder().decode(dataByte), keyByte);
return new String(dataResult, CHARSET);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return data;
}
}
}
PS:
javadoc 介绍:
此类为加密和解密提供密码功能。它构成了 Java Cryptographic Extension (JCE) 框架的核心。
创建Cipher 对象:
通过Cipher.getInstance("str") ,传入的值有两种情况:1.算法名称 2.算法/模式/填充
cipher类常量,
我们一般接触发到的就是两个:
ENCRYPT_MODE 表明是此时是加密模式,DECRYPT_MODE 表明此时是解密模式
类方法:
1.getInstance("str");通过传入算法名称,生成对应的cipher对象
2.doFinal();结束多部分加密或解密操作
3.doFinal(多参数);有几个重载方法,结束单部分或(多部分)加解密操作
4.init(); 初始化cipher对象,有多个重载方法,根据传入参数不同进行重载
测试:
@Test
public void testDES(){
User user=new User();
user.setId(1);
User user1=userService.findUser(user);
String token = DESUtil.desEncrypt(user1.getId()+","+ new Date().getTime(),"12345678");
System.out.println("加密后:"+token);
try {
String decryResult = DESUtil.desDecrypt(token,"12345678");
System.out.println("解密后:"+new String(decryResult));
} catch (Exception e1) {
e1.printStackTrace();
}
}
结果:
明天计划的事情:
使用jjwt生成token。
md5加密。
遇到的问题:
收获:
评论