密碼加密
摘要:
密碼加密
訊息摘要(資料的指紋)
定義
對不固定的訊息(字串,一段文字,一個檔案),通過一種特定的演算法,得到一個固定長度的文字,固定長度的文字叫做訊息摘要
比如我是程式員
經過特定的演算法之後,得到了訊息摘要為:...
密碼加密
訊息摘要(資料的指紋)
定義
- 對不固定的訊息(字串,一段文字,一個檔案),通過一種特定的演算法,得到一個固定長度的文字,固定長度的文字叫做訊息摘要
-
比如
我是程式員
經過特定的演算法之後,得到了訊息摘要為:adaf02515dfds7885csdfcdsc
作用
- 資料完整性的檢驗技術,我們將文字轉換為訊息摘要,然後比較訊息摘要的值是否相等,如果相等那麼表示兩種文字相同
特性
- 不可逆的,不能從訊息摘要再得到原來的文字
特定的演算法
- MD5
- SHA
實現步驟
新增依賴jar包
-
commons-codec
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency>
測試MD5Hex
- 得到的是32位的16進位制的字串
@Test public void test1(){ String str1="你們好,未來的程式設計師!"; String strMessageString=DigestUtils.md5Hex(str1); System.out.println(strMessageString); } //讀取檔案 @Test public void test2() throws IOException{ InputStream inputStream=new FileInputStream(new File("/home/chenjiabing/Documents/Blog/AOP.md")); String message=DigestUtils.md5Hex(inputStream); System.out.println(message); }
密碼加密
- 避免在資料庫中明文儲存密碼,通過訊息摘要技術對密碼進行加密
明文
- 沒有加密的文字(字串),能看懂的文字
密文
- 經過加密後的文字(字串),看不出來明文的意思
加鹽處理salt
- 為了提高密碼的安全性
- 就是在使用者的密碼之後隨便新增一個字串,然後連線在一起生成摘要,那麼即使獲取摘要,也不會被破解
@Test public void test3(){ String str1="123456"; String salt="這個是加鹽處理";//需要加鹽,隨便定義一個字串 String message=DigestUtils.md5Hex(str1+salt);//獲取加鹽之後的訊息摘要 System.out.println(message); }
例項
密碼的安全性處理
- 涉及到密碼: 登入,註冊,修改密碼
實現
-
建立一個
MD5Password工具
類,用於加密密碼
/** * 密碼加密的類 * @author chenjiabing */ public class MD5Password { private final static String SALT="加油,騷年!";//加鹽處理 /** * 獲取加密之後的密碼 * @param password 使用者輸入的密碼 * @return加密之後的密碼 */ public staticString getMd5Password(String password){ return DigestUtils.md5Hex(password+SALT);//使用了加鹽處理 } }
- 在註冊的時候對輸入的密碼進行加密儲存到資料庫中
/** * 註冊 * 1. 呼叫selectUserByUserName(User user)方法判斷使用者名稱是否存在,返回物件u * 2. 判斷u是否為null, * 3. 如果為null,呼叫insertUser(user)方法新增 * 4. 如果不為null,丟擲異常提示controller使用者名稱存在(UserNameAlreadyExistException) */ public void register(User user) throws UserNameAlreadyExistException { User u=userMapper.selectUserByUserName(user.getUsername());//呼叫usermapper中的方法 if (u!=null) {//如果u不為null,表示使用者名稱已經存在與資料庫中,不可以再次註冊了,因此丟擲異常 throw new UserNameAlreadyExistException("使用者名稱已經存在,請重新輸入!!!"); }else {//如果u==null,表示使用者名稱不存在,可以新增 //獲取加密之後的密碼 String md5Password=MD5Password.getMd5Password(user.getPassword()); //將加密之後的密碼設定到user中,儲存到資料庫中 user.setPassword(md5Password); userMapper.insertUser(user);//直接呼叫持久層方法插入資料即可 } }
- 在登入的時候,將使用者輸入的密碼進行加密獲取到加密之後的密碼,然後和資料庫中的密碼比較
/** * 登入方法 * 1. 通過selectUserByUserName返回user物件 * 2.判斷user是否為null * 3.如果user=null,丟擲UserNotFoundException異常 * 4.如果user!=null,那麼驗證其中的密碼是否正確 * 5.如果密碼不匹配,丟擲PassWordNotMatchException異常 * 6. 如果密碼匹配,那麼返回user物件 * @throws UserNotFoundException * @throws PassWordNotMatchException */ public User login(String userName, String passWord) throws UserNotFoundException, PassWordNotMatchException { User user=userMapper.selectUserByUserName(userName);//根據使用者名稱查詢,返回user物件 if (user==null) {//user為null,表示使用者名稱不存在 throw new UserNotFoundException("使用者名稱不存在"); }else {//如果使用者名稱存在,驗證密碼 //獲取加密之後的密碼,實際是一個訊息摘要 String md5Password=MD5Password.getMd5Password(passWord); //使用加密之後獲取的訊息摘要和資料庫中對應的密碼比較 if (md5Password.equals(user.getPassword())) {//如果密碼匹配 return user;//返回user物件即可 }else {//如果密碼不相同,那麼直接丟擲密碼不匹配的異常即可 throw new PassWordNotMatchException("密碼不匹配"); } } }
- 在修改中,將舊密碼加密後和資料庫中的密碼比較,並且將新密碼加密更新到資料庫中
/** * 修改密碼 * 1. 根據id查詢使用者資訊,返回user * 2. 如果user=null,丟擲使用者不存在的異常 * 3. 如果user!=null,比較user中的密碼和使用者輸入的舊密碼oldPassword是否相同 * 4. 如果密碼不相同,丟擲密碼不匹配的異常 * 5. 如果密碼相同,表示使用者輸入的舊密碼是正確的,那麼更新密碼即可 */ public void updatePassword(Integer id, String oldPassword, String newPassword) throws UserNotFoundException, PassWordNotMatchException { User user=userMapper.seletUserById(id);//根據id查詢,返回user物件 if (user==null) {//如果使用者不存在 throw new UserNotFoundException("當前登入的使用者不存在");//丟擲使用者不存在的異常 }else {//如果當前登入的使用者存在 //獲取舊密碼的加密之後的密碼 String oldMd5Password=MD5Password.getMd5Password(oldPassword); //使用加密之後的密碼和資料庫中的密碼比較 if (!user.getPassword().equals(oldMd5Password)) { //如果返回的user物件中的密碼和使用者輸入的舊密碼不匹配 throw new PassWordNotMatchException("輸入的舊密碼不匹配"); }else {//如果輸出的舊密碼正確 User u1=new User();//建立User物件,封裝修改所需的引數 //獲取加密之後的新密碼 String newMd5Password=MD5Password.getMd5Password(newPassword); u1.setPassword(newMd5Password);//封裝新密碼,其中是加密之後的密碼 u1.setId(id);//封裝id userMapper.update(u1);//呼叫修改的方法 } } }