使用springboot完成密碼的加密解密

来源:http://www.cnblogs.com/baiyp/archive/2017/11/15/7833610.html
-Advertisement-
Play Games

現今對於大多數公司來說,信息安全工作尤為重要,就像京東,阿裡巴巴這樣的大公司來說,信息安全是最為重要的一個話題,舉個簡單的例子: 就像這樣的密碼公開化,很容易造成一定的信息的泄露。所以今天我們要講的就是如何來實現密碼的加密和解密來提高數據的安全性。 在這首先要引入springboot融合mybati ...


   現今對於大多數公司來說,信息安全工作尤為重要,就像京東,阿裡巴巴這樣的大公司來說,信息安全是最為重要的一個話題,舉個簡單的例子:

                                                                           

就像這樣的密碼公開化,很容易造成一定的信息的泄露。所以今天我們要講的就是如何來實現密碼的加密和解密來提高數據的安全性。

在這首先要引入springboot融合mybatis的知識,如果有這方面不懂得同學,就要首先看一看這方面的知識:

                                      推薦大家一個比較好的博客: 程式猿DD-翟永超 http://blog.didispace.com/springbootmybatis/

為了方便大家的學習,我直接將源代碼上傳:

1.pom.xml

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 2   <modelVersion>4.0.0</modelVersion>
 3   <groupId>com.ninemax</groupId>
 4   <artifactId>spring-Login-test</artifactId>
 5   <version>0.0.1-SNAPSHOT</version>
 6   <packaging>war</packaging>
 7   
 8      <parent>
 9         <groupId>org.springframework.boot</groupId>
10         <artifactId>spring-boot-starter-parent</artifactId>
11         <version>1.3.2.RELEASE</version>
12         <relativePath/>
13     </parent>
14 
15     <properties>
16         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
17         <java.version>1.8</java.version>
18     </properties>
19 
20     <dependencies>
21        
22         <dependency>
23             <groupId>org.springframework.boot</groupId>
24             <artifactId>spring-boot-starter</artifactId>
25         </dependency>
26 
27         <dependency>
28             <groupId>org.springframework.boot</groupId>
29             <artifactId>spring-boot-starter-test</artifactId>
30             <scope>test</scope>
31         </dependency>
32 
33         <dependency>
34             <groupId>org.mybatis.spring.boot</groupId>
35             <artifactId>mybatis-spring-boot-starter</artifactId>
36             <version>1.1.1</version>
37         </dependency>
38 
39         <dependency>
40             <groupId>org.springframework.boot</groupId>
41             <artifactId>spring-boot-starter-web</artifactId>
42         </dependency>
43 
44         <dependency>
45             <groupId>commons-dbcp</groupId>
46             <artifactId>commons-dbcp</artifactId>
47         </dependency>
48 
49         <dependency>
50             <groupId>com.oracle</groupId>
51             <artifactId>ojdbc14</artifactId>
52             <version>10.2.0.3.0</version>
53         </dependency>
54         
55         
56          <dependency>
57             <groupId>org.springframework.boot</groupId>
58             <artifactId>spring-boot-starter-thymeleaf</artifactId>
59         </dependency>
60        
61         
62     </dependencies>
63 
64     <build>
65         <plugins>
66             <plugin>
67                 <groupId>org.springframework.boot</groupId>
68                 <artifactId>spring-boot-maven-plugin</artifactId>
69             </plugin>
70             <plugin>
71                 <groupId>org.apache.maven.plugins</groupId>
72                 <artifactId>maven-surefire-plugin</artifactId>
73                 <configuration>
74                     <skip>true</skip>
75                 </configuration>
76             </plugin>
77         </plugins>
78     </build>
79     
80   
81 </project>
View Code

 

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);
     }
     
}
View Code

 

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 + "]";
    }

}
View Code

 

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";
      }
}
View Code

 

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);
}
View Code

 

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
application.properties

7.還有一些靜態HTML

(1.)regist.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>註冊</title>

<style type="text/css">
    h1 {
      text-align:center;
      font-size:35px;
      color:red;
    }
    div {
      text-align:center;
    }
    div input {
      margin:10px;
    }
</style>
</head>
<body>
     <h1>註冊賬號</h1>
     <div>
     <form action="success" method="post">  
                                  用戶名<input type="text" name="username"/>  <br/>
                                  密碼<input type="password" name = "password"/>  <br/>
            <input type="submit" value="提交"/> &nbsp;
            <input type="reset"/>  
                            
     </form>
     </div>
