1. 程式人生 > >淘淘商城08_登入優化02

淘淘商城08_登入優化02

傳統註冊流程:

前臺輸入註冊資訊--->後臺接收註冊資訊--->註冊資訊儲存到資料庫-->密碼以明文

安全問題:  鹽值......(隨機數)

加密註冊功能:

前臺:  註冊使用者資訊---> 把資訊加密---> 加時間戳(當前時間的毫秒數)

 

後臺:

 1.接收前臺傳送的使用者資訊,  

 2.首先判斷時間戳,   5分鐘時間差  後臺獲取時間  9:30分

 3.把使用者資訊進行解密,

 4.密碼的儲存方式,    111111     使用一個演算法生成一個隨機數   98798797dsfsd

  

 隨機數就相當於鹽值, 儲存到鹽的欄位裡.   

 把使用者的   密碼 + 鹽值    再進行加密   儲存到密碼欄位裡

 

登入:

   使用者輸入使用者名稱:

使用者的密碼,使用者的鹽值都可以取到    

 

前臺獲取到使用者輸入密碼-----> 把鹽值取出來---->  使用者輸入的密碼+鹽值(進行加密)-->用這個加密後的資料---->與資料庫裡的密碼欄位對比

 

編寫測試類

package com.taotao.test;

import org.junit.Test;
import org.springframework.util.DigestUtils;

import com.taotao.utils.IDUtils;

public class PwdTest {

	@Test
	public void passwordTest(){
		//註冊的時候要有一個鹽值
		long salt = IDUtils.genItemId();//獲取鹽值
		System.out.println(salt);//154476742917726
		//將鹽值和前臺輸入的密碼一塊加密
		String salt_pwd = "111111"+"154476742917726";
		String str = DigestUtils.md5DigestAsHex(salt_pwd.getBytes());
		System.out.println(str);//獲取加密後的資料f184b725e3aaf406d60579d097ce250f
	}
}

生成隨機數的工具類IDUtils.java

package com.taotao.utils;

import java.util.Random;

/**
 * 各種id生成策略
 * <p>Title: IDUtils</p>
 * <p>Description: </p>
 * @version 1.0
 */
public class IDUtils {

	/**
	 * 圖片名生成
	 */
	public static String genImageName() {
		//取當前時間的長整形值包含毫秒
		long millis = System.currentTimeMillis();
		//long millis = System.nanoTime();
		//加上三位隨機數
		Random random = new Random();
		int end3 = random.nextInt(999);
		//如果不足三位前面補0
		String str = millis + String.format("%03d", end3);
		
		return str;
	}
	
	/**
	 * 商品id生成
	 */
	public static long genItemId() {
		//取當前時間的長整形值包含毫秒
		long millis = System.currentTimeMillis();
		//long millis = System.nanoTime();
		//加上兩位隨機數
		Random random = new Random();
		int end2 = random.nextInt(99);
		//如果不足兩位前面補0
		String str = millis + String.format("%02d", end2);
		long id = new Long(str);
		return id;
	}
	
	public static void main(String[] args) {
		for(int i=0;i< 100;i++)
		System.out.println(genItemId());
	}
}

優化登入程式碼:

package com.taotao.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import com.taotao.mapper.SysUserMapper;
import com.taotao.pojo.ActiveUser;
import com.taotao.pojo.SysUser;
import com.taotao.utils.TaotaoResult;

@Service
public class SysPermissionServiceImpl implements SysPermissionService {
	@Autowired
	private SysUserMapper sysUserMapper;

	@Override
	public TaotaoResult authenticat(String usercode, String password) {
		//1.獲取該物件
		SysUser sysUser = this.getSysUser(usercode);
		//2.判斷該使用者 是否存在
		if (sysUser == null) {
			return TaotaoResult.build(400, "該使用者不存在!");
		}
		
		//判斷使用者的密碼
		//從資料庫中取出該使用者的密碼,該密碼是經過Md5加密的
		String pwd_db = sysUser.getPassword();
		//1.獲取該使用者的鹽值
		String salt = sysUser.getSalt();
		//2.獲取前臺輸入的密碼password
		//3.將鹽值和password相加後加密
		String salt_pwd = salt+password;
		//獲取到該使用者輸入的密碼,將輸入的密碼經過MD5加密
		String pwd_input = DigestUtils.md5DigestAsHex(salt_pwd.getBytes());
		//與資料庫中取出的密碼相比較
		if (! pwd_db.equalsIgnoreCase(pwd_input)) {
			return TaotaoResult.build(400, "使用者名稱或密碼錯誤!");
		}
		
		//將資料新增到activeUser類中
		ActiveUser activeUser = new ActiveUser();
		activeUser.setUsercode(usercode);
		activeUser.setUsername(sysUser.getUsername());
		activeUser.setUserid(sysUser.getId());
		
		return TaotaoResult.ok(activeUser);
	}
	
	public SysUser getSysUser(String usercode){
		SysUser sysUser = new SysUser();    
		sysUser.getUsercode();
		List<SysUser> list = sysUserMapper.getSysUserByCode(usercode);
		if (list !=null && list.size() >0) {
			 return  list.get(0);
		}
		return null;
	}
}