发表于: 2020-07-03 21:49:32
1 1963
今天完成的事情:今天完成任务五的拦截器,DES算法加密。屋头空调坏了,下午修空调的师傅过来修,耽搁了时间,没有结束任务五。
明天计划的事情:明天收尾,深度思考加提交任务5。
遇到的问题:对于加密中有中文字符的要在转换字符的时候指定编码方式。
收获:
Md5不可逆的解密办法
运用碰撞暴力解密的方法强行解密,但是也有解密失败的几率,以及使用彩虹码的方式。
DES加密算法
1.DES是一种对称算法,就是加密解密使用同一个密钥。密钥必须是8个字节,即64bit,密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用.
2.DES算法的入口参数有三个:Key、Data、Mode。其中Key就是密钥为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。
3.Base64是用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
代码实现
public class DESUtil {
//默认字符集
private static final String CHARSET = "utf-8";
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() < 8) {
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() < 8) {
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;
}
}
}
Cookie的生成
Cookie属性,max-age 指定Ccookie的生存周期(以秒为单位),path 指定与Cookie关联在一起的网页路径。
跨域传输详情https://www.jb51.net/article/99638.htm
public class CookieUtil {
/**
*
* @param response 响应返回Cookie
* @param name 名称
* @param value 值
* @param maxAge 生存时间
*/
public static void setCookie(HttpServletResponse response,String name,String value,int maxAge){
Cookie cookie = new Cookie(name,null);
cookie.setPath("/");
cookie.setMaxAge(maxAge);
try{
//URLEncoder指定传输中文的编码,防止乱码
cookie.setValue(URLEncoder.encode(value,"utf-8"));
}
catch (UnsupportedEncodingException e){
e.printStackTrace();
}
response.addCookie(cookie);
}
/**
*
* @param cookies
* @param name
* @return
*/
public static Cookie getCookie(Cookie[] cookies,String name){
if(cookies == null){
//客户端没有携带cookie
return null;
}else{
//客户端携带了cookie
for(Cookie cookie:cookies){
if(name.equals(cookie.getName())){
return cookie;
}
}
return null;
}
}
}
评论