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的數據是無窮的,一般情況下,哈希值越長算法散列沖突概率越低。沒有絕對安全的加密。越復雜、越難破解的加密算法,需要的計算時間也越長。實際中如果某個加密算法的破解時間需要幾十年以上,一般就比較優秀了。因為耗費的成本太大
二、唯一標識
如果要在海量的圖庫中,搜索一張圖是否存在不能單純地用圖片的元信息(比如圖片名稱)來比對,有可能存在名稱相同但圖片內容不同,或者名稱不同圖片內容相同的情況。那如何搜索呢?
三、數據校驗
電驢這樣的 BT 下載軟件,BT 下載的原理是基于 P2P 協議的。從多個機器上并行下載一個 2GB 的電影,這個電影文件可能會被分割成很多文件塊(比如可以分成 100 塊,每塊大約 20MB)。等所有的文件塊都下載完成之后,再組裝成一個完整的電影文件。
一種校驗文件是否安全的方法:通過哈希算法,對 100 個文件塊分別取哈希值,并且保存在種子文件中。哈希算法有一個特點,對數據很敏感。只要文件塊的內容有一丁點兒的改變,最后計算出的哈希值就會完全不同。當文件塊下載完成通過相同的哈希算法,對下載好的文件塊逐一求哈希值,然后跟種子文件中保存的哈希值比對。如果不同,說明這個文件塊不完整或者被篡改了,需要再重新從其他宿主機器上下載這個文件塊。
四、散列函數
散列函數中用到的散列算法,更加關注散列后的值是否能平均分布,即一組數據是否能均勻地散列在各個槽中。除此之外,散列函數執行的快慢,也會影響散列表的性能,所以,散列函數用的散列算法一般都比較簡單,比較追求效率。
解答開篇
總結
以上是生活随笔為你收集整理的21 | 哈希算法(上):如何防止数据库中的用户信息被脱库?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python爬虫实例
- 下一篇: linux cmake编译源码,linu