</body>
</html>
View Code

(2.)login.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>登錄</title>

<style type="text/css">
    h1 {
      text-align:center;
      font-size:35px;
      color:red;
    }
    div {
      text-align:center;
    }
    div input {
      margin:10px;
    }
    
</style>
</head>
<body>
     <h1>歡迎登錄</h1>
     <div>
     <form action="Loginsuccess" method="post">  
                                  請輸入用戶名<input type="text" name="username"/>  <br/>
                                  請輸入密碼<input type="password" name = "password"/>  <br/>
            <input type="submit" value="提交"/> &nbsp;
            <input type="reset"/>     <br/>
            <a href="/regist">註冊賬號</a>                 
     </form>
     </div>
</body>
</html>
View Code

(3.)success.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>註冊成功</title>
<style type="text/css">
   h1 {
     text-align:center;
     font-size:60px;
     color:green;
   }
   span {
     font-size:30px;
     color:green;
   }
</style>
</head>
<body>
<h1>註冊成功</h1>
<a href="/login">返回登錄</a>
</body>
</html>
View Code

(4.)failure.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>登錄失敗</title>

</head>
<body>
         登錄失敗
</body>
</html>
View Code

(5.)successLogin.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>成功</title>
</head>
<body>
      success
</body>
</html>
View Code

代碼的格式如下:

                                                   

完成了這一步的話首先運行一下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 cryptData) {
            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";
      }
}
View Code

此時,直接運行Apptest.java,然後在瀏覽器輸入地址:localhost:8080/regist   註冊新的賬號(我輸入的是用戶名:小明  密碼:123456),如圖

此時查看資料庫信息

                                               

你就會發現密碼實現了加密

當然,下次登陸的時候直接輸入相應的賬號和密碼即可完成登錄,實現瞭解碼的過程

不知道大家完成的怎麼樣了,如果出現問題,可以在下麵進行留言,我會為大家進行解答.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 譯者註:隨著 Node.js 、react-native 等技術的不斷出現,和互聯網行業的創業的層出不窮,瞭解些前端知識,成為全棧攻城師,快速的產出原型,展示你的創意,對程式員,尤其是在創業的程式員來說,越來越重要,下麵我們就跟隨著名國外開發者網站上的熱推文章《Leveling up in CSS》 ...
  • 簡介 普通的UI應用生命周期一般包括Birth, Growth, Death, React中Component的生命周期也是如此,這是一個持續的過程,貫穿整個應用的生命歷程。 階段 1.mounting(birth) 啟動和初始化組件的時候,在這個階段,會發生如下事情: 定義和配置props和sta ...
  • $(document).on("scroll", function () { //真實內容的高度 var pageHeight = Math.max(document.body.scrollHeight, document.body.offsetHeight); //視窗的高度 var viewpo ...
  • 最近在一個剛結束的一個項目中使用到了UEditor編輯器,下麵總結一下遇到的問題以及使用時需要註意的地方: 1. 使用UEditor插件需要先對其進行路徑配置: 在ueditor.config.js文件中 配置 ueditor.config.js文件相對Ueditor文件夾的位置; 2. UEdit ...
  • 終於過完雙十一,伺服器頂住了壓力,不知道為啥,突然的輕鬆,反而感覺有點無所適從,好久沒寫博客了,竟然發現還有人回我,很是開心,問題都是關於阿裡雲的,阿裡雲的吭確實多,其實關鍵在於,官方文檔還是少,出了問題,很多都要靠自己去嘗試,自己去找方法。 好了,今天開始學習bootstrap,自己本身是後端出身 ...
  • 緊跟任何開發工具包的更新都是一件需要持續努力的事,特別是前端開發工具。 把你的註意力從方法和技術的洪流中移開一會,你就可能會錯過什麼! 上周我遇到我的一個前端開發朋友,他很興奮地跟我談論他使用的一些新工具。其中最有意思的是使用 Grunt 來編譯 SCSS。 人們很容易忘記不是每個人都和你走在同一條 ...
  • 效果圖: Css: ...
  • 最近公司開發的h5項目,需要用到sass,所以領導推薦讓我去阮一峰大神的SASS用法指南博客學習,為方便以後自己使用,所以在此記錄。 一、代碼的重用 1、繼承:SASS允許一個選擇器,繼承另一個選擇器。 class2要繼承class1,就要使用@extend命令: 2、Mixin:Mixin有點像C ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...