21 | 哈希算法(上):如何防止数据库中的用户信息被脱库?
問題:對于用戶信息中的密碼,你會如何存儲用戶密碼?僅僅 MD5 加密一下存儲就夠了嗎?——哈希算法
什么是哈希算法
哈希算法的定義和原理:將任意長度的二進制值串映射為固定長度的二進制值串,這個映射的規則就是哈希算法,而通過原始數據映射之后得到的二進制值串就是哈希值。
哈希算法必須滿足的幾點要求:
- 從哈希值不能反向推導出原始數據(所以哈希算法也叫單向哈希算法);
- 對輸入數據非常敏感,哪怕原始數據只修改了一個 Bit,最后得到的哈希值也大不相同;
- 散列沖突的概率要很小,對于不同的原始數據,哈希值相同的概率非常小;
- 哈希算法的執行效率要盡量高效,針對較長的文本,也能快速地計算出哈希值。
哈希算法的應用非常多,主要的分別是安全加密、唯一標識、數據校驗、散列函數、負載均衡、數據分片、分布式存儲。這節介紹前四個應用。
一、安全加密
最常用于加密的哈希算法是 MD5(MD5 Message-Digest Algorithm,MD5 消息摘要算法)和 SHA(Secure Hash Algorithm,安全散列算法)。其他的還有DES(Data Encryption Standard,數據加密標準)、AES(Advanced Encryption Standard,高級加密標準)。不管是什么哈希算法,我們只能盡量減少碰撞沖突的概率,理論上是沒辦法做到完全不沖突的。
鴿巢原理:這里就基于組合數學中一個非常基礎的理論,鴿巢原理(也叫抽屜原理)。這個原理本身很簡單,它是說,如果有 10 個鴿巢,有 11 只鴿子,那肯定有 1 個鴿巢中的鴿子數量多于 1 個,換句話說就是,肯定有 2 只鴿子在 1 個鴿巢內。
而哈希算法產生的哈希值的長度是固定且有限的,我們要hash的數據是無窮的,一般情況下,哈希值越長算法散列沖突概率越低。沒有絕對安全的加密。越復雜、越難破解的加密算法,需要的計算時間也越長。實際中如果某個加密算法的破解時間需要幾十年以上,一般就比較優秀了。因為耗費的成本太大
二、唯一標識
如果要在海量的圖庫中,搜索一張圖是否存在不能單純地用圖片的元信息(比如圖片名稱)來比對,有可能存在名稱相同但圖片內容不同,或者名稱不同圖片內容相同的情況。那如何搜索呢?
- 給每一個圖片取一個唯一標識,或者說信息摘要。比如從圖片的二進制碼串開頭取 100 個字節,從中間取 100 個字節,從最后再取 100 個字節,然后將這 300 個字節放到一塊,通過哈希算法(比如 MD5),得到一個哈希字符串,用它作為圖片的唯一標識。
- 通過這個唯一標識來判定圖片是否在圖庫中,減少很多工作量。如果還想繼續提高效率,把每個圖片的唯一標識,和相應的圖片文件在圖庫中的路徑信息,都存儲在散列表中。
- 當要查看某個圖片是不是在圖庫中的時候,先通過哈希算法對這個圖片取唯一標識,然后在散列表中查找是否存在這個唯一標識。如果不存在,那就說明這個圖片不在圖庫中;如果存在通過散列表中存儲的文件路徑,獲取到這個已經存在的圖片,跟現在要插入的圖片做全量的比對,看是否完全一樣。如果一樣,就說明已經存在;如果不一樣,說明兩張圖片盡管唯一標識相同,但是并不是相同的圖片。
三、數據校驗
電驢這樣的 BT 下載軟件,BT 下載的原理是基于 P2P 協議的。從多個機器上并行下載一個 2GB 的電影,這個電影文件可能會被分割成很多文件塊(比如可以分成 100 塊,每塊大約 20MB)。等所有的文件塊都下載完成之后,再組裝成一個完整的電影文件。
一種校驗文件是否安全的方法:通過哈希算法,對 100 個文件塊分別取哈希值,并且保存在種子文件中。哈希算法有一個特點,對數據很敏感。只要文件塊的內容有一丁點兒的改變,最后計算出的哈希值就會完全不同。當文件塊下載完成通過相同的哈希算法,對下載好的文件塊逐一求哈希值,然后跟種子文件中保存的哈希值比對。如果不同,說明這個文件塊不完整或者被篡改了,需要再重新從其他宿主機器上下載這個文件塊。
四、散列函數
散列函數中用到的散列算法,更加關注散列后的值是否能平均分布,即一組數據是否能均勻地散列在各個槽中。除此之外,散列函數執行的快慢,也會影響散列表的性能,所以,散列函數用的散列算法一般都比較簡單,比較追求效率。
解答開篇
- 通過哈希算法,對用戶密碼進行加密之后再存儲,不過最好選擇相對安全的加密算法,比如 SHA 等(因為 MD5 已經號稱被破解了)。
- 針對字典攻擊,維護一個常用密碼的字典表,把字典中的每個密碼用哈希算法計算哈希值,然后用哈希值跟脫庫之后的密文比對,如果相同基本可以認為這個加密后的密碼對應的明文就是字典中的密碼。引入一個鹽(salt),跟用戶的密碼組合在一起,增加密碼的復雜度。拿組合之后的字符串來做哈希算法加密,將它存儲到數據庫中,進一步增加破解的難度。
- 最后,安全和攻擊是一種博弈關系,不存在絕對的安全。所有的安全措施,只是增加攻擊的成本而已
總結
以上是生活随笔為你收集整理的21 | 哈希算法(上):如何防止数据库中的用户信息被脱库?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shrinkwrap_Java EE 6
- 下一篇: Apache Camel的性能调整思路