第十五章 加密演算法實例1--註冊登錄(消息摘要演算法)

来源:http://www.cnblogs.com/java-zhao/archive/2016/01/03/5096941.html
-Advertisement-
Play Games

15.1、原理步驟註冊:註冊時,將用戶密碼加密放入資料庫登錄:登錄時,將用戶密碼採用上述相同的演算法加密,之後再與資料庫中的信息進行比對,若相同,則登錄15.2、實現(這裡採用了SHA256演算法,其他摘要演算法MD5/SHA1/MAC類似)註意:這裡的程式是在我之前寫的一個maven+spring+sp...


15.1、原理步驟

  • 註冊:註冊時,將用戶密碼加密放入資料庫
  • 登錄:登錄時,將用戶密碼採用上述相同的演算法加密,之後再與資料庫中的信息進行比對,若相同,則登錄

15.2、實現(這裡採用了SHA256演算法,其他摘要演算法MD5/SHA1/MAC類似)

註意:這裡的程式是在我之前寫的一個maven+spring+springmvc+mybatis+velocity整合的文章上進行的修改,具體的框架搭建以及資料庫表結構等就不再啰嗦了,自己參考下邊這篇博客:

http://www.cnblogs.com/java-zhao/p/5096811.html

這裡只列出Java類。整個代碼結構如下:

UserController

 1 package com.xxx.web;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.stereotype.Controller;
 5 import org.springframework.web.bind.annotation.RequestMapping;
 6 import org.springframework.web.bind.annotation.RequestParam;
 7 import org.springframework.web.bind.annotation.ResponseBody;
 8 import org.springframework.web.servlet.ModelAndView;
 9 
10 import com.xxx.model.User;
11 import com.xxx.service.UserService;
12 
13 @Controller
14 @RequestMapping("user")
15 public class UserController {
16     
17     @Autowired
18     private UserService userService;
19     
20     @ResponseBody
21     @RequestMapping("register")
22     public boolean register(@RequestParam("username") String username,
23                             @RequestParam("password") String password){
24         
25         return userService.register(username, password);
26     }
27     
28     @RequestMapping("login")
29     public ModelAndView login(@RequestParam("username") String username,
30                               @RequestParam("password") String password){
31         User user = userService.login(username, password);
32         
33         ModelAndView modelAndView = new ModelAndView();
34         if(user == null){
35             modelAndView.addObject("message", "用戶不存在或者密碼錯誤!請重新輸入");
36             modelAndView.setViewName("error");
37         }else{
38             modelAndView.addObject("user", user);
39             modelAndView.setViewName("userinfo");
40         }
41         
42         return modelAndView;
43     }
44 }
View Code

UserService(這裡是加解密的主戰場)

 1 package com.xxx.service;
 2 
 3 import java.io.UnsupportedEncodingException;
 4 import java.security.NoSuchAlgorithmException;
 5 
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.stereotype.Service;
 8 
 9 import com.util.encoder.ShaEncoder;
10 import com.xxx.dao.UserDAO;
11 import com.xxx.model.User;
12 
13 @Service
14 public class UserService {
15     
16     @Autowired
17     private UserDAO userDao;
18     
19     public boolean register(String username, String password){
20         User user = new User();
21         user.setUsername(username);
22         try {
23             user.setPassword(ShaEncoder.encodeSHAHex(password));//對密碼進行sha256加密
24         } catch (NoSuchAlgorithmException e) {
25             e.printStackTrace();
26         } catch (UnsupportedEncodingException e) {
27             e.printStackTrace();
28         }
29         return userDao.register(user);
30     }
31     
32     public User login(String username, String password) {
33         User user = null;
34         try {
35             user = userDao.login(username, ShaEncoder.encodeSHAHex(password));//對密碼進行sha256加密
36         } catch (NoSuchAlgorithmException e) {
37             e.printStackTrace();
38         } catch (UnsupportedEncodingException e) {
39             e.printStackTrace();
40         }
41         return user;
42     }
43 }
View Code

UserDAO

 1 package com.xxx.dao;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.stereotype.Repository;
 5 
 6 import com.xxx.mapper.UserMapper;
 7 import com.xxx.model.User;
 8 
 9 @Repository
10 public class UserDAO {
11     
12     @Autowired
13     private UserMapper userMapper;
14     
15     public boolean register(User user){
16         return userMapper.insertUser(user)==1?true:false;
17     }
18     
19     public User login(String username ,String password){
20         return userMapper.selectByUsernameAndPwd(username, password);
21     }
22 }
View Code

UserMapper

 1 package com.xxx.mapper;
 2 
 3 import org.apache.ibatis.annotations.Insert;
 4 import org.apache.ibatis.annotations.Param;
 5 import org.apache.ibatis.annotations.Result;
 6 import org.apache.ibatis.annotations.Results;
 7 import org.apache.ibatis.annotations.Select;
 8 
 9 import com.xxx.model.User;
