<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天看到一篇文章說使用MD5對密碼進行加密儲存也還不能做到很安全,網上有線上解密MD5的網站,我一搜,還真有。接下來我嘗試對我儲存在資料庫中的密碼進行解密操作:
可以看到成功將我的密碼解密出來,這讓我很吃驚,因為我們都知道MD5演演算法是不可逆的,因為它是其是一種雜湊函數,使用的是hash演演算法,在計算過程中原文的部分資訊是丟失了的。那麼為什麼網站中可以將我的密碼解密出來呢?
經過一番查詢後發現,原來線上解密工具的解密原理很簡單,其原理是收集使用者常用的簡單密碼形成了一個密碼字典,並將字典中的密碼用MD5加密後儲存起來,在所謂的“解密“的時候,就將真正使用者密碼加密都的密文與已儲存的密碼相比較,如該密文存在於字典當中,即可以“解密”。因此,簡單的用MD5對使用者密碼加密還不安全,我們設定密碼時候也通常都會有複雜度檢測,比如密碼必須帶英文數位什麼的,就是為了安全性考慮。
知道其解密原理之後,我們嘗試一下複雜點的密碼看看能不能“解密”出來,首先對密碼“qweasd666”進行加密:
加密之後我們選取32位元小寫的密文進行解密操作:
可以看到解密失敗,說明其原理就是我們上面所說的收集常用的密文進行一一對應。既然解密失敗了,那麼說明“qweasd666”這個密碼是安全的,你們可以都設定這個密碼(doge)。
言歸正傳,說到這個網站成功將我精心設定的密碼給破解了,這讓我很沒有安全感,而且我感覺我很沒有面子,我一定要將我的登入安全等級進行提升。
除了上面提到的解密操作之外,還有一個很大的問題就是在前端將資料傳輸過來時候http採用的是明文傳輸,如果傳輸封包被擷取,那麼就算你後端的加密演演算法有多複雜,你的密碼也會被別人知道。
找到問題所在之後,我們就可以對症下藥了,首先我覺得要解決的是http明文傳輸問題,因為這個風險最大,普通抓包就能抓取密碼,這不是很恐怖的一件事嗎。解決方案也很簡單,既然明文傳輸不安全,那麼我們加密後再進行傳輸不就行了嗎?
我選用的方案仍然還是MD5加密,但是對密碼加密前還要加入一個固定salt。salt?是加鹽嗎,其實差不多,更不如說是加點“佐料”。其基本想法是這樣的:當用戶首次提供密碼時(通常是註冊時),由程式往這個密碼裡撒一些“佐料”,為了減輕開發壓力,這個佐料對於每一個使用者都是相同的,然後再雜湊。這樣就能防止傳輸過程中出現明文密碼洩露。
注意上面我提到的是防止出現明文密碼洩漏,但是這並不代表密文不會洩漏,假如駭客擷取你通過http傳輸的經過加密後的密碼,或者資料庫發生洩漏導致加密後的密碼被駭客盜取,駭客通過解析前端js檔案獲得前端固定鹽值,那麼駭客可能可以通過彩虹表進行反向查詢得到原始密碼。這時候就二次加密的重要性就出來了,二次加密實現原理為對前端傳過來經過加密之後的密碼再次和一個隨機Salt值結合後進行加密(注意這次是隨機的),鹽值會在使用者登陸的時候隨機生成,並存在資料庫中。
這時候可能你會和我剛開始一樣也會有一個疑惑,那就是你把隨機鹽值儲存到資料庫中了,那麼如果資料庫洩漏那你的隨機鹽值還有什麼作用呢?駭客拿到加密資料進行解密後去除鹽值不是就能得到密碼了嗎?是的,駭客有可能通過這樣的手段得到密碼,但是前提是他能解密出來,要知道的是MD5是無法直接破解的,只能通過窮舉法進行解密。就算駭客拿到了資料庫中的加密密碼,但是不知道後端的加密過程,他就無法進行解析,就算駭客同時知道加密過程,由於經過了二次加鹽二次加密,這時候的密文是很難很難被解析出來的,隨著加密資料的複雜度增加,破解成本是呈指數級增加的,在那麼大的成本面前相信沒有什麼駭客願意去嘗試。當然,salt也不一定要加在最前面或最後面,也可以插在中間,也可以分開插入,也可以倒序,程式設計時可以靈活調整,都可以使破解的難度呈指數型增長。
2.3:具體實現
2.3.1:使用者註冊
2.3.2:使用者登入
3.1.1:前端
const params = { ...this.ruleForm, sex: this.ruleForm.sex === '女' ? '0' : '1', //設定密碼加密(加上固定salt值) password: md5(this.ruleForm.password + this.salt) } addEmployee(params).then(res => { if (res.code === 1) { this.$message.success('員工新增成功!') if (!st) { this.goBack() } else { this.ruleForm = { username: '', 'name': '', 'phone': '', password: '', // 'rePassword': '',/ 'sex': '男', 'idNumber': '' } } } else { this.$message.error(res.msg || '操作失敗') } }
3.1.2:後端
/** * 新增員工 */ @PostMapping public R<String> save(@RequestBody Employee employee){ //生成隨機salt值 String salt = RandomStringUtils.randomAlphanumeric(5); //設定隨機鹽值 employee.setSalt(salt); //設定密碼二次加密 employee.setPassword(DigestUtils.md5DigestAsHex((salt + employee.getPassword()).getBytes())); boolean save = employeeService.save(employee); if(save){ return R.success("新增成功!"); } return R.error("新增失敗!"); }
3.2.1:前端
const params = { ...this.loginForm, //登入密碼加上固定鹽值後傳送 password: md5(this.loginForm.password + this.salt), } let res = await loginApi(params) if (String(res.code) === '1') { localStorage.setItem('userInfo', JSON.stringify(res.data)) window.location.href = '/backend/index.html' } else { this.$message.error(res.msg) this.loading = false }
3.2.2:後端
/** * 員工登入 */ @PostMapping("/login") public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){ //1.獲取傳輸過來的加密後的密碼值 String encryPassword = employee.getPassword(); //2.從資料庫中獲取使用者資訊 LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>(); lqw.eq(Employee::getUsername,employee.getUsername()); Employee emp = employeeService.getOne(lqw); //3.如果沒有查詢到則返回登陸失敗查詢結果 if(emp == null){ return R.error("沒有查詢到該使用者資訊!"); } //4.獲取註冊時儲存的隨機鹽值 String salt = emp.getSalt(); //5.將頁面提交的密碼password進行md5二次加密 String password = DigestUtils.md5DigestAsHex((salt + encryPassword).getBytes()); //6.密碼比對,如果不一致則返回登陸失敗結果 if(!emp.getPassword().equals(password)){ return R.error("密碼錯誤!"); } //7.檢視員工狀態是否可用 if(emp.getStatus() == 0){ return R.error("該員工已被禁用!"); } //8.登入成功,將員工id存入Session物件並返回登入成功結果 request.getSession().setAttribute("employee",emp.getId()); return R.success(emp); }
到此這篇關於Java雙重MD5加密實現安全登入的文章就介紹到這了,更多相關Java雙重MD5加密 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45