淺談Hash

Hash,一般翻譯做“散列”,也有直接音譯爲“哈希”的,就是把任意長度的輸入通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。(來源百度百科解釋)

Hash的特點

  • 算法是公開的
  • 對相同數據運算,得到的結果是一樣的
  • 對不用數據運算,如MD5得到的結果都是32個字符長度的字符串
  • 這玩意沒法逆運算

Hash的運用場景
通過它的這幾個特點.我們可以談談Hash它的運用場景了
登陸密碼加密
我們在開發的過程中首次登陸需要向服務器發送用戶密碼進行賬戶驗證.但是用戶的密碼是非常隱私的信息.所以一定要使用加密保護.
直接使用Hash
那麼目前最優的解決方案就是使用密碼的Hash值進行驗證

客戶端
直接將用戶輸入的密碼進行Hash運算,得到結果發送給服務器驗證.因爲Hash算法無法逆運算,所以就算Hash值泄露,用戶真實密碼也不會泄露.

服務端
需要服務器配合,在用戶註冊的時候,服務端的數據庫中保存的就是用戶密碼的Hash值,而不是密碼本身(根據Hash的特點,對相同的數據加密結果是一樣的).這樣就算服務器被攻克,用戶的隱私信息也能起到一定的保護.
也就是現在爲什麼各類產品只提供重置密碼的功能,而不再有找回密碼的功能了.因爲服務端本身也不知道用戶的真實密碼.
特別說明:用戶的密碼屬於非常隱私的信息.因爲大多數用戶有一個特點.密碼喜歡使用重複的.如果你的APP泄露了用戶的密碼.那麼很有可能,***利用用戶的手機號碼加上密碼,可以套出用戶的支付信息.這種後果是非常嚴重的!
再加一點東西
上面所說的案例理論上已經非常的"安全"了.因爲就算***知道了你的Hash值,也沒法逆運算出用戶的密碼.但情況並不樂觀.我們眼見爲實!
以MD5爲例:在終端上演示一下(比如我的密碼是123456)
淺談Hash
MD5的結果是: e10adc3949ba59abbe56e057f20f883e
接下來隆重介紹一個網站http://www.cmd5.com/
我們只需要將Hash值進行反向的查詢.
淺談Hash
查詢結果圖
可能你會問,Hash既然不能反算爲何這個網站能夠查詢出來?仔細看下網站的介紹不難發現:其實它是一個巨大的數據庫.利用明文和Hash的數據記錄,進行反向查詢.
淺談Hash

網站介紹
當然,提供哈希反向查詢服務的不僅僅只有這個網站,還有很多盈利性的公司提供有償服務.
所以如果我們單純的直接使用Hash算法,用戶的密碼安全性會非常低.
早期的解決方案加鹽
淺談Hash
這種方式,對於反向查詢來說就比較困難了.安全係數也相對較高.
HMAC(Hash-based Message Authentication Code)
對於簡單的使用鹽的方式還是會有安全隱患,因爲如果鹽被泄露了.那麼整個項目將陷入被動.因爲這種方式將鹽寫死在程序裏面了,要想今後換掉是非常難的.
那麼接下來介紹一種加密方案HMAC.它使用一個密鑰,並且做了兩次散列!
注意:在開發過程中,這個密鑰KEY是從服務器獲取的.並且一個用戶對應一個KEY

廢話不多說,直接上代碼
淺談Hash
對於這種加密方案.就可以很好的保護用戶的隱私信息.因爲就算泄露了KEY.這個KEY也只是一個用戶的.不會污染整個項目.
如果拿到這個KEY,然後想反查詢出用戶的明文密碼.這個成本,除非這是馬雲的賬戶.
所謂安全,無法做到絕對安全.他們灰產有句話:只要錢到位,沒有什麼不可能!我們要做到的就是相對安全.讓破解的成本大於破解的利潤.

登錄加密補充
今天寫得開心.所以再分享一點乾貨.
剛纔我們一直停留子在***想要拿到用戶的真實密碼.那麼如果***換了一個思路.大哥就是想要拿到用戶的登錄權限呢?
那麼我們這種加密.無論你怎麼玩.妥妥的都是給服務器一個Hash串進行驗證啊,也就是我只需要拿到你的Hash值.那麼我只要模擬你客戶端進行登錄是再簡單不過了.
當然,這樣的防護手段有很多.我介紹一種有效的防護方式.有更好的建議可以留言寫在下面,一起交流,向您學習.

註冊的過程
註冊的過程還是一樣.服務器保存的還是一串HMAC加密之後的HASH值.進行校驗.但是登錄時的驗證做點修改.

客戶端br/>通過服務器的KEY進行HMAC加密,得到HMAC的Hash串
將得到的Hash串拼接一個時間字符串@'201807102248'注意只到分(當然根據你的情況可以到秒)
然後將這個拼接完成的串,再次Hash.將這個結果發給服務器驗證

服務端br/>服務器保存了hmac的Hash串,以同樣的算法,拼接服務器的時間,進行運算,然後校驗.比如時間是59秒99發送的請求.服務器正好跳過一個分鐘.過程如下:
(服務器的Hash串+@"201807102249")Hash.這次不通過再來一次
(服務器的Hash串+@"201807102248")Hash.和上一分鐘對比,一次通過算成功
這樣的好處,可以做到每登錄發送給服務器的Hash值是不一樣的.***不能通過保存Hash值模擬登錄.
淺談Hash
版權&文件識別
當然Hash的作用除了用於登錄密碼加密以外.還有版權的運用.
比如如何識別一段視頻或者一段音頻,這種數字文件是正版的.這個時候,我們使用肉眼是沒法判斷的.因爲翻錄的視頻和音頻文件幾乎看不出來.但是,文件的二進制不一樣,它的Hash值是不會欺騙羣衆的.所以類似YouTube這樣的網站,在你上傳視頻的時候,它會將文件的Hash值保存.當其他的網站上傳這個視頻,那麼看是否是正版,就是對比文件的Hash值.
既然可以識別文件.那麼還有一個非常廣泛運用的就是像百度雲這樣的雲端服務.舉個例子:
很多小夥伴保留的視頻,經常被"和諧".有的人將視頻的名稱全部改爲葫蘆兄弟,黑貓警長但是還是被和諧了.
百度識別你的視頻文件,和你的文件名稱,以及文件後綴(有人改成.txt)沒有半毛錢關係.它只會看這個文件的Hash值.那麼如果想要逃脫.你唯一的出路就是改變文件原有的二進制.(翻錄\視頻格式轉換).
那麼最簡單的,就是一個壓縮包,全部搞定.(我是很嚴肅的在討論技術... ...的運用場景)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章