10 
11 public interface UserMapper {
12     
13     @Insert("INSERT INTO userinfo(username, password) VALUES(#{username},#{password})")
14     public int insertUser(User user);
15     
16     @Select("SELECT * FROM userinfo WHERE username = #{username} AND password = #{password}")
17     @Results(value = { @Result(id = true, column = "id", property = "id"),
18                        @Result(column = "username", property = "username"), 
19                        @Result(column = "password", property = "password")})
20     public User selectByUsernameAndPwd(@Param("username")String username ,@Param("password")String password);
21 }
View Code

ShaEncoder(這裡基於Commons Codec,即CC實現的Sha256工具類)

 1 package com.util.encoder;
 2 
 3 import java.io.UnsupportedEncodingException;
 4 import java.security.NoSuchAlgorithmException;
 5 import org.apache.commons.codec.digest.DigestUtils;
 6 
 7 public class ShaEncoder {
 8     private static final String ENCODING = "UTF-8";
 9     
10     public static String encodeSHAHex(String data) throws NoSuchAlgorithmException,UnsupportedEncodingException {
11         return new String(DigestUtils.sha256Hex(data.getBytes(ENCODING)));
12     }
13 }
View Code

代碼簡單易懂,自己去看邏輯,然後進行測試即可。

當然我們還可以在上述代碼的基礎上,為密碼加一點鹽(即用一個字元串與密碼相連),然後對加鹽後的字元串進行加密。代碼如下:

 1 package com.xxx.service;
 2 
 3 import java.io.UnsupportedEncodingException;
 4 import java.security.NoSuchAlgorithmException;
 5 
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.stereotype.Service;
 8 
 9 import com.util.encoder.ShaEncoder;
10 import com.xxx.dao.UserDAO;
11 import com.xxx.model.User;
12 
13 @Service
14 public class UserService {
15     
16     private static final String SALT = "nana";//
17     
18     @Autowired
19     private UserDAO userDao;
20     
21     public boolean register(String username, String password){
22         User user = new User();
23         user.setUsername(username);
24         try {
25             user.setPassword(ShaEncoder.encodeSHAHex(SALT+password));//對加鹽的密碼進行sha256加密
26         } catch (NoSuchAlgorithmException e) {
27             e.printStackTrace();
28         } catch (UnsupportedEncodingException e) {
29             e.printStackTrace();
30         }
31         return userDao.register(user);
32     }
33     
34     public User login(String username, String password) {
35         User user = null;
36         try {
37             user = userDao.login(username, ShaEncoder.encodeSHAHex(SALT+password));//對加鹽的密碼進行sha256加密
38         } catch (NoSuchAlgorithmException e) {
39             e.printStackTrace();
40         } catch (UnsupportedEncodingException e) {
41             e.printStackTrace();
42         }
43         return user;
44     }
45 }
View Code

當然,這裡的鹽是一個固定的字元串(在實際使用中,這樣的做法最為常見),我們也可以對每個登錄的用戶使用他自己的姓名作為鹽(這樣每個人的鹽就不一樣了)。

 


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

-Advertisement-
Play Games
更多相關文章
  • hi懶癌是最可怕的癌了吧,在即將迎來本命年時,給自己定下每天必乾的幾件成習慣的事情,望不再鴿!!php是我一直在學習的東西,但總以為php簡單,難點在需要掌握大量的相關知識,其實並不完全對,php也是有演算法好吧,php也值得認真對待,既然決定學了,拿點樣子出來啊,是男人吧。1、PHP一、PHP基.....
  • 1 package com.test; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputSt.....
  • 數組與指針閱讀如下代碼,為何出錯。 1 int main() { 2 char a[] = { "I am a bad boy" }; 3 char * pA = new char[ sizeof( a ) ]; 4 pA = a; 5 6 ...
  • 說到Java web開發,就不得不提Servlet 和 JSP。這兩者是java web開發技術。雖然現在有這麼多的web框架,公司中很少會用這兩個技術來直接開發項目,但是理解了這兩個技術,一則會讓你對web的基礎知識要很深的瞭解,二則學其他的相比來說要更好理解點。一、Servlet1. 什麼是se...
  • 前文中介紹了FlowLayout和BorderLayout 本文我們將會繼續介紹java中的佈局方式(3)GridLayout 網格佈局 這種佈局會將整個容器劃分成M行*N列的網格。如下圖: 由模型圖我們可以知道這種佈局,類似於我們常見的掃雷、計算器等軟體的佈局。這種佈局的構造函數有三種1 G...
  • 2016-01-03 Swith(整數選擇因數):必須是int或char這樣的整數值。 Java中不包含goto語句,但是可以通過標識符實現類似的控制。
  • Django ORM 中的批量操作 在Hibenate中,通過批量提交SQL操作,部分地實現了資料庫的批量操作。但在Django的ORM中的批量操作卻要完美得多,真是一個驚喜。 數據模型定義 首先,定義一個實例使用的django資料庫模型Product,只是象徵性地定義了兩個欄位name...
  • 今天終於開始進行OC的學習了一.首先講了NSLogNSLog是oc裡面的輸出語句,其用法和printf差不多,但是還是有差別的1,NSLog是自動換行的,不用像printf那樣還需要加'\n';2,NSLog在引號面前需要添加@符號,例如: NSLog(@"Hello World"); ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...