在一個完美的世界上,沒有人需要用到密碼。每個人都高度自律,心無邪念;每件快遞都能不經攔截準確送達收件人;而每個寄件者都是值得信賴的。但是我們并不在這樣完美的世界中生存。過去的數十年間,密碼學已經發展到不僅可以通過加密來保障機密性,還可以確保消息的完整性、身份驗證,以及不可否認性——所有的一切都是為了保證消息私密、真實和可靠。
假如您的系統已經實現了強有效的密碼策略,這可能會使您認為不再需要通過生物特征來驗證就是用戶本人。為了理解為什么驗明用戶正身在密碼學中如此重要,讓我們依次對照來看密碼學中幾種方法的成功和不足之處。由此,作為諸如銀行系統或醫療系統等高端服務的提供者,可以了解為什么您可能需要在密碼策略的基礎上進一步實現基于生物特征的身份驗證功能。
僅憑加密無法防御某些特定類型的攻擊
您可以把加密比作一個函數,比如 E,這個函數接收兩個參數,消息 m 和密鑰 k,并由此生成密文 c。生活中人們常常把這個密文當作加密,但事實上加密指的是能夠生成攻擊者無法讀取的加擾信息的算法,而最終的加擾信息就是密文。
c = E(m,k)
只要密鑰 k 足夠長,當您僅知道 m 或 c 部分內容時,幾乎不可能得出密鑰 k。但是,攻擊者無需解密消息即可對其進行篡改,攻擊者也許可以編輯密文、刪除密文,或者以重放的方式重新發送一條包含密文的消息。
并不是所有的攻擊者都想要盜竊您的數據;他們可能只想給您帶來不便。試想有一個攻擊者,他只是重放了您向電腦城付款 $2,000 購買筆記本的加密交易。假設他是與該電腦城沒有任何聯系的攻擊者,所以他什么也沒有偷走。您固然可以通過一些申訴手段向店家要回退款,但既蒙受了時間的損失又沒了好心情。更糟糕的是,某些精于此道的攻擊者也許會將電腦城的銀行賬戶替換為其他銀行賬戶——這一切完全不需要解密您傳輸的密文。
當然,剛才的這些都只是接觸了其中的皮毛。針對純加密方案的攻擊有許多更知名的案例。即使您的加密算法充分防范了已知的攻擊手段,但仍可能會有不足。簡單說來,您沒辦法永遠保證消息的私密性。甚至是在最佳密碼學策略的加持下,當下技術的發展速度只能讓您的消息在 30 年內保持私密,或許運氣好的話,能有 50 年。因此,僅憑加密是無法與破壞消息完整性的攻擊者相抗衡的。您還需要用上身份驗證手段,也就是下個小節要探討的問題。
通過消息身份認證保證消息不被篡改
在一些敏感場合中,欺騙性質的消息誤傳會造成破壞性影響。這個重要的事實啟發安全工程師們創造了消息認證碼 (Message Authentication Code,簡稱 MAC 或 HMAC)。如果發信人在發送消息的同時還傳輸了 MAC,那么攻擊者就無法再修改內容并假裝這就是原始消息。同時攻擊者也無法重放已經發送過的消息。攻擊者能做到的最多就是刪除發送的消息造成通訊失敗。
MAC 是什么?MAC a 與通過消息和密鑰計算得到的密文相似。本質上,發信人將消息 m 和密鑰 k傳入函數 h 計算就能生成 MAC 了。隨后,發信人同時將消息和 MAC 發送給收信人。
m,a = h(m,k)
MAC 與單條消息并不是唯一對應的,這是由于鴿籠原理導致的,大致意思是如果您的鴿子數量比鴿籠要多,那么某些鴿籠中就不止一只鴿子了。MAC 的長度是預先就決定了的,因此消息的數量會比對應 MAC 的數量要多。但是由于搜索域太大,攻擊者想要在不知道密鑰的情況下很難猜出修改后的消息對應的 MAC。因此,MAC 能夠有效防止消息被修改的原因是只有發件人和目標收件人知道密鑰。如果攻擊者想要修改發送的消息,那么他必須替換 MAC 以匹配更改。但是在不知道密鑰的情況下這幾乎是不可能的。由于連續兩次計算 m,a = h(m,k) 會生成兩個不同的 MAC,消息重放攻擊也會隨之失效。這是因為在實踐中通常還有第三個嚴格增加的參數 t: 因此公式寫作 m,a = h(m,k,t)。由此,MAC 函數能幫助合法的收件人輕松驗證是否遭遇了消息重放攻擊。
MAC 機制本質上使得攻擊者必須破解密鑰。由于 MAC 的存在,模仿原始消息不再可行。消息完整性得到根本保障。雖然 MAC 機制非常實用,但在機密性方面它仍然有局限,這也是后面章節要說明的問題。
已簽名但未封裝
值得注意的是,MAC 只是對消息進行了簽名而沒有將其封裝——也就是沒有機密性。攻擊者仍然可以讀到消息的內容;只不過他們無法輕松篡改內容。但是同時進行簽名和封裝并不難。我們不再使用 m,a = h(m,k?),取而代之的是通過代數替換得到 c,a = h(c,k?) ,其中 c 是由 c= E(m,k??) 計算得出的。
好的密碼算法就像是好房子。它們可以在狂風暴雨中屹立 30 年以上,而不是僅存在一天就坍塌。特別是對于密碼學家來說,這意味著他們需要預見在未來的 10 年或是 30 年后攻擊者會以當下尚未發明的技術來破解加密算法,而不是僅考慮攻擊是否會在明天或下個月發生。因此,MAC 并不能使加密牢不可破。它只是增加了攻擊者的破解難度。30 年后的攻擊者可能會用 生日攻擊、中途相遇攻擊 來猜測經過篡改的消息的 MAC 值,從而使收信人接到假冒的消息。
非對稱加密讓擴展更從容
目前為止,我們談到了密碼學家如何搭配加密和 MAC 來生成簽名且封裝的消息。我們也談到了攻擊者所能做的最多就是刪除這些消息;否則消息會成功、私密、完整地送達收信人。聽起來這就是我們所需要的全部了,其實還有更多。在我們開始討論 "更多" 之前,不妨先聊聊可擴展性。
目前為止我們討論的大多數技術被統稱為對稱密碼學。簡言之,它們要求發信人和收信人都是用完全相同的密鑰來加密或者解密消息,以及創建或校驗 MAC。這種方法的問題在于,如果整個群組有 10 名成員,那么每名成員都需要分享和存儲 9 個不同的密鑰,這樣才能夠在任意兩名成員之間互發加密信息。這樣一來,整個群組就有 45 個 key 存在。如果有 20 個人,就有 190 個密鑰;一般地, n 個人就有 (n-1)n/2 個密鑰。假想一下,如果對聯系人列表里的每個人,您都需要使用一個獨立手機號碼與其聯系會怎樣?這樣一來,您不能將一個號碼發給所有的聯系人,而每次結交新朋友,您都需要購買一個新的手機號碼!這就是對稱加密的問題所在。難以擴展。不過幸好還有非對稱加密可用。
非對稱密碼學 使用數論中的觀點 (尤其是 有限域理論 和 單射函數) 來實現其技術優雅。本質上是每個人都創建一個公鑰和一個私鑰。任何想要和您交流的人可以使用您的公鑰來加密信息,但只有您的私鑰可以將其解密。
這里意在討論非對稱加密,而不是深入探討數論。要支持不可否認性,您必須要使用到非對稱加密,這是我們接著要討論的下一個密碼學屬性。
必要的不可否認性
不可否認性是 "不可食言" 的專業說法。電子商務革命把這個簡單的公平交易原則帶到密碼學領域的前沿和中心。
在使用對稱密鑰的情況下,收到消息的人 (比如 Bob) 沒辦法向法官證明發信人 (比如 Alice) 是真正發消息的那個人。這是因為 Alice 和 Bob 用相同的密鑰來通訊。或許 Alice 真的發送了原始消息,但 Bob 篡改了它,抑或 Alice 在撒謊。裁判沒辦法判斷到底是哪一種情況。
然而在使用非對稱密鑰時,只有持私鑰的那個人才可以對消息簽名。全世界任何人都可以讀到消息的內容,畢竟公鑰是公開的。因此會出現這樣的情況: 當 Alice 需要從 Bob 那邊買東西時,她會用 Bob 的公鑰來加密交易,并使用她自己的私鑰來簽名。然后當 Bob 收到交易信息后,可以用 Alice 的公鑰來確定是不是真的用 Alice 的私鑰簽的名,隨后用他自己的私鑰來解密消息。由此可見,簽名就被用來提供不可否認性了。MAC 和簽名本質上是一樣的,不過前者是對稱加密的概念,而后者屬于非對稱加密。
簡單回顧
現在我們來回顧一下。密碼學被應用于加密和認證消息,并且提供不可否認性。當使用了正確的技術,消息的真實性和加密性兩方面都難以被破解——它們都依賴較為復雜的數學手段,比如整數分解、離散對數和橢圓曲線算法,這些方法隨后被應用于有限域問題中。需要指出的是,通過數學分析來獲得加密密鑰可能會很困難,但是仍有其他方法可以攻入安全系統,比如社會工程學,也就是人可能被誘導泄密。此外,我們沒有聊到密鑰生成和認證的過程,因為我們已經說得很明確了: 作為一門工程學科,密碼學會根據時代的發展而不斷演進,并試圖保持超前攻擊者。
與加密和身份認證不同,不可否認性會更難對付一點,因為用戶身份的驗證可以為攻擊者再添一層難度。
用戶在場的重要性
到目前我們已經了解到密碼學就是在研究安全等級: 對于一個攻擊者來說,擾亂通訊的代價 (時間、金錢和體力) 有多么高。盡管如此,仍然存在一個主要問題: 僅憑消息發自我所持有的設備且由我的私鑰簽名,并不能說明是我本人發送的消息。病毒或是未經授權的用戶也有可能發送了該消息。由于這些以及類似的原因,盡管數字簽名已經被納入國際法律體系中,比如 ESIGN,許多跨國商貿機構仍然沒有信任它,因為在無法證明用戶在場的情況下很難保證不可否認性,而舉證責任由商家承擔。
為了增強商家對不可否認性的信心,業界引入了 雙重要素驗證 (2FA)。因為網絡罪犯常常會破解那些僅受用戶名和密碼保護的在線賬號,2FA 引出了讓自稱是合法用戶的代理提供多一種信息的概念。這里所說的多一種信息,通常指的是以下三類中的一種: 某件您知道的事、某樣您擁有的事物,或是您是誰。2FA 的目標是要給商家信心去相信,用戶本人的確在進行交易。兩種常見的 2FA 形式是電子鑰匙鏈和通常由短信發送的驗證碼。使用電子鑰匙鏈或相似的硬件令牌都有容易丟失或被盜的問題。而當遺失或被竊的設備就是接收短信或者推送通知的設備時,用短信驗證碼作 2FA 也就毫無抵御能力了。因此,如今 2FA 最先進的形式就只剩您身體的一部分。生物特征身份驗證就是這種增強 2FA 的例子。
在您的安全策略實現中用生物識別特征驗證是否為用戶本人,可以讓您的應用更安全,并且不可否認性成為了您的商業模式中的一個可靠特性。對于醫療保健或是酒店服務業應用來說,這能夠確保更真實的用戶登記或是取消預約情況。對于電子商務和銀行應用,這使得您的客戶服務團隊花費更少的時間來處理顧客的小孩意外產生的購買行為和退款,從而有更多的時間以更多令人滿意的方式使顧客開心。
使生物特征認證在您的安全系統中成為阻攔攻擊者的額外障礙的根本原因在于: 雖然生物識別和密碼學手段是相互完全獨立的措施,但它們都使得攻擊者難以攻破。因此,兩者結合就可以讓攻擊者更難以得逞。
舉個例子,在 Android 當中,生物特征識別像是一條單行道。用戶的生物特征信息永遠不會離開設備,而且絕不會與應用共享。當用戶決定把自己的生物特征信息錄入 Android 設備時,他們必須要通過系統的設置應用。倘若用戶要使用指紋或是人臉識別,那么他們需要把手指放在傳感器上,傳感器會直接把指紋圖像發送到 Android 設備的受限區域內,這個區域被稱為可信執行區域 (TEE)。隨后,當您的應用需要通過生物特征驗證用戶本人在操作時,Android 框架和運行于 TEE 中的生物識別系統會替您的應用處理整個 "用戶是否在場" 的驗證過程。由于 Android 框架讓冒充設備主人的生物特征非常困難,您可以給這個用戶本人驗證充分的信心。
您可以通過閱讀我們的文章《結合使用 BiometricPrompt 和 CryptoObject》,更深入了解在 Android 系統上生物特征驗證是怎樣用不可否認性來增強您應用的安全的。
總結
您在本篇文章中了解到了:
- 為什么良好的密碼策略實現需要強調私密性、真實性和不可否認性。
- 為什么只使用加密不足以保護消息免受攻擊。
- 為什么 MAC 或 HMAC 能夠有效避免消息被篡改。
- 為什么非對稱加密比對稱加密更容易擴大規模。
- 為什么現實生活中,不采用生物特征驗證就難以實現不可否認性。
- 為什么生物特征驗證可以通過用戶存在性驗證來增強加密實現。
- 在哪里可以了解到如何在您的應用中實現生物特征驗證。
我們還撰寫了許多文章,它們涉及工程最佳實踐、設計指南以及將生物特征驗證集成到您應用中的技巧:
- 如果您想要了解怎樣在您的應用中實現生物特征驗證,請閱讀系列文章:
- 如果您的應用中有使用了 FingerprintManager 的舊邏輯,我們建議您用 BiometricPrompt 取代它。
- 全面了解 BiometricPrompt,請閱讀: 在所有 Android 設備中使用統一的生物識別身份驗證 API
- 了解怎樣完成遷移工作,請閱讀: 從 FingerprintManager 遷移到 BiometricPrompt
祝您編程愉快!