Flask接口签名sign原理与实例代码浅析
621
2023-03-16
Springboot实现密码的加密解密
现今对于大多数公司来说,信息安全工作尤为重要,就像京东,阿里巴巴这样的大公司来说,信息安全是最为重要的一个话题,举个简单的例子:
就像这样的密码公开化,很容易造成一定的信息的泄露。所以今天我们要讲的就是如何来实现密码的加密和解密来提高数据的安全性。
在这首先要引入springboot融合mybatis的知识,如果有这方面不懂得同学,就要首先看一看这方面的知识:
推荐大家一个比较好的博客: 程序猿DD-翟永超 http://blog.didispace.com/springbootmybatis/
为了方便大家的学习,我直接将源代码上传:
1.pom.xml
2. AppTest.java
package com;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AppTest {
public static void main(String[] args) {
SpringApplication.run(AppTest.class, args);
}
}
3.User.java
package com.entity;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
4.UserController.java
package com.controller;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.dao.UserDao;
import com.entity.User;
@Controller
public class UserController {
@Autowired
private UserDao userDao;
@RequestMapping("/regist")
public String regist() {
return "regist";
}
@RequestMapping("/login")
public String login() {
return "login";
}
@RequestMapping("/success")
public String success(HttpServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password");
userDao.save(username, password);
return "success";
}
@RequestMapping("/Loginsuccess")
public String successLogin(HttpServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password"); ///123456
User user = userDao.findByUname(username);
if(user.getPassword().equals(password)) {
return "successLogin";
}
return "failure";
}
}
5.UserDao.java
package com.dao;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.entity.User;
@Mapper
public interface UserDao {
@Insert("INSERT INTO LOGIN_NINE VALUES(#{username}, #{password})")
void save(@Param("username")String username,@Param("password")String password);
@Select("SELECT * FROM LOGIN_NINE WHERE username= #{username}")
User findByUname(@Param("username")String username);
}
6.application.properties
spring.datasource.url=jdbc:oracle:thin:@10.236.4.251:1521:orcl
spring.datasource.username=hello
spring.datasource.password=lisa
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
7.还有一些静态HTML
(1.)regist.html
h1 {
text-align:center;
font-size:35px;
color:red;
}
div {
text-align:center;
}
div input {
margin:10px;
}
用户名
密码
(2.)login.html
h1 {
text-align:center;
font-size:35px;
color:red;
}
div {
text-align:center;
}
div input {
margin:10px;
}
请输入用户名
请输入密码
(3.)success.html
h1 {
text-align:center;
font-size:60px;
color:green;
}
span {
font-size:30px;
color:green;
}
(4.)failure.html
登录失败
(5.)successLogin.html
success
代码的格式如下:
完成了这一步的话首先运行一下AppTest看是否出错,如果有错,自己找原因,这里就不和大家讨论了,写了这么多,才要要进入正题了
本文采取的是EDS的加密解密方法,方法也很简单,不用添加额外的jar包,只需要在UserController上做出简单的修改就可以了:
*****UserController.java
package com.controller;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.dao.UserDao;
import com.entity.User;
@Controller
public class UserController {
@Autowired
private UserDao userDao;
@RequestMapping("/regist")
public String regist() {
return "regist";
}
@RequestMapping("/login")
public String login() {
return "login";
}
/**
* EDS的加密解密代码
*/
private static final byte[] DES_KEY = { 21, 1, -110, 82, -32, -85, -128, -65 };
@SuppressWarnings("restriction")
public static String encryptBasedDes(String data) {
String encryptedData = null;
try {
// DES算法要求有一个可信任的随机数源
SecureRandom sr = new SecureRandom();
DESKeySpec deskey = new DESKeySpec(DES_KEY);
// 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(deskey);
// 加密对象
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key, sr);
// 加密,并把字节数组编码成字符串
encryptedData = new sun.misc.BASE64Encoder().encode(cipher.doFinal(data.getBytes()));
} catch (Exception e) {
// log.error("加密错误,错误信息:", e);
throw new RuntimeException("加密错误,错误信息:", e);
}
return encryptedData;
}
@SuppressWarnings("restriction")
public static String decryptBasedDes(String cryptivTEoData) {
String decryptedData = null;
try {
// DES算法要求有一个可信任的随机数源
SecureRandom sr = new SecureRandom();
DESKeySpec deskey = new DESKeySpec(DES_KEY);
// 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(deskey);
// 解密对象
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, key, sr);
// 把字符串进行解码,解码为为字节数组,并解密
decryptedData = new String(cipher.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(cryptData)));
} catch (Exception e) {
throw new RuntimeException("解密错误,错误信息:", e);
}
return decryptedData;
}
@RequestMapping("/success")
public String success(HttpServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password");
String s1 = encryptBasedDes(password);
userDao.save(username, s1);
return "success";
}
@RequestMapping("/Loginsuccess")
public String successLogin(HttpServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password"); ///123456
User user = userDao.findByUname(username);
if(decryptBasedDes(user.getPassword()).equals(password)) {
return "successLogin";
}
return "failure";
}
}
此时,直接运行Apptest.java,然后在浏览器输入地址:localhost:8080/regist 注册新的账号(我输入的是用户名:小明 密码:123456),如图
此时查看数据库信息
你就会发现密码实现了加密。
当然,下次登陆的时候直接输入相应的账号和密码即可完成登录,实现了解码的过程。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~