今天完成的事情:
了解DES算法和MD5算法
写登录接口
明天计划的事情:
解决登录密码报错问题
写Token工具类
遇到的问题:
DES算法原理和MD5算法原理看的头晕...
收获:
DES算法:
DES 算法是一种常见的分组加密算法,由IBM公司在1971年提出。DES 算法是分组加密算法的典型代表,同时也是应用最为广泛的对称加密算法。本文将详细讲述DES 的原理以及实现过程。
1.1 明文
明文是指没有经过加密的数据。一般而言,明文都是等待传输的数据。由于没有经过加密,明文很容易被识别与破解,因此在传输明文之前必须进行加密处理。例子:156468413616
1.2 密文
密文只是明文经过某种加密算法而得到的数据,通常密文的形式复杂难以识别及理解。
例子:CE48D9FA0367A154836A134FFF5DA829
1.3 密钥
密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数(用户输入的密码?)。
1.4 对称加密
通信双方同时掌握一个密钥,加密解密都是由一个密钥完成的(即加密密钥等于解密密钥,加解密密钥可以相互推倒出来)。双方通信前共同拟定一个密钥,不对第三方公开。
1.5 分组密码
分组密码是将明文分成固定长度的组(三个数字为一组,分段加密,最后合在一起),每一组都采用同一密钥和算法进行加密,输出也是固定长度的密文。
=============================
==================================
DES加密算法:
2.1 分组长度
DES 加密算法中,明文和密文为 64 位分组。密钥的长度为 64 位,但是密钥的每个第八位设置为奇偶校验位,因此密钥的实际长度为56位。
2.2 加密流程
DES 加密算法大致分为 4 个步骤:
(1)初始置换
(2)生成子密钥
(3)迭代过程
(4)逆置换
整个过程流程图:
初步了解,看了一下具体实现,还是难以理解,先了解大概吧
=============================
=============================
DES算法实现:
package com.kbk.util;
import javax.crypto.Cipher;
import java.security.Key;
import java.security.Security;
/**
* DES加密工具类
*/
public class DesUtil {
private static final String ENCRYPT_TYPE = "DES";
private static String defaultKey = "";// 字符串默认键值
private Cipher encryptCipher = null;// 加密工具
private Cipher decryptCipher = null;// 解密工具
public DesUtil() throws Exception {
this(defaultKey);
}
/**
* 指定密钥构造方法
*
* @param strKey
* 指定的密钥
* @throws Exception
*/
public DesUtil(String strKey) throws Exception {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
Key key = getKey(strKey.getBytes());
encryptCipher = Cipher.getInstance(ENCRYPT_TYPE);
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
decryptCipher = Cipher.getInstance(ENCRYPT_TYPE);
decryptCipher.init(Cipher.DECRYPT_MODE, key);
}
/**
* 加密字节数组
*
* @param arr
* 需加密的字节数组
* @return 加密后的字节数组
* @throws Exception
*/
private byte[] encryptStr(byte[] arr) throws Exception {
return encryptCipher.doFinal(arr);
}
/**
* 加密字符串
*
* @param strIn
* 需加密的字符串
* @return 加密后的字符串
* @throws Exception
*/
public String encrypt(String strIn) throws Exception {
return StrConvertUtil.byteArrToHexStr(encryptStr(strIn.getBytes()));
}
/**
* 解密字节数组
*
* @param arr
* 需解密的字节数组
* @return 解密后的字节数组
* @throws Exception
*/
private byte[] decryptStr(byte[] arr) throws Exception {
return decryptCipher.doFinal(arr);
}
/**
* 解密字符串
*
* @param strIn
* 需解密的字符串
* @return 解密后的字符串
* @throws Exception
*/
public String decrypt(String strIn) throws Exception {
return new String(decryptStr(StrConvertUtil.hexStrToByteArr(strIn)));
}
/**
* 从指定字符串生成密钥,密钥所需的字节数组长度为8位。不足8位时后面补0,超出8位只取前8位
*
* @param arrBTmp
* 构成该字符串的字节数组
* @return 生成的密钥
*/
private Key getKey(byte[] arrBTmp) {
byte[] arrB = new byte[8];// 创建一个空的8位字节数组(默认值为0)
// 将原始字节数组转换为8位
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
}
Key key = new javax.crypto.spec.SecretKeySpec(arrB, ENCRYPT_TYPE);// 生成密钥
return key;
}
}
运行:
==========================
==========================
MD5算法:
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的16进制数字串)。
大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为司法机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的MD5“数字指纹”,如果任何人对文件做了任何改动,其MD5也就是对应的“数字指纹”都会发生变化。
第三方支付一般会用到MD5算法,比如微信支付
==========
==========
MD5算法实现:
package com.kbk.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* MD5加密工具类
*
*/
public class Md5Util {
/**
* 根据输入的字符串生成固定的32位MD5码
*
* @param str
* 输入的字符串
* @return MD5码
*/
public final static String getMd5(String str) {
MessageDigest mdInst = null;
try {
mdInst = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
mdInst.update(str.getBytes());// 使用指定的字节更新摘要
byte[] md = mdInst.digest();// 获得密文
return StrConvertUtil.byteArrToHexStr(md);
}
}
运行:
==================
==================
总结:
MD5加密生成的密钥是固定的32位,而Base64加密和DES加密,生成的密钥不是固定。
现在假如要将用户登录的密码进行加密并存入数据库,MD5加密与DES加密相结合的方式是不错的选择。因为DES加密可逆,但是较之MD5难破解些,一般银行卡账户使用的就是这种算法;另外MD5生成固定的32位密钥,便于在数据库中存储,字段长度不变,不会浪费空间。
===============================
===============================
写登录接口:
package com.kbk.controller;
import com.kbk.model.User;
import com.kbk.service.Impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
/**
*
* @Description
* @Author 况博凯
* @Date 2021/02/26 10:14
* @Version 1.0
*
*/
@Controller
public class UserController {
@Autowired
UserServiceImpl userService;
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(){
return "login";
}
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String Login(HttpServletRequest request, Model model, HttpServletResponse response){
//获取账号和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userService.selectUserName(username);
if (username.equals(user.getUsername()) && password.equals(user.getPassword())){
return "LoginSuccessful";
}else {
model.addAttribute("msg", "密码错误");
return "login";
}
}
}
登录页面
<%--
Created by IntelliJ IDEA.
User: kai
Date: 2021/3/3
Time: 21:57
To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<c:set value="${pageContext.request.contextPath}" var="path" scope="page"/>
<div align="center">
<form action="${path}/login" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" placeholder="用户名" name="username"></td>
<td><span>${msg}</span></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"></td>
<td><span>${msg}</span></td>
</tr>
<tr>
<td>
<input type="submit" value="登录">
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
运行:
===============
===============
日志:
评论