「我的數據經過了base64加密,不用擔心輸出亂碼的問題。」
「我的密碼是經過MD5加密存儲的。」
工作這麼多年經常碰到有人這樣說,一開始我還煞有介事地去糾正,後來聽多了好像也就習慣了。把編碼、哈希、混淆、加密算法統統叫加密算法,這是一個普遍現象,不只是新手,老鳥也未必能分清楚這些算法的區別,當然也可能是叫著叫著就習慣了吧。
最近在頭條上看到不少技術文章還在犯這種錯誤,作為有點強迫症傾向的我,今天就再多嘴一次,希望搜尋引擎上類似的關鍵字會越來越少吧(其實最主要的是要多漲粉):
什麼是編碼算法?
簡單地說,編碼算法是對二進位數據的一個呈現方式,是為了能讓人類更好識別枯燥的二進位數據,以及讓計算機能理解人類抽象的文字而制定的一套二進位與字符之間的轉換規則。(註:這裡的編碼特指數據編碼,而非圖片、音視頻等編碼算法。)
常見的編碼有ASCII、Unicode、UTF8、URL編碼、HTML編碼及Base64等,這些都是以不同形式表示二進位數據的算法,比如Base64算法把3個字節共24bit分成長度為6bit的四段,並以「a-zA-Z0-9+/」共64個ASCII字符以及作為補全字符的「=」表示。
什麼哈希算法
哈希算法也稱摘要算法,是指把可變長度的數據通過運算得到固定長度散列值的不可逆算法,只要原始數據稍微改動得到的散列值機會完全不同,因為這個特性,哈希算法通常應用於對數據的完整性校驗以及密碼驗證。
常見的哈希算法有MD5、SHA1、SHA256、SHA512、NTLM等。
什麼是加密
加密算法是使用密碼對可讀的原始數據進行處理並得到不可讀密文的算法,跟哈希算法不同的是,加密算法是完全可逆的,只要提供密碼及密文就可以通過解密獲得明文。
加密算法又分成對稱加密算法及非對稱加密算法,二者主要的區別在於如何使用密鑰上,對稱加密算法使用同一個密碼進行加解密,常見的有DES、3DES、AES等,主要應用於體積較大的數據加密。
而非對稱加密算法使用公鑰及私鑰對進行加解密,使用公鑰加密的密文只能通過私鑰解密,反過來使用私鑰加密的密文則只能通過公鑰解密,非對稱加密的運算成本很高,因此一般只用於身份驗證及密碼交換,常見的算法有RSA、DSA、DH等。
以上是對編碼、哈希、對稱加密及非對稱加密等算法的簡單介紹,為什麼不能把這些算法都稱為加密算法呢?新手該如何區分這些算法?
首先可以從是否可逆上進行區分,編碼、對稱加密及非對稱加密算法都是可逆的,而哈希算法不可逆。
其次看是否使用了密碼,編碼及哈希算法不使用密碼,對稱加密使用一個密碼,而非對稱加密使用兩個密碼。
因此 ,判斷一個算法是否是加密算法要看它有沒有加解密機制,如果Base64是加密算法那它的密碼是什麼?如果MD5是加密算法那我們能通過密碼還原密文嗎?
所以,把數據轉化成Base64格式我們應該稱為Base64編碼,而使用MD5、SHA等算法獲取數據摘要值的過程我們應該稱為哈希而不是加密。
對密碼破解技術感興趣的同學可以加關注,我後續將會持續更新這方面的內容,謝謝!