讓我們開始第一部分:密碼學基礎 (Cryptography Basics)。
第一部分:密碼學基礎 (Cryptography Basics)
1. 什么是密碼學?
想象一下,在古代戰爭中,將軍需要向遠方的部隊傳遞作戰指令。如果直接派人送信,信件一旦被敵人截獲,后果不堪設想。怎么辦呢?他們會用一種秘密的“語言”來寫信,只有自己人才能看懂。這種把信息變“秘密”的技術,就是密碼學的雛形。
密碼學 (Cryptography),簡單來說,就是研究如何安全通信的科學與藝術。它涉及到一系列的方法和技術,用于保護信息不被未經授權的第三方讀取或修改。
密碼學的目標主要有以下幾個方面:
- 保密性 (Confidentiality):確保信息只被授權的人訪問。就像給信件上了鎖,只有擁有鑰匙的人才能打開。
- 完整性 (Integrity):確保信息在傳輸或存儲過程中沒有被篡改。就像給信件蓋上火漆印,如果印章完好,就說明信件內容沒有被動過。
- 可用性 (Availability):確保授權用戶在需要時能夠訪問到信息和相關資源。就像確保你的鑰匙隨時能打開你的鎖一樣。
- 認證 (Authentication):確認通信雙方的身份是真實的,而不是冒名頂替。就像通過核對筆跡或暗號來確認對方的身份。
- 不可否認性 (Non-repudiation):確保發送者不能否認其發送過某條信息,接收者也不能否認其接收過某條信息。就像簽了名的合同,不能抵賴。
在網絡安全中的重要性:
在數字時代,我們的個人信息、金融交易、商業機密等都以數據的形式在網絡上傳輸和存儲。如果沒有密碼學的保護,這些敏感信息就如同裸奔在互聯網上,極易受到竊聽、篡改和濫用。
- 保護在線交易:你每次在網上購物輸入銀行卡信息時,密碼學都在背后默默保護著你的數據不被泄露。
- 保障通信安全:你使用的微信、WhatsApp等即時通訊工具,很多都采用了端到端加密技術,確保只有你和聊天對象能看到消息內容。
- 維護數據隱私:從個人照片到企業數據庫,密碼學幫助我們加密存儲數據,防止數據泄露。
- 確保軟件安全:軟件更新、數字證書等都依賴密碼學來驗證其來源的真實性和完整性。
可以說,密碼學是構建現代網絡安全的基石。理解密碼學的基本原理,對于我們認識和應對網絡威脅至關重要。
2. 核心概念與術語
學習任何一門學科,都需要先掌握它的基本“行話”。下面是一些密碼學中非常核心的概念和術語:
- 明文 (Plaintext):指未經加密的、可以直接理解的原始信息。比如,你想發送的消息“明天上午10點開會”。
- 生活化比喻:明文就像你用大白話寫的普通信件。
- 密文 (Ciphertext):指明文經過加密處理后得到的信息,通常看起來是一串無意義的亂碼。比如,“明天上午10點開會”加密后可能變成“Xf5#gH@&kLpQwR”。
- 生活化比喻:密文就像是用密碼本翻譯過的“火星文”信件,不懂密碼本的人完全看不懂。
- 加密 (Encryption):將明文轉換為密文的過程。這個過程通常需要一個加密算法和一個密鑰。
- 生活化比喻:加密就像是把普通信件鎖進一個保險箱的過程。
- 解密 (Decryption):將密文還原為明文的過程。這個過程通常也需要一個解密算法和一個密鑰(通常與加密密鑰相關)。
- 生活化比喻:解密就像是用正確的鑰匙打開保險箱,取出里面的信件。
- 密鑰 (Key):這是一段秘密信息,用于控制加密和解密的過程。密鑰的保密性至關重要,一旦密鑰泄露,密文就可能被破解。
- 生活化比喻:密鑰就是打開保險箱的那把獨一無二的鑰匙。
- 根據密鑰的使用方式,主要分為兩大類:
- 對稱密鑰 (Symmetric Key):加密和解密使用相同的密鑰。就像你用同一把鑰匙鎖上和打開同一個鎖。
- 非對稱密鑰 (Asymmetric Key):加密和解密使用不同但配對的密鑰,一個叫公鑰 (Public Key),一個叫私鑰 (Private Key)。我們后面會詳細講。
- 算法 (Algorithm/Cipher):指進行加密或解密的一套明確的規則或數學過程。例如,著名的AES、DES、RSA等都是加密算法。
- 生活化比喻:算法就像是保險箱的內部構造和鎖的設計圖紙,它規定了如何用鑰匙把東西鎖進去,以及如何用鑰匙把東西取出來。
3. 密碼學簡史與分類
密碼學的歷史源遠流長,幾乎和人類的文字史一樣悠久。
- 古典密碼 (Classical Ciphers):這些是早期使用的密碼,通常基于字符的替換或移位。
- 凱撒密碼 (Caesar Cipher):據說由古羅馬的凱撒大帝發明,非常簡單。它將字母表中的每個字母向后(或向前)移動固定位數。例如,如果密鑰是3,A就變成D,B就變成E,以此類推。這種密碼很容易被頻率分析破解。
- 小例子:明文
HELLO
,密鑰3
,密文KHOOR
。
- 小例子:明文
- 維吉尼亞密碼 (Vigenère Cipher):這是一種多表代換密碼,比凱撒密碼更復雜一些。它使用一個關鍵詞作為密鑰,根據關鍵詞的不同字母來決定明文字母的移位位數。它在一段時間內被認為是“不可破譯的密碼”,但后來也被破解了。
- 凱撒密碼 (Caesar Cipher):據說由古羅馬的凱撒大帝發明,非常簡單。它將字母表中的每個字母向后(或向前)移動固定位數。例如,如果密鑰是3,A就變成D,B就變成E,以此類推。這種密碼很容易被頻率分析破解。
- 現代密碼 (Modern Ciphers):隨著計算機技術的發展,現代密碼學應運而生。它們基于復雜的數學原理,安全性遠超古典密碼。
- 對稱密碼體制 (Symmetric Cryptography):也稱為秘密密鑰密碼體制或單密鑰密碼體制。其特點是加密和解密過程使用相同的密鑰。常見的對稱加密算法有 DES、3DES、AES、RC4、Blowfish等。
- 優點:加密解密速度快,效率高。
- 缺點:密鑰分發困難。如何安全地把同一個密鑰告訴通信的另一方是個大問題。
- 非對稱密碼體制 (Asymmetric Cryptography):也稱為公鑰密碼體制。其特點是加密和解密使用一對不同的密鑰:公鑰和私鑰。公鑰可以公開,任何人都可以獲取;私鑰則由擁有者秘密保管。用公鑰加密的信息只能用對應的私鑰解密;用私鑰簽名(一種特殊的加密)的信息可以用對應的公鑰驗證。常見的非對稱加密算法有 RSA、ECC、Diffie-Hellman等。
- 優點:解決了密鑰分發問題,可以實現數字簽名等功能。
- 缺點:加密解密速度相對較慢。
- 對稱密碼體制 (Symmetric Cryptography):也稱為秘密密鑰密碼體制或單密鑰密碼體制。其特點是加密和解密過程使用相同的密鑰。常見的對稱加密算法有 DES、3DES、AES、RC4、Blowfish等。
通常在實際應用中,我們會結合使用對稱加密和非對稱加密的優點。例如,在HTTPS中,瀏覽器和服務器會先用非對稱加密協商一個臨時的對稱密鑰,然后用這個對稱密鑰進行后續的大量數據加密傳輸,這樣既安全又高效。
思考題:
- 你能用自己的話解釋一下“保密性”和“完整性”在密碼學中的區別嗎?試著舉一個生活中的例子。
- 如果小明使用凱撒密碼,密鑰是5,他想加密消息
ATTACK
,那么密文會是什么? - 對稱加密和非對稱加密最主要的區別是什么?它們各自有什么優缺點?
非常好!很高興看到大家對密碼學的基礎知識有了清晰的認識。現在,讓我們深入學習一個在現代密碼學中占據核心地位的概念——公鑰加密。
第二部分:公鑰加密基礎 (Public Key Cryptography Basics)
1. 對稱加密的局限性
在上一部分我們提到,對稱加密(Symmetric Cryptography)的特點是加密和解密使用相同的密鑰。這種方式速度快、效率高,非常適合加密大量數據。
但是,它有一個致命的“阿喀琉斯之踵”——密鑰分發難題 (Key Distribution Problem)。
想象一下,你想和遠在千里之外的朋友小紅進行秘密通信。你們約定使用對稱加密。那么問題來了:
- 你怎么把這個共享的密鑰安全地告訴小紅呢?
- 如果通過普通郵件或電話告訴她,那密鑰不就可能被竊聽了嗎?一旦密鑰泄露,你們所有的秘密通信都將暴露無遺。
- 如果派專人護送密鑰,成本又太高,尤其是在需要和很多人進行秘密通信的場景下(比如一個電商網站需要和成千上萬的用戶建立安全連接)。
在互聯網這樣開放的環境中,安全地分發對稱密鑰是一個非常棘手的問題。這就好比你想給朋友一個保險箱的鑰匙,但你又不能當面給他,通過郵寄的方式又怕鑰匙被別人復制。
正是為了解決這個密鑰分發難題,以及實現一些對稱加密無法完成的功能(如數字簽名),公鑰密碼體制應運而生。
2. 公鑰密碼體制(非對稱加密)
公鑰密碼體制 (Public Key Cryptography),也稱為非對稱加密 (Asymmetric Cryptography),它的核心思想非常巧妙:使用一對密鑰,而不是單個密鑰。
這一對密鑰是數學上相關的,它們分別是:
- 公鑰 (Public Key):顧名思義,這個密鑰是公開的。你可以把它告訴任何人,或者發布在互聯網上,就像公開你的郵箱地址或電話號碼一樣。
- 私鑰 (Private Key):這個密鑰是秘密的,必須由密鑰的擁有者妥善保管,絕不能泄露給他人。就像你的銀行卡密碼一樣,只能自己知道。
工作原理:
這對密鑰的神奇之處在于它們的配對工作方式:
-
用于保密通信(加密/解密):
- 發送者(比如你)想給接收者(比如小紅)發送一條秘密消息。
- 你首先獲取小紅的公鑰(這個公鑰是公開的,你可以從小紅的網站、名片或者一個可信的目錄中得到)。
- 你用小紅的公鑰來加密你的消息。
- 加密后的密文通過不安全的網絡(比如互聯網)發送給小紅。
- 即使這個密文被黑客截獲,黑客沒有小紅的私鑰,也無法解密它。
- 小紅收到密文后,使用她自己秘密保管的私鑰來解密,就能得到原始消息。
關鍵點:用某個公鑰加密的數據,只能用其配對的私鑰才能解密。
- 生活化比喻:想象小紅有一個特制的保險箱(她的私鑰)和很多把只能鎖上這個保險箱但不能打開的“鎖”(她的公鑰)。她把這些“鎖”分發給所有想給她寄密信的人。你想給小紅寄密信,就找她要一把“鎖”,把信鎖好后寄給她。只有小紅用她自己保管的保險箱鑰匙(私鑰)才能打開看到信的內容。
-
用于數字簽名(身份驗證/完整性):
- 發送者(比如你)想發送一條消息,并讓接收者(比如小紅)確信這條消息確實是你發的,并且沒有被篡改。
- 你首先用自己的私鑰對消息(或者消息的哈希值,我們后面會講哈希)進行“簽名”(這本質上也是一種加密操作)。
- 你把原始消息和這個“數字簽名”一起發送給小紅。
- 小紅收到消息和簽名后,使用你的公鑰(這個公鑰是公開的)來驗證這個簽名。
- 如果驗證成功,小紅就能確信:
- 這條消息確實是你發送的(因為只有你擁有你的私鑰)。
- 這條消息在傳輸過程中沒有被修改過(因為如果消息被改動,簽名驗證就會失敗)。
關鍵點:用某個私鑰“簽名”(加密)的數據,可以用其配對的公鑰來“驗證”(解密)。
- 生活化比喻:這就像你在文件上蓋上你獨一無二的私章(用私鑰簽名)。任何人都可以通過比對你預先公開備案的印章樣本(公鑰)來確認這個文件確實是你蓋的章,并且內容沒有被涂改。
3. 常見公鑰算法簡介
目前有很多成熟的公鑰加密算法,它們基于不同的數學難題(比如大數分解、離散對數問題)。這里介紹幾個最著名的:
- RSA算法:
- 由三位密碼學家 Rivest, Shamir, Adleman 在1977年提出,是目前應用最廣泛的公鑰加密算法之一。
- 其安全性基于大整數分解的困難性。簡單來說,就是給你兩個很大的素數,把它們乘起來很容易;但是給你它們的乘積,想反向分解出原來的兩個素數則非常非常困難。
- 應用場景:數字簽名、密鑰交換(比如在TLS/SSL握手過程中交換對稱密鑰)、數據加密(雖然由于速度較慢,通常不直接用于加密大量數據,而是用于加密對稱密鑰)。
- ECC(橢圓曲線密碼學 - Elliptic Curve Cryptography):
- 一種基于橢圓曲線數學的公鑰加密方法。
- 優勢:與RSA相比,ECC可以使用更短的密鑰長度達到同等的安全強度。這意味著更小的存儲空間、更快的計算速度和更低的帶寬消耗。因此,ECC在資源受限的設備(如智能手機、物聯網設備)和對性能要求較高的場景中越來越受歡迎。
- 應用場景:比特幣等加密貨幣的密鑰生成和簽名、TLS/SSL、無線通信等。
- Diffie-Hellman密鑰交換算法:嚴格來說,它不是一個加密算法,而是一個密鑰協商協議。它允許兩個從未見過面的人通過不安全的信道安全地協商出一個共享的對稱密鑰,然后他們就可以用這個對稱密鑰進行加密通信了。這是公鑰密碼學的開創性成果之一。
4. 公鑰基礎設施 (PKI - Public Key Infrastructure) 簡介
公鑰加密雖然解決了密鑰分發問題,但也引入了一個新的問題:我怎么能確定我拿到的這個公鑰確實是小紅的,而不是冒名頂替的黑客的呢? 如果黑客偽造了小紅的公鑰給你,你用這個假公鑰加密了信息,那么黑客就能用他對應的假私鑰解密你的信息了!
為了解決公鑰的信任問題,公鑰基礎設施 (PKI) 應運而生。PKI 是一套由硬件、軟件、策略、流程和人員組成的體系,用于創建、管理、分發、使用、存儲和撤銷數字證書 (Digital Certificates)。
- 數字證書:可以把它想象成一個數字身份證。它由一個受信任的證書頒發機構 (CA - Certificate Authority) 簽發,將一個公鑰與一個實體(如個人、組織、網站服務器)的身份信息綁定在一起。
- 證書中包含了公鑰本身、公鑰所有者的信息、CA的數字簽名等。
- 證書頒發機構 (CA):是一個可信任的第三方機構,負責驗證申請者的身份,并為其簽發數字證書。例如,VeriSign (現在是DigiCert的一部分), Let’s Encrypt 等都是著名的CA。
當你訪問一個使用HTTPS的網站(比如銀行網站)時,你的瀏覽器會自動檢查該網站的數字證書。如果證書是由一個受信任的CA簽發的,并且證書有效,瀏覽器就會認為這個網站的公鑰是可信的,然后才會用這個公鑰進行后續的安全通信。
5. 應用場景
公鑰加密技術已經深深融入我們數字生活的方方面面:
- HTTPS/TLS/SSL 安全通信:你每次在瀏覽器地址欄看到
https://
和小鎖圖標,背后都是公鑰加密在發揮作用,確保你與網站之間的數據傳輸是加密和認證的。 - 數字簽名與身份驗證:用于驗證軟件更新的來源、電子文檔的真實性、用戶的登錄憑證等。
- 安全電子郵件 (PGP/GPEP - Pretty Good Privacy / GNU Privacy Guard):允許用戶加密和簽名他們的電子郵件,確保郵件內容的保密性和發件人的真實性。
- 安全外殼協議 (SSH):系統管理員經常使用SSH遠程登錄服務器,SSH也使用公鑰加密進行身份驗證和安全通信。
- 加密貨幣:比特幣、以太坊等加密貨幣的交易和錢包地址都依賴于公鑰加密技術。
思考題:
- 小明想給小紅發送一封加密郵件。他應該使用誰的公鑰來加密郵件?小紅收到郵件后,應該使用誰的私鑰來解密?
- 如果一個網站聲稱自己是某銀行的官方網站,你如何通過數字證書來初步判斷它的可信度?(提示:可以想想CA的角色)
- 為什么說RSA算法的安全性依賴于大數分解的困難性?你能用自己的話解釋一下嗎?
太棒了!很高興大家對公鑰加密的知識點掌握得這么好!
現在,我們已經了解了對稱加密和非對稱加密。接下來,我們要學習一個與它們都不同,但在信息安全領域同樣扮演著關鍵角色的技術——哈希函數 (Hashing Functions)。
第三部分:哈希基礎 (Hashing Basics)
1. 什么是哈希函數?
想象一下,你有一本很厚的小說,你想給這本書生成一個簡短的、獨一無二的“指紋”,通過這個“指紋”就能快速識別這本書,并且如果書的內容有任何微小的改動(比如增刪了一個字),這個“指紋”就會變得完全不同。哈希函數做的就是類似的事情。
哈希函數 (Hash Function),也常被稱為散列函數,是一種數學函數,它可以將任意長度的輸入數據(比如一段文字、一個文件、一張圖片,甚至整個數據庫)通過一個固定的計算過程,轉換為一個固定長度的輸出字符串。這個輸出字符串就被稱為哈希值 (Hash Value)、哈希碼 (Hash Code)、摘要 (Digest) 或指紋 (Fingerprint)。
哈希函數的重要特性:
一個優秀的哈希函數通常具備以下幾個關鍵特性,這些特性使得它們在各種應用中非常有用:
- 單向性 (One-way Property) / 不可逆性 (Irreversibility):
- 從原始輸入數據計算出哈希值非常容易(計算速度快)。
- 但是,從哈希值反向推導出原始輸入數據在計算上是極其困難的,甚至是不可行的。也就是說,你不能輕易地從“指紋”還原出整本書的內容。
- 生活化比喻:就像把雞蛋打散做成炒雞蛋很容易,但想把炒雞蛋完美地還原成原來的生雞蛋幾乎不可能。
- 確定性 (Deterministic):
- 對于相同的輸入數據,無論你計算多少次,哈希函數總是產生完全相同的哈希值。
- 生活化比喻:同一本書,無論你用同一種指紋提取技術提取多少次,得到的指紋都應該是一樣的。
- 雪崩效應 (Avalanche Effect) / 高靈敏性:
- 原始輸入數據即使發生非常微小的變化(比如修改了一個比特位,或一個字符),其計算出的哈希值也會發生巨大且不可預測的變化,看起來與原來的哈希值毫無關聯。
- 生活化比喻:書中的一個標點符號改了,提取出來的“指紋”就會變得面目全非。
- 抗碰撞性 (Collision Resistance):
- 理想情況下,不同的輸入數據應該產生不同的哈希值。如果兩個不同的輸入數據產生了相同的哈希值,就稱之為一個“碰撞 (Collision)”。
- 弱抗碰撞性 (Weak Collision Resistance):對于一個給定的輸入數據
x
,要找到另一個不同的輸入數據y
,使得hash(x) = hash(y)
,在計算上是困難的。 - 強抗碰撞性 (Strong Collision Resistance):要找到任意兩個不同的輸入數據
x
和y
,使得hash(x) = hash(y)
,在計算上是困難的。 - 生活化比喻:很難找到兩本內容完全不同的書,它們卻擁有完全相同的“指紋”。(雖然理論上由于輸出長度固定而輸入無限,碰撞是可能存在的,但對于好的哈希算法,找到碰撞的概率極低,成本極高。)
2. 哈希函數與加密的區別
這是一個非常重要的區分點,初學者很容易混淆:
特性 | 哈希函數 (Hashing) | 加密 (Encryption) |
---|---|---|
目的 | 主要用于驗證數據的完整性和唯一性 | 主要用于保護數據的保密性 |
可逆性 | 不可逆 (單向) | 可逆 (有對應的解密過程) |
密鑰 | 通常不需要密鑰 | 需要密鑰 (對稱密鑰或公私鑰對) |
輸出長度 | 固定長度 | 通常與輸入長度相關或更長 |
用途舉例 | 文件校驗和、密碼存儲、數字簽名中的摘要 | 安全通信 (HTTPS)、數據存儲加密、磁盤加密等 |
簡單來說:
- 加密是為了讓信息不被別人看懂,但授權的人可以用密鑰恢復原始信息。
- 哈希是為了給信息生成一個“指紋”,主要用來檢查信息有沒有被改動過,或者快速比較兩個信息是否相同,但你不能從指紋恢復出原始信息。
3. 常見哈希算法
歷史上出現過很多哈希算法,有些隨著技術發展和安全分析的深入,已經被認為不再安全。以下是一些知名的哈希算法:
- MD5 (Message Digest 5):
- 由Ronald Rivest在1991年設計,產生一個128位(16字節)的哈希值。
- 曾經非常流行,廣泛用于文件校驗、密碼存儲等。
- 安全缺陷:MD5已經被證明存在嚴重的碰撞漏洞,意味著可以相對容易地找到兩個不同的輸入產生相同的MD5哈希值。因此,MD5不再適用于對安全性要求高的場景,例如SSL證書簽名或數字簽名。但對于非安全關鍵的應用,如文件完整性校驗(檢查文件下載是否損壞),有時仍在使用。
- SHA系列 (Secure Hash Algorithm):由美國國家安全局(NSA)設計,并由美國國家標準與技術研究院(NIST)發布的一系列哈希算法。
- SHA-0:早期版本,很快被發現存在缺陷并被SHA-1取代。
- SHA-1:產生一個160位(20字節)的哈希值。也曾廣泛使用,但與MD5類似,SHA-1也已被發現存在碰撞攻擊的風險,雖然比MD5更難。目前也不推薦用于新的安全應用。
- SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256):這是一組更強大的哈希函數,分別產生不同長度的哈希值(例如,SHA-256產生256位哈希值)。目前,SHA-256是應用最廣泛且被認為是安全的哈希算法之一,用于數字簽名、區塊鏈(如比特幣)、TLS/SSL證書等多種安全應用。
- SHA-3 (Keccak):在2015年正式發布的最新一代哈希算法標準。它采用了與SHA-1和SHA-2不同的內部結構(海綿結構),旨在提供一種不同于以往算法的安全替代方案。目前正在逐步推廣應用。
選擇哪種哈希算法取決于具體的安全需求和應用場景。一般來說,推薦使用SHA-2系列(如SHA-256)或SHA-3。
4. 哈希函數的應用
哈希函數的獨特性質使其在計算機科學和信息安全領域有著極其廣泛的應用:
- 密碼存儲 (Password Storage):
- 網站或系統通常不會直接存儲用戶的明文密碼,因為一旦數據庫泄露,所有用戶密碼都會暴露。
- 正確的做法是存儲用戶密碼的哈希值。當用戶登錄時,系統計算用戶輸入密碼的哈希值,并與數據庫中存儲的哈希值進行比較。如果匹配,則認證通過。
- 為了進一步增強安全性,通常還會使用“加鹽 (Salting)”技術:在計算密碼哈希之前,為每個用戶的密碼附加一個隨機生成的字符串(鹽值),然后再進行哈希。這樣即使兩個用戶設置了相同的密碼,由于鹽值不同,它們存儲的哈希值也會不同,可以有效抵御彩虹表攻擊 (Rainbow Table Attack)。
- 數據完整性校驗 (Data Integrity Verification):
- 當你從網站下載一個大文件(如操作系統鏡像、大型軟件安裝包)時,網站通常會提供該文件的哈希值(如MD5或SHA-256校驗和)。
- 下載完成后,你可以在本地計算下載文件的哈希值,并與網站提供的哈希值進行比較。如果兩者一致,說明文件在下載過程中沒有損壞或被篡改。
- 數字簽名 (Digital Signatures):
- 在公鑰加密中,如果要對一個大文件進行簽名,直接用私鑰加密整個文件會非常慢。
- 通常的做法是:先計算文件的哈希值(得到一個固定長度的摘要),然后用發送者的私鑰對這個哈希值進行加密(簽名)。
- 接收者收到文件和簽名后,用發送者的公鑰解密簽名得到原始哈希值,同時自己計算接收到文件的哈希值,比較兩者是否一致。
- 區塊鏈 (Blockchain):
- 區塊鏈技術(如比特幣)的核心組成部分就是哈希函數。
- 每個區塊都包含前一個區塊的哈希值,形成一個鏈式結構,確保了數據的不可篡改性。交易數據也通過哈希進行組織和驗證。
- 數據索引與查找:
- 哈希表(Hash Table)或散列表是一種常用的數據結構,它利用哈希函數將鍵(Key)映射到表中的一個位置,以加快查找速度。
思考題:
- 為什么在存儲用戶密碼時,僅僅使用哈希函數還不夠安全,通常還需要“加鹽”?
- 小明下載了一個軟件,網站提供了該軟件的SHA-256校驗和。小明應該如何操作來驗證他下載的軟件是否完整且未經篡改?
- 哈希函數能用于加密數據嗎?為什么?
有一點沒懂,非對稱加密 rsa 和對稱加密Diffie-Hellman的區別?不都是交換公鑰嗎?
非常好的問題!確實,RSA和Diffie-Hellman都涉及到“公鑰”的概念,但它們的目的和工作方式有顯著的區別。讓我們來梳理一下:
首先,澄清一個常見的誤解:
- RSA (Rivest-Shamir-Adleman) 是一種 非對稱加密算法。它確實使用公鑰和私鑰對。它的主要用途是:
- 加密/解密:用公鑰加密數據,用對應的私鑰解密。
- 數字簽名:用私鑰簽名數據,用公鑰驗證簽名。
- Diffie-Hellman (DH) 本身 不是一個加密算法,而是一個 密鑰交換協議。它的核心目標是讓通信雙方在不安全的信道上安全地協商出一個共享的密鑰(通常是對稱密鑰),然后雙方可以使用這個共享密鑰通過對稱加密算法(如AES)進行后續的保密通信。
核心區別:
-
目的不同:
- RSA:可以直接用于加密少量數據(如會話密鑰)或進行身份認證(通過數字簽名)。
- Diffie-Hellman:專門用于安全地生成一個共享密鑰,它本身不執行數據加密。
-
“公鑰”的含義和使用方式不同:
- RSA中的公鑰:
- 用于加密:任何人都可以獲取接收方的公鑰,用它加密信息,只有持有對應私鑰的接收方才能解密。
- 用于驗證簽名:任何人都可以獲取簽名者的公鑰,用它驗證簽名的真實性和數據的完整性。
- 公鑰是直接分發的,比如通過數字證書。
- Diffie-Hellman中交換的“公開值”:
- 雙方各自生成一個私有值(秘密數字)和一個公開值(基于私有值和一組公共參數計算得出)。
- 他們交換的是這些“公開值”。
- 然后,每一方結合自己的私有值和對方的公開值,通過特定的數學運算,可以獨立計算出完全相同的共享密鑰。
- 關鍵在于:這個最終的共享密鑰從未在信道中直接傳輸過。即使攻擊者截獲了雙方交換的公開值和公共參數,也無法輕易計算出這個共享密鑰(這依賴于離散對數問題的困難性)。
- RSA中的公鑰:
-
是否直接加密數據:
- RSA:可以。例如,A可以用B的公鑰加密一個對稱密鑰,然后發送給B。B用自己的私鑰解密得到對稱密鑰,之后雙方用此對稱密鑰通信。
- Diffie-Hellman:不可以。它只負責生成共享密鑰。數據加密需要依賴其他對稱加密算法。
總結一下“不都是交換公鑰嗎?”這個問題:
- RSA 中,一方(比如服務器)會將其 公鑰 發送給另一方(比如客戶端)。客戶端用這個公鑰加密信息(比如一個預主密鑰,用于后續生成對稱密鑰)。
- Diffie-Hellman 中,雙方交換的是根據各自私鑰計算出的 公開參數/值,而不是直接意義上的“用于加密的公鑰”。它們利用這些交換的公開值和自己的私鑰來獨立推導出同一個共享秘密。
一個簡單的比喻:
- RSA (用于加密會話密鑰):
- Alice想給Bob寄一個秘密盒子(對稱密鑰)。
- Bob先把一個打開的保險箱(Bob的公鑰)寄給Alice。
- Alice把秘密盒子放進Bob的保險箱,鎖上(用Bob的公鑰加密)。
- Alice把鎖上的保險箱寄回給Bob。
- 只有Bob有鑰匙(Bob的私鑰)能打開這個保險箱,取出秘密盒子。
- Diffie-Hellman (密鑰交換):
- Alice和Bob想共同調配出一種只有他們兩人知道的秘密顏色油漆(共享密鑰)。
- 他們先公開商定一種基礎顏色(公共參數)。
- Alice選一種自己的秘密顏色,和基礎顏色混合,把混合后的顏色公開給Bob。
- Bob也選一種自己的秘密顏色,和基礎顏色混合,把混合后的顏色公開給Alice。
- 現在,Alice用Bob給她的混合顏色,再混合上自己最初的秘密顏色。
- Bob用Alice給他的混合顏色,再混合上自己最初的秘密顏色。
- 神奇的是,他們最終得到的油漆顏色是完全一樣的!而偷聽者即使知道基礎顏色和他們交換的混合顏色,也很難知道他們各自的秘密顏色,以及最終的共享顏色。
所以,雖然都涉及公開信息的交換,但RSA是直接用對方的公鑰進行操作(加密或驗證),而Diffie-Hellman是通過交換計算出的公開值來共同派生出一個秘密,這個秘密本身不被直接傳輸。
太棒了!同學們,看到大家對密碼學、公鑰加密和哈希函數都有了扎實的理解,我感到非常欣慰!這些都是我們數字世界安全的基石。
現在,我們已經掌握了足夠的理論知識,是時候進入更具實踐性的部分了——學習如何使用 John the Ripper (JtR) 這款強大的密碼破解與審計工具。請注意,我們學習這個工具的目的是為了更好地理解密碼安全和進行合法的安全測試,嚴禁用于任何非法用途。
第四部分:John the Ripper 工具使用
1. 什么是 John the Ripper (JtR)?
John the Ripper,通常簡稱為 JtR 或 John,是一款非常著名且功能強大的開源密碼破解(或稱為密碼恢復/審計)工具。
- 它的主要用途是什么?
- 密碼安全審計:系統管理員可以使用JtR來檢測系統中的弱密碼,提醒用戶修改,從而增強整體安全性。
- 密碼恢復:在合法授權的情況下,幫助用戶恢復忘記的密碼(例如,從自己系統的密碼哈希中恢復)。
- 安全研究與教育:幫助安全研究人員和學生理解密碼破解的原理和不同密碼方案的強度。
- 它能破解哪些類型的密碼?
- JtR支持破解種類繁多的密碼哈希和加密格式。這包括但不限于:
- 各種Unix風格的密碼哈希 (如 DES, MD5, SHA-crypt, Blowfish-crypt 等,通常存儲在
/etc/shadow
文件中)。 - Windows LM 和 NTLM 哈希 (用于Windows用戶賬戶密碼)。
- 各種應用程序的密碼哈希 (如數據庫、Web應用、Office文檔、壓縮文件如ZIP/RAR等)。
- 網絡協議中的認證哈希 (如 Kerberos, LDAP)。
- 甚至一些較弱的加密密鑰。
- 各種Unix風格的密碼哈希 (如 DES, MD5, SHA-crypt, Blowfish-crypt 等,通常存儲在
- JtR通過其模塊化的設計,可以支持非常多的格式,并且社區也在不斷為其添加新的格式支持。
- JtR支持破解種類繁多的密碼哈希和加密格式。這包括但不限于:
- 支持的操作系統:
- JtR最初是為Unix系統設計的,但現在它是一個跨平臺的工具,可以在多種操作系統上運行,包括:
- Linux (各種發行版)
- macOS
- Windows
- 以及其他類Unix系統 (如 *BSD, Solaris等)。
- JtR最初是為Unix系統設計的,但現在它是一個跨平臺的工具,可以在多種操作系統上運行,包括:
2. 安裝 John the Ripper
JtR的安裝方式因操作系統而異。通常有兩種主要的JtR版本:
- Core John (核心版):這是官方發布的穩定版本,包含了主要的破解功能和格式支持。
- Jumbo John (社區增強版):這是一個由社區維護和增強的版本,通常包含更多最新的破解格式、優化和功能。對于大多數用戶來說,推薦使用 Jumbo John,因為它功能更全面。
安裝方法概述:
- Linux (如 Debian/Ubuntu):
這通常安裝的是核心版或一個較舊的Jumbo版。為了獲取最新的Jumbo版,你可能需要從源碼編譯安裝,或者查找特定發行版的社區倉庫。sudo apt update sudo apt install john
- Linux (從源碼編譯 Jumbo John - 推薦方式):
- 訪問 John the Ripper 社區版 (Jumbo) 的 GitHub 頁面。
- 下載最新的源碼包 (通常是
.tar.gz
或.zip
文件) 或使用git clone
。 - 解壓源碼包,進入
src
目錄。 - 運行
./configure
和make -s clean && make -sj4
(這里的4
是你的CPU核心數,可以調整)。 - 編譯完成后,可執行文件通常在
run
目錄下 (如john
)。
- macOS:
- 可以使用 Homebrew 包管理器安裝:
或者,為了獲得Jumbo版,可以使用:brew install john
brew install john-jumbo
- 同樣也可以從源碼編譯安裝。
- 可以使用 Homebrew 包管理器安裝:
- Windows:
- 可以從 John the Ripper 官方網站 或 Jumbo John 的 GitHub 發布頁面下載預編譯的Windows二進制包 (通常是
.zip
文件)。 - 解壓后,在
run
目錄下找到john.exe
即可運行。
- 可以從 John the Ripper 官方網站 或 Jumbo John 的 GitHub 發布頁面下載預編譯的Windows二進制包 (通常是
驗證安裝:
安裝完成后,你可以在命令行中運行以下命令來檢查JtR是否成功安裝并查看其版本信息:
cd path/to/john/run # 進入JtR的運行目錄
./john --version # Linux/macOS
# john.exe --version # Windows
3. JtR 的基本工作流程
使用JtR破解密碼通常遵循以下步驟:
- 準備密碼哈希文件 (Input File):
- 首先,你需要獲取你想要破解的密碼的哈希值。這些哈希值必須以JtR能夠識別的格式存放在一個文本文件中。
- 例如,對于Linux系統,你可能需要從
/etc/shadow
文件中提取用戶賬戶信息(這通常需要root權限)。對于Windows,可能需要從SAM數據庫中提取NTLM哈希。 - JtR自帶了一些工具(如
unshadow
用于合并/etc/passwd
和/etc/shadow
,pwdump
的變種用于Windows)來幫助你準備這些哈希文件。 - 重要提示:獲取密碼哈希通常需要相應的權限,并且必須在合法授權的情況下進行。
- 選擇破解模式 (Cracking Mode):
- JtR提供了多種破解模式,以適應不同的情況和密碼復雜度。我們稍后會詳細介紹這些模式。
- 運行破解 (Run John):
- 執行
john
命令,指定哈希文件和選擇的破解模式(或讓JtR自動嘗試)。
- 執行
- 查看破解結果 (Show Cracked Passwords):
- JtR會將成功破解的密碼保存在一個名為
john.pot
(POT代表Potentially Cracked Passwords) 的文件中,該文件位于JtR的運行目錄或用戶的主目錄下。 - 你可以使用
john --show <hash_file>
命令來顯示已破解的密碼。
- JtR會將成功破解的密碼保存在一個名為
4. JtR 的主要破解模式
JtR的強大之處在于其靈活的破解模式。以下是幾種最主要的模式:
- 單一破解模式 (Single Crack Mode /
-single
):- 這是JtR默認會嘗試的模式之一,速度非常快。
- 它會利用哈希文件中提供的額外信息(如用戶名、GECOS字段中的全名、家目錄等)來生成候選密碼。
- 例如,如果用戶是
jsmith
,JtR會嘗試jsmith
,smith
,john
,j0hn
等變體。 - 它還會應用一些常見的密碼變換規則。
- 命令示例:
./john my_hashes.txt -single
(通常JtR會自動嘗試此模式,無需顯式指定)
- 字典破解模式 (Wordlist Mode /
--wordlist=<file>
):- 這是最常用也是非常有效的破解模式之一。
- 你需要提供一個密碼字典文件 (Wordlist),這個文件包含大量可能的密碼(每行一個)。互聯網上有很多公開的密碼字典,你也可以創建自己的字典。
- JtR會逐一嘗試字典中的每個詞作為密碼。
- 規則引擎 (Rules):為了提高字典破解的效率,JtR擁有一個強大的規則引擎 (
--rules
)。這些規則可以對字典中的詞進行各種變換,如大小寫轉換、添加數字或符號、顛倒順序、組合詞語等,從而生成更多候選密碼。- 例如,如果字典詞是
password
,規則可以生成Password
,password123
,p@$$wOrd
,drowssap
等。
- 例如,如果字典詞是
- 命令示例:
./john --wordlist=/path/to/password.lst my_hashes.txt ./john --wordlist=/path/to/password.lst --rules my_hashes.txt
- 增量破解模式 (Incremental Mode /
-i
或--incremental=<type>
):- 這種模式會嘗試所有可能的字符組合,類似于暴力破解 (Brute-force Attack),但JtR的增量模式更智能,它會基于字符頻率和密碼長度進行優化。
- 你可以指定字符集類型 (
<type>
),如All
(所有可打印ASCII字符),Digits
(數字),Alpha
(字母),Alnum
(字母和數字) 等,或者自定義字符集。 - 這種模式通常非常耗時,尤其是對于長而復雜的密碼,但如果其他模式失敗,它可能是最后的手段。
- 命令示例:
./john -i=Digits my_hashes.txt # 只嘗試數字密碼 ./john -i=Alnum my_hashes.txt # 嘗試字母和數字組合 ./john -i my_hashes.txt # 嘗試默認的增量模式
- 外部模式 (External Mode):允許用戶通過C語言編寫自定義的破解邏輯,非常靈活但需要編程知識。
- 掩碼模式 (Mask Mode /
--mask=<mask>
):Jumbo John 支持的一種高級暴力破解模式,允許你定義密碼的結構(掩碼),例如你知道密碼是8位,前4位是小寫字母,后4位是數字,可以大大縮小搜索空間。
JtR通常會按一定順序自動嘗試這些模式(Single -> Wordlist (使用默認password.lst
) -> Incremental)。
5. 常用命令與選項
以下是一些JtR常用的命令和選項:
- 基本運行:
JtR會自動檢測哈希類型并嘗試默認的破解模式。./john my_password_hashes.txt
- 指定哈希格式 (
--format=<type>
):- 如果JtR無法自動識別哈希類型,或者一個哈希文件中有多種類型的哈希,你可以手動指定。
- 例如:
--format=nt
(Windows NTLM哈希),--format=raw-md5
(純MD5哈希),--format=sha256crypt
(Linux SHA256哈希)。 - 你可以運行
./john --list=formats
查看支持的所有格式。
./john --format=raw-md5 my_md5_hashes.txt
- 顯示已破解的密碼 (
--show
):
這會從./john --show my_password_hashes.txt
john.pot
文件中讀取并顯示與my_password_hashes.txt
文件相關的已破解密碼。 - 指定會話名稱 (
--session=<name>
):- 允許你為破解過程命名一個會話。這對于暫停和恢復長時間的破解任務非常有用。
./john --session=my_session --wordlist=rockyou.txt my_hashes.txt
- 恢復會話 (
--restore=<name>
):- 如果破解過程意外中斷(或你手動停止),可以使用此命令恢復。
./john --restore=my_session
- 使用多核心 (
--fork=<N>
):- 利用多CPU核心并行破解,顯著提高速度。
./john --fork=4 --wordlist=rockyou.txt my_hashes.txt # 使用4個核心
- 列出支持的格式/子格式/選項等 (
--list=...
):--list=formats
:列出所有支持的哈希格式。--list=rules
:列出當前配置的規則。--list=incremental-modes
:列出可用的增量模式。
6. 獲取密碼哈希 (簡述與提醒)
再次強調,獲取密碼哈希必須在合法授權的前提下進行。
- Linux:用戶密碼哈希通常存儲在
/etc/shadow
文件中。你需要root權限才能讀取它。通常使用unshadow /etc/passwd /etc/shadow > my_hashes.txt
命令將其轉換為JtR可直接使用的格式。 - Windows:用戶密碼哈希(LM哈希 - 已過時但可能存在,NTLM哈希 - 仍在使用)存儲在安全賬戶管理器 (SAM) 數據庫中。直接訪問SAM文件非常困難,通常需要使用專門的工具(如
pwdump
,fgdump
, Mimikatz等,或通過離線方式從系統備份中提取)來導出哈希。這些操作通常需要管理員權限。 - 應用程序哈希:許多應用程序(如數據庫、Web框架、壓縮軟件)使用自己的方式存儲密碼哈希。你需要查閱相關文檔或使用特定工具來提取這些哈希。
- 例如,一個Web應用的數據庫中可能有一個
users
表,其中password
字段存儲了用戶密碼的MD5或SHA256哈希。
- 例如,一個Web應用的數據庫中可能有一個
7. 實踐案例 (概念性)
讓我們通過幾個概念性的例子來理解JtR的用法:
- 案例1:破解一個簡單的Linux密碼哈希文件
linux_hashes.txt
# 假設 linux_hashes.txt 內容類似 (實際格式更復雜): # user1:$1$salt$hashed_password # user2:$6$salt$hashed_password./john linux_hashes.txt # JtR自動檢測格式并開始破解# 等待一段時間后,查看結果 ./john --show linux_hashes.txt
- 案例2:破解一個包含純MD5哈希的文件
md5_list.txt
,使用字典common_passwords.txt
# 假設 md5_list.txt 內容 (每行一個MD5哈希): # 5f4dcc3b5aa765d61d8327deb882cf99 # e10adc3949ba59abbe56e057f20f883e./john --format=raw-md5 --wordlist=common_passwords.txt md5_list.txt# 查看結果 ./john --show --format=raw-md5 md5_list.txt
8. 道德與法律
極其重要:
- 合法授權:使用John the Ripper或任何密碼破解工具,必須獲得目標系統或數據的明確授權。未經授權的密碼破解是非法行為,可能導致嚴重的法律后果。
- 道德使用:學習和使用這些工具的目的是為了更好地理解安全風險,從而加強防護,而不是用于惡意攻擊。
- 密碼安全的重要性:通過學習密碼破解,我們更能體會到設置強密碼的重要性。一個強密碼應該足夠長,包含大小寫字母、數字和特殊符號,并且不容易被猜到。此外,多因素認證 (MFA) 也是保護賬戶安全的重要手段。
思考題:
- John the Ripper 的“單一破解模式”和“字典破解模式”有什么主要區別?它們各自的優勢是什么?
- 為什么在進行字典破解時,使用“規則引擎”可以大大提高破解成功率?
- 如果你忘記了自己Linux系統的登錄密碼(并且你有物理訪問權限和root權限),理論上你可以如何利用John the Ripper來嘗試恢復它?(簡述思路,并強調前提條件)
- 除了技術層面,使用密碼破解工具還需要考慮哪些重要因素?