第十五章 加密算法实例1--注册登录(消息摘要算法)

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 }

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 }

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 }

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 }

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 }

代码简单易懂,自己去看逻辑,然后进行测试即可。

时间: 2024-11-07 07:10:28

第十五章 加密算法实例1--注册登录(消息摘要算法)的相关文章

深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API

今天是六.一儿童节,祝小朋友们节日快乐!发完此文就带我家小朋友出去玩耍了. 第十五章 Zabbix 协议与API 本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbixagent等程序的场景(例如专用的嵌入式系统)中非常有用.你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成. 15.1 Zabb

第十五章 文件属性类的实现

                  第十五章    文件属性类的实现        根用户的权限也不能是无限大.必须考虑到保护用户的隐私!用户的文件内容.程序代码可设置为根用户也不能观看,只能是文件拥有者可以查看.修改.但根用户可以删除一切非根用户的文件.也可以查看用户的目录.所以,i_mode字符更改如下:      BU16 i_mode; // 描述文件的访问权限:文件的读.写.执行权限  // i_mode.15-13  ftype; 文件类型: 0-符号软连接文件, // 1-硬连接文

Gradle 1.12 翻译——第十五章. 任务详述

有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html 本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41038305 关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qin

【WPF学习】第三十五章 资源字典

原文:[WPF学习]第三十五章 资源字典 如果希望在多个项目之间共享资源,可创建资源字典.资源字典只是XAML文档,除了存储希望使用的资源外,不做其他任何事情. 一.创建资源字典 下面是一个资源字典示例,它包含一个资源: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/wi

C和指针 (pointers on C)——第十五章:输入输出函数

第十五章 输入输出函数 这一章读完的第一感觉就是"呵呵". 如果说上过C语言课,基本上scanf()/printf()算是用的比较熟练了.尤其是那些抽象的格式说明.还有scanf()为什么要加括号. 读过本书前面的内容的话,getchar(),putchar(),gets(),puts()这些应该也问题不大. 再如果的话,你学过计算机图形学,你玩过OpenGL,听说过双缓存机制,那么fflush()也肯定弄明白了. 再加上FILE的操作,输入输出定位刷新删除改名,流的概念. 这一章就会

第十五章 链表

/** 数组与链表的区别:数组易随机访问,链表易插入和删除 链表组成:储存数据元素的数据域,储存下一结点地址的指针域 链表易于插入与删除 lists 的用法????????????????????? *///建立一个图书链表 #include<iostream> #include <string> using namespace std; struct book //第一步: 用于建立节点. class 默认为私有 struct 默认为公有 //节点组成:①数据域 ②指针域(*ne

java(第十五章)

第十五章 一.字符串类String 1.String是一个类,位于java.lang包中 2.创建一个字符串对象的2种方式: String 变量名="值"; String 对象名=new String("值"); 3.字符串的常用方法 3.1 字符串长度--length() 3.2 判断值是否相等 equals() 3.3 判断字符串对象地址是否相同 == 3.4 忽略 大小写 判断 equalsIgnoreCase() 3.5 大小写转换 toLowerCase(

CSS3秘笈复习:十三章&amp;十四章&amp;十五章&amp;十六章&amp;十七章

第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮动元素.关键字:left.right或both. (2).浮动外围元素:让包含浮动元素的<div>也浮动.选择这种方法一定要在浮动容器后面的任何元素中添加一个clear属性,确保浮动元素落到容器的下方. (3).利用overflow : hidden.另一种常见的方法是在外围的样式中添加以下属性:

第十五章 文正学院成绩录入系统

这是13年上半年给文正学院做的一个成绩录入系统,只需要实现成绩录入的功能,嫁接到文正教务系统中.实现的功能如图所示. 王川 2014/5/30 第十五章 文正学院成绩录入系统,布布扣,bubuko.com