网站数据库中“密码加密”方法思考
博主,開始時候,寫的web應用,數據庫中的密碼,都是直接保存的。真正的原汁原味,真正的所見即所得。
后來,看了別人的web應用都是MD5加密的,感覺很不錯,自己也在應用中加入了MD5加密,貌似“不可逆”的,哈哈,看起來也專業了許多,后來聽說CSDN用戶信息被***竊取了,自己也趕緊去換了密碼。
今天,無意間看了http://howe.im/(探微·智在未來)的一篇博文《安全密碼機制(salt機制)》,才知道了,單純使用MD5加密,也是不安全的,這里簡單說下,所讀博文的內容和自己的一點認識吧。
? ? 首先,解釋下,為什么單純MD5加密,是不安全的,我們暫且不論MD5是否可以由密文推出明文(有32位密文計算出加密前的密碼),也不論用戶的密碼是否符合很高的安全性(加入大小寫字母、數字、特殊字符等),當***竊取一個大型網站的數據庫信息后,通過MD5加密(而非解密)方法,不斷加密一些密碼,如123abc,加密后A906449D5769FA7361D7ECC6AA3F6D28,在數據庫中搜索,是否存在匹配密文,如果存在,則相應的用戶密碼就被破解了。不斷的窮舉密碼,加密,匹配。這個速度是很快的,MD5加密很快,數據庫匹配可以優化。
? ? 然后,說下,博文中介紹的salt機制。
? ? 1、用戶注冊時
? ? 用戶注冊密碼A、客戶端生成一個隨機碼B,將兩者組合到一起,然后MD5加密為C,將隨機碼B和加密后的C,兩者分開提交到服務器,保存到數據庫。
? ? 2、用戶登錄時
? ? 用戶只需要提交密碼,提交到服務器后,將密碼和該用戶數據庫中保存的隨機碼組合,然后MD5加密,驗證即可。
問題:這里有一個漏洞,那就是用戶登錄時,提交的密碼,如果是明文,那么很容易被惡意獲取。用戶提交的信息是有必要加密的,這才是負責任的。
我看了另外一邊博文,介紹了騰訊的朋友網,它是怎么加密提交信息的,這里簡單說下。
? ? 1、將用戶密碼A加密了三次B,然后與驗證碼字符C組合,然后進行一次MD5加密成密文D,提交到服務器,這里注意,提交是不包含驗證碼C的,因為驗證碼C是服務器生成,提前發送到Client端的。服務器端借助驗證碼C和用戶提交來的密文D,獲得密碼,進行后續的驗證。
這里又有一個問題了,說好的MD5,一般人是沒法破解的呢,怎么這里有這個破解步驟呢,其實這是我臆想的步驟,可能它沒有破解的,我為什么要破解的,我是想將這兩部分整合,所以破解,如果朋友網,沒有用salt的加密機制,那么就不需要獲得密碼A了,哈哈……說的很亂。
總之,可以采取的方案如下:
1、服務器端,用戶注冊時,保存 (隨機碼A) 和 (密碼B+隨機碼A進行MD5加密)密文C
2、提交注冊或登錄信息時,客戶端提交(密碼M+驗證碼N進行可逆的方法加密)密文O,服務器端,保存有驗證碼N,故而,可以逆向運算獲得密碼M,然后提取數據庫中的隨機碼A,組合后進行MD5加密,與數據庫驗證。注:雖然密文O是可逆的運算,但是,在提交過程中是不包括驗證碼N的,加上比較獨特的加密算法,基本可以保證安全了,呵呵,除非,服務器端到用戶端傳輸的報文也被截獲了,那就沒辦法了。話說回來,就算獲得了密碼,那個注冊時候生成的隨機碼A,也是很難獲得的。
?
轉載于:https://blog.51cto.com/ijustdoit/1175635
總結
以上是生活随笔為你收集整理的网站数据库中“密码加密”方法思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Buffers, windows, an
- 下一篇: mysql varbinary 插入_M