淘淘商城08_登入優化02
阿新 • • 發佈:2018-12-17
傳統註冊流程:
前臺輸入註冊資訊--->後臺接收註冊資訊--->註冊資訊儲存到資料庫-->密碼以明文
安全問題: 鹽值......(隨機數)
加密註冊功能:
前臺: 註冊使用者資訊---> 把資訊加密---> 加時間戳(當前時間的毫秒數)
後臺:
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;
}
}