今天還是那個密碼學,不過主要會學習現代密碼學的基本知識,在這之前先補充說明一下 encryption 和 hash 的差別,因為昨天忘了寫。應該不太會出現數學內容,因為我自己也不太會 XD
可能有些人在入門資訊領域時搞不太清楚 hash 和 encryption 的差別,比如說以為 md5 是一種加密演算法之類的,學習的路上難免有誤會,花時間搞清楚就好 👍
首先我們先了解一下 hash 是什麼,簡單的理解就是將長度不固定的資料 mapping 到固定長度的字串,並且這個過程理論上是單向的,也就是不可逆。
你可能注意到了,長度不固定的資料要以固定長度的字串來表示的話,是不是會有碰撞的問題?沒錯,不過我們這邊不花篇幅來探討,有興趣的話可以去研究一下 XD
常見的 hash 演算法有 md5、sha1、sha256 等等,不過因爲 md5 和 sha1 被利用前面提到的碰撞情形找到攻擊手段,因此被認為是不夠安全的方式,目前已不建議使用,可以使用 sha256 這類比較新的演算法。
另外,一般來說儲存密碼時除了會使用 hash 演算法之外,還會多一個加鹽 (salt) 的動作,以避免被彩虹表這類的窮舉方式破解。
在電腦被發明之後,古典密碼學的演算法都能被電腦破譯,現代密碼學就這樣誕生了(?)
這邊需要介紹一下柯克霍夫原則 (Kerckhoffs's principle):
他為軍用保密器設計了六個原則,不過這邊只說最重要的部分:只要 key 沒有洩漏,就算演算法公開也不會洩漏明文,這應該是現今加密演算法都有符合的原則。
總之太複雜的我們不說,現代密碼學大致可以分為兩種:
加密與解密使用同一把 key,又可以分為區塊加密和串流加密:
比較常聽到的 AES、DES 都是屬於區塊加密的方式,而串流加密我只有聽過 RC4。
這個形式的加密演算法會需要兩把 key,一把公鑰以及一把私鑰,而公鑰是由私鑰推導出來的,這邊舉個例子好了,假設 A 要傳送一份資料給 B:
這樣就完成了一次加密傳送,與對稱式加密相比,全程只需要傳送公鑰,而不需要把解密的 key 也透過公開管道傳送,因此先天設計上更安全;而對稱式加密的優點則是快,因此可用於資料量較大且不需要傳送 key 的情境,比如 Windows 的 BitLocker 磁碟加密就使用 AES 演算法。
看了上面的例子,也許你會發現:如果公鑰洩漏到惡意攻擊者手上,他可以發惡意的 payload 給 B,而 B 解密完就會解出這個惡意程式,有辦法辨識資料是不是來自 A 嗎?這時候可以使用數位簽章的機制,運作如下:
如此一來,既可以不洩漏私鑰,也可以驗證資料的來源是安全的。常見的非對稱式加密演算法則有 RSA。