故事的開始
那是一個夏天,在杭州,和兩位好友吃完飯聊著。他們都是剛剛入行的程式設計師,討論著密碼在系統中儲存的方式MD5.當時的我還是個門外漢,聽著他們的討論,非常有興趣。那時候我認為MD5是加密放方式(當然現在看來不是)。那時候我認為處理密碼的方式是,使用者註冊後,密碼透過MD5加鹽方式存入資料庫。登入的時候,拿出密碼,解密後比較(現在看來是錯的)。
時隔多年我記錄一下自己通俗易懂的理解(看到最後其實這些演算法都涉及高等數學。。。)
1.那先從MD5開始吧。摘要演算法主要包括MD5、SHA(安全雜湊演算法)、SHA-1、SHA-256、SHA-384、SHA-512等。現在還有一個主流的 Bcrypt 摘要。摘要總結說:原文字透過演算法得到新文字,無法透過新文字得到原文字,特點是不一樣的原文字得到的新文字大機率是不一樣的(注意是大機率,小機率會一樣哦)。如果使用MD5加鹽這種古老的方式,也可以替換為 Bcrypt 安全性更高。
2.接下來說說加密解密吧。加解密總結說:原文字透過演算法得到新文字,又能透過演算法得到原文字的過程。加解密可以分為兩大類:對稱演算法(常見的AES)和非對稱演算法(RSA)。加密的時候需要一個秘鑰,如果解密的時候用的一樣的秘鑰,那就是對稱演算法,如果用的不一樣的秘鑰,那就是非對稱演算法。(一般加密和摘要是配合使用的,這個和效能安全級別有關係)。非對稱演算法安全級別高於對稱演算法,但是效能上差。
3.編碼base64,這個可是一個好東西,任何檔案都可以轉為base64編碼方式,常見的是圖片。它的編碼和解碼不需要秘鑰,也就不屬於加密的範疇。
實際應用
1.需要提供介面給第三方的時候,那麼我們總不能直接給介面不做任何校驗吧,這樣誰都能訪問,這也太不靠譜了吧。
這時候,如果第三方不多,例如只有兩個,那那那直接給開白名單是一種比較省事的方式,要什麼驗證。讓對方提供伺服器ip,我們本伺服器只允許你提供的伺服器進行訪問。好好好,那如果公司發展不錯,第三方每天多10個,那運維忙死了,天天要開白名單,還不好維護和確定到底是那個第三方。還是搞驗籤吧。
(方案1)先來個懶人法,明文資料加鹽之後 進行 MD5 得到的新文字是簽名,把明文資料和簽名都傳送到伺服器,伺服器做一樣的事情 先把原文字加鹽 進行 MD5 如果得到的新文字和傳送過來的簽名一致,認為資料有效。(這裡的關鍵是,這個鹽,是服務方和第三方商量一致的,只要鹽不洩露,則是安全的)。做到這裡已經防住了大部分非技術人員和少量技術人員。
那麼問題來了,有個前端老兄會使用瀏覽器的除錯功能,能看到明文資料,這個明文資料還是比較銘感的,那在(方案1)中 多加一步,先把明文加密(非對稱和對稱隨便選),對密文加鹽 摘要(MD5也可以是Bcrypt)然後傳送,服務端對應先驗籤,就是把密文先摘要 比較是否一致,如果一致才解密處理,否則視為無效資料。(到這裡差不多了,大部分企業安全級別沒有這麼高,資料庫存明文密碼的大有人在)。
剩下的就是考慮安全級別,一般對稱加密和驗籤足夠了,不行就非對稱唄。還有防止爆破,還需要加時間戳一起加密驗籤,超過時間戳一定偏移量也視為無效。行了行了夠用了。
如果哪裡不對,歡迎指正,謝謝,有幫助點個讚唄