這幾週是「國家網絡安全宣傳周」。許多上了川大網絡安全少年班班,網絡安全是幹什麼呢?我不知道。我只會玩電腦🤪,給大家講點玩電腦基本常識。
我想起在初一還是初二的時候,我們小組要講一個網絡安全主題班會。我給大家介紹了 HTTPS 和 RSA 相關內容,結果 RSA 講到一半就給 cyb 叫停了😭️。
但是這裏我想介紹什麼就介紹什麼。
假如 Alice 和 Bob 希望通信,但是兩人之間的信道是公開的,任何人都能知道 Alice 和 Bob 交換了什麼信息。那麼 Alice 和 Bob 還有有辦法加密通信嗎?
有的兄弟有的。假設是 Bob 要給 Alice 發消息。Alice 先生成一對密鑰,具體操作如下(以下內容中紅色表示被公開的信息,當然整個算法也是被公開的):
openssl prime -generate -bits <位數>
。比如 openssl prime -generate -bits 1024
就能生成一個 1024 位(二進制位)的素數。以前我寫字符串哈希的時候喜歡這樣幹,不過後來有人告訴我固定大素數模數然後運行時隨機 base 更能防 hack。Bob 現在知道了 Alice 公開的 ,他有一段想要偷偷發給 Alice 的信息 ,那麼他只需要將 發給 Alice。
最後 Alice 只需要解密消息,計算 ,便得到了 。其原理是 ,即歐拉定理。
那麼安全性怎麼保證?這個也叫做 RSA Problem:已知 ,,,求 。雖然和質因數分解不等價,但是目前比較好的解決方法也只有分解 N。所以 RSA 的安全性很大程度上依賴於質因數分解。然而質因數分解目前沒有多項式複雜度算法,所以想要分解長達 2048 甚至 4096 位的 ,幾乎是不可能的。
但是,RSA 運算太慢了,如今大家聊天軟件中隨隨便便就傳個幾 MB 甚至 GB 級別的文件,RSA 的速度無法接受。於是一個好的方案是,隨機生成一份強密碼,將這個密碼用 RSA 傳輸,具體的消息傳遞用更快速的對稱加密,如 AES 等。
這是一個專門用於交換密鑰的算法。
然後就可以拿這個 去對稱加密通信了。
安全性在於想從計算 和 計算出 ,需要解出 或 ,但這是離散對數問題,目前沒有多項式複雜度算法。
橢圓曲線不是圓錐曲線,而是類似 的曲線。在 意義下橢圓曲線上的點可以定義加法乘法。所以自然能想到把上面這些算法搬到橢圓曲線上。
好處是橢圓曲線離散對數問題比 RSA 更難一點,因此用更短的密鑰能達到同等的安全性。
非對稱加密還有一個用途就是用於簽名,其實相當於將 RSA 逆用,RSA 的公鑰私鑰有明顯的對稱性。
Alice 有一對 RSA 公私鑰,然後又發佈了一條消息,怎麼證明這條消息確實是 Alice 發佈的?
Alice 只需要將這條消息的 hash 值用自己的私鑰加密得到 h,然後將其公佈。
如果你能用 Alice 的公鑰,將 h 解密得到正確的 hash 值,那麼就能證明 Alice 極可能有 RSA 私鑰。道理和之前的 RSA 通信是一樣的。
上面的過程依賴一件事情,Alice 發佈的密鑰真的是 Alice 發佈的。不安全的信道裏,很可能有不法分子在中途篡改 Alice 的消息,導致在最初傳遞密鑰的時候就出錯了。後面一切的加密都白搭。
所以怎麼辦呢,沒有好的辦法。
一個想法是,不要用不安全的信道傳輸消息。比如 Alice 和 Bob 可以線下碰頭,相互交換密鑰,這樣安全性會高很多。
但是問題來了,線下碰頭成本太高了。並非只有人與人交流纔有加密的需求,很多時候你訪問網站,確認網站發送的消息真的是網站發送的,保持一定的保密性,同樣很重要。結果很荒唐了,本來是爲連接世界的互聯網,結果爲了保證絕對安全,只在線下可以接觸的地方互聯,真是互聯了個寂寞。
還有想法是,建立權威的證書頒發機構,也就是 CA。大體思想是 CA 幫你驗證了很多網站的證書合法性,如果你相信 CA 的話,那就相信這些網站吧。但是建立權威的 CA 本身比較中心化,而且很可能有可信度問題。
但至少在這個層面上,人們往往願意用隱私換取便利。
Shor 算法可以多項式複雜度內分解質因數。所以隨着量子計算機的發展,所以上面提到的 RSA、DH,以及他們的橢圓曲線版本,在幾十年後都很可能失效。
好在人類還是發明了一些足以應對量子計算的加密算法,什麼 Kyber 之類,但是我不會😵💫。
所以,到這裏,如果暫時不管量子計算機的話,你可以發現,通過上面的加密手段,設計一個安全的代理、一個安全的通訊軟件、安全的存放文件,其實都不難,並且這樣的技術已經相當成熟了。
這是數學,永遠是對的。
加密技術既能維護用戶隱私安全,又可能被惡意分子濫用。警方無法從端到端加密軟件中獲取情報。那麼政府應該禁止這種端到端的通信軟件嗎?這是目前很多國家還在爭議的話題。
我認爲不應該。
但是這些東西很大程度上依賴於用戶的密碼,假如說加密用的密碼是 123456
,那上面的一切加密都白搭了。
因此我特別推薦用密碼管理器,我用的是 KeePass,東西放在本地比放在雲端安全一點。多用複雜隨機生成的密碼,然後自己只需要記憶一個強的主密碼就行了。
然而,有太多事情是你掌控不了的。比如你用的 Firefox 或者 Chromium,幾千萬行代碼,可能沒有漏洞嗎?於是安全性其實是建立在上億行你從來沒有看過,也不可能看過的代碼之上。開源軟件雖然給了人們閱讀甚至自己修改代碼的自由,但是不等於安全。而人們傾向於相信有更專業的人已經審閱過了,便無條件相信。況且,對於 99% 以上的人來說,也只能無條件相信,畢竟想要編譯 Firefox 都是要有一定水平的。
Linus’s law 說:given enough eyeballs, all bugs are shallow。但是真的有 enough eyeballs 嗎?最後網絡安全的大廈落在了極少數默默無聞開發者的良心上。
開源軟件的開發不應該只是慈善事業。
這個「安全」打引號。
除了這些開源軟件尚且可以看一看源代碼,人們每天還依賴很多閉源商業公司產品,比如手機,戶晨風最喜歡的蘋果,其操作系統本來就是封閉的,許多 Android 手機的廠商定製系統也是封閉的。它們面向的客戶 99% 不懂技術,它們也不希望用戶懂技術。
打着安全的旗號,爲你好,無非只是希望你少用競爭對手的產品,爲自己更好地謀求利益罷了。
當然也不只是商業公司。
網絡安全到最後,大道至簡,竟是社會工程學。技術絕對不是萬能的,很多時候安全問題不止在數學和算法。
前面這麼多這麼牛的加密方法,真的有用嗎?
應當明確一點,加密≠沒有特徵。所以不需要能夠解密你的加密數據,只需看出你的數據是刻意加過密的,便知道你很可能心裏有鬼。所以優秀的代理軟件往往會傾向於模仿正常流量,以免被注意。
如果有一天,刀子就架在你的脖子上了,到底是你的數據隱私重要,還是生命重要,只有你自己知道。