在測試過程中,我們經常會遇到接口數據加密、資料庫密碼加密怎麼測試等問題,很多同學立馬被嚇退了。
實際上,只要耐心一點,測試過程的常用加密算法不是那麼難,甚至有的根本就不是加密算法。
密碼學是一門相對比較晦澀的科學,電影《模仿遊戲》就是講的包括圖靈在內的幾個頂級數學家破譯德軍的軍事情報的故事。 但是在工作當中,我們不需要懂密碼學的底層原理,你只需要知道他們如何使用的就可以了。
本文會列舉在測試和開發過程中最常用的算法,解開所謂「加密」過程的神秘面紗。
算法1:base64
這不是加密算法,它叫做編碼算法。和我們把文字編碼成計算機當中的二進位數據一樣。
說得更通俗一點。只要你觀察到 I am a programer 這幾個字是英語,你就能通過翻譯軟體知道他的原始意思是 「我是一個程式設計師」。
我們來看這段字符串:SSBsaWtlIHlvdQ==
如果你是一個萌新,你肯定不懂這是什麼意思。看完這篇文章以後,你就會知道他的意思是:I like you
就和我們把中文翻譯成英文一樣, base64 這樣的編碼算法只是把你看得懂的字翻譯成肉眼看不懂的字,但是一旦你知道這些看不懂的符號是哪一門語言,你就可以直接翻譯回去。
比如上一段 SSBsaWtlIHlvdQ== 就是用 base64 編碼 I like you 得到的字。
要「破解」也非常簡單,你只要在網上搜索 base64 在線編碼、解碼就有工具。如果要使用代碼,類似於這樣:
算法2:urlencode
URL 編碼, 和 base64 一樣,只是編碼算法,不能稱為加密。 記住,編碼方式,只要你通過觀察看到的字符串的特徵,分析出編碼方式,是可以很輕易的解碼的。
肉眼看不見具體意思,所以這也是防君子,不妨小人的所謂 「加密方式」。
比如:base64的特徵是尾部經常帶有= 號, url 編碼的特徵是 % 很多。
我們經常在瀏覽器中看到這樣的地址:
http://example.com/?q=%E8%8F%9C%E9%B8%9F
後半段帶有很多百分號的就是 url 編碼,你同樣可以通過搜索對應的工具直接解碼,得到原始數據:
http://example.com/?q=菜鳥
對應的 python 代碼是這樣的:
算法3:md5
md5 不是編碼,也不是加密,它叫做摘要算法,又稱哈希算法和散列算法。 他的主要作用是:
- 防止篡改
- 校驗數據
比如你下載了一個軟體,會擔心這個軟體被人修改,植入了病毒。軟體開發者為了防止自己的軟體被別人修改,會在官網附帶一個重要信息。比如 https://dl.snipaste.com/sha-1.txt 這個網址就是該軟體每個版本的摘要信息。
當你下載好軟體以後,利用摘要算法檢測工具檢測改軟體,算出他的摘要信息,如果和官方提供的一致,說明軟體沒有被修改;如果不一致,就說明這個軟體被篡改了。
摘要算法的另一個應用場景是用來保存密碼。我們日常註冊帳號輸入的密碼通常不會直接保存在資料庫,而是經過摘要(或者是加密)處理以後保存在資料庫當中。你可以通過在線工具對任意數據進行 md5 「加密」,這裡提供 python 版代碼:
注意:摘要算法是不可逆的,通過 bfb3f4712d0b04e8348a3fb5fa0b9bc2 得不到原始數據 hello yuz 。所以通過存在資料庫裡面的密碼無法獲知你真正的密碼。
為什麼密碼會被盜?
密碼被盜通常是因為黑客利用了摘要算法的另一個特性攻擊了資料庫,這種方式叫撞庫。
對於單一的摘要算法,有一個特徵:只要你的原始數據是固定的,得到的 hash 值也會一樣。比如 hello yuz 得到的就是 bfb3f4712d0b04e8348a3fb5fa0b9bc2 。
黑客就是利用這種對應關係,將很多人常用的密碼和對應的 hash 值做成一個關係表(彩虹表),然後一一去嘗試。
比如很多人喜歡把密碼生成 8888, abc123。 黑客只需要將這些密碼提前算出對應的 hash 值保存起來,就可以嘗試攻破你的帳號。
什麼是加鹽?
上面的例子提到,黑客可以利用彩虹表套取你的密碼,所以純粹的摘要算法不是一種特別安全的方式去存儲密碼。但是我們可以採取「加鹽」 的方式提高安全性。
網站開發者會提供一個類似於秘鑰的東西,我們稱為 salt, 其實就是一個隨便起的字符串。然後將原始密碼 + salt 得到一個新字符串,再對他進行 hash。
只要 salt 不被黑客知道,就沒有辦法利用彩虹表來攻擊資料庫。以下是加鹽版的 python 代碼:
在測試過程中,如果公司的密碼是通過摘要算法生成的,可以找開發小哥哥要鹽, 然後通過對應的摘要算法驗證資料庫密碼。
算法4:SHA1
SHA1 和 md5 一樣,也是摘要算法,還有 SHA256, SHA512。 我們看到的區別就是長度不一樣。長度越長,理論上更加安全,同時也意味著速度更慢。
以下是sha1 的代碼,和 md5 幾乎一樣:
總結
- 本文我們提到的「加密」 算法,都是偽加密,只有鹽(salt)和密碼類似;
- 真正的加密算法也有很多,下節再詳細補充。
- base64 編碼常用於在URL、Cookie、網頁中傳輸少量二進位數據;
-
- 優點:速度快,肉眼不可理解
- 缺點:編碼比較長,非常容易被破解,僅適用於加密非敏感信息
- url 編碼常用於 URL 數據的編碼和解析;
- md5 是最經典,使用最廣泛的摘要算法。
-
- 部分公司會採用 md5 進行密碼的保存
- 還有公司會採用其他更適合對密碼進行摘要的算法,具體找開發
- sha1, sha256, sha512 比 md5 安全性更高,但是速度更慢,同時存儲數據的時候耗費的資源會更多。
說明:本文為檸檬班雨澤老師原創,轉載需註明出處