帳號泄露事件頻發,到底什麼樣的密碼才安全?
某數字公司旗下的視頻應用撞庫用戶的密碼;烏雲曝光了網易郵箱存在的安全漏洞;百度全系 Android 應用受 WormHole 漏洞影響;某知名社區遭攻擊致帳號信息泄露……這些越來越多的隱私安全事件,讓我們不得不對網路安全重視起來。
那麼,密碼作為一種最原始、最廣泛使用的安全手段,到底應該如何設置?什麼樣的密碼才是安全的?有沒有什麼好用的工具可以管理好自己的密碼?甚至,如果我們能明白這些密碼泄露事件的根源與原理,對我們加強安全意識會不會有額外的幫助?
在開始介紹具體的方法和措施前,我們希望先讓您明白,密碼到底是如何泄露的,正所謂知其然,也要知其所以然,密碼安全不僅僅只是一些教條性的操作指南,更重要的是我們懂得在各個途徑和過程中,如何保護好我們的密碼。
密碼到底是如何泄露的?
想要知道密碼是如何泄露的,不妨先想一想,你的密碼都在哪?概括地來說,它只會在三個地方:本地、傳輸過程中、遠程資料庫中。
舉個例子來說,如果你在瀏覽器中輸入或保存了密碼,這個密碼在你點擊登錄前,只存在於你的本地,一旦你點擊登錄,瀏覽器就會將你的登錄名和密碼打包成為一個請求,發送給遠程的伺服器,這時候你的密碼會經歷一段非常短暫的旅程,最終到達遠程伺服器。如果你是第一次註冊的話,你的密碼還會以某種形式存儲在對方的資料庫中。
搞清楚了這個過程,我們來看一下各個環節里,都存在著哪些風險,會讓你的密碼泄露吧。
1. 本地泄露
1.1 惡意木馬/惡意植入/鍵盤監聽
電腦中病毒後,有些病毒只會在後台靜悄悄地運行著,監控著你鍵盤上輸入的每一個字元,然後偷偷發送給黑客。或者,前段時間的 XcodeGhost 事件,本質上也是應用程序中被植入了一段惡意代碼,在後台偷偷地向遠程伺服器發送你的一些個人信息……
然而實際上,如果你能堅持使用可信任的設備,不安裝未知來源的(盜版)軟體,不對設備進行高危操作(如越獄、Root),感染惡意木馬病毒的概率並不大。特別是在 iOS 系統上,得益於沙盒機制,每一個 App 的密碼文件都單獨加密保存,在不越獄的情況下,第三方是無法直接訪問的。
建議:
- 不在公共或有潛在安全風險的設備上進行密碼操作;
- 除非你非常有自信,否則請不越獄,不 Root;
- 不安裝未知來源的(盜版)軟體。
1.2 偽造
偽造在 Android 平台上特別常見,也出現過由於 URL Scheme 的無驗證機制,而出現的偽造情況。很好理解,如果你開發一款和支付寶長得一模一樣的 App,或者搶先佔用 alipay:// 這個協議的 URL Scheme,理論上你可以誘騙或劫持用戶打開你的偽造支付寶來進行資金安全操作,試想如果你沒有任何安全知識,僅僅看著界面一模一樣的偽造支付寶,你又如何保證自己不被釣魚呢?
建議: 從可信的源(如 App Store、Google Play)下載安裝軟體。
2. 傳輸過程泄露
2.1 明文傳輸
你有沒有想過,當你在一個網頁上點擊登錄時,到底發生了什麼?大多數情況下,瀏覽器其實是向伺服器發送一個 POST 請求,這個請求可能是長這個樣子的:http://login.qq.com/id=10001&pw=immahuateng
。發現了嗎?你的登錄名和密碼是直接暴露在這個 URL 裡面的。
儘管有些網站會對這個鏈接進行所謂的加密處理,但有些所謂的加密是不可靠的,例如僅僅只是把這些字元串轉化為 Base64 碼,或者用 Javascript 進行加密處理,或許對於小白來說已經完全看不懂了,但是對於真正的黑客來說,這些加密都是可逆的,很多情況下完全可以不費吹灰之力恢復密碼的本來面貌。
如果是在一個不可靠的網路環境下,黑客完全可以使用 Wireshark 這樣的工具攔截請求包,直接看到你的密碼。
建議:不使用不可信的 WiFi 網路,特別是公共場合的陌生、免費 WiFi。
2.2 非加密傳輸
實際上,由於成本的考量,很多國內網站的登錄頁面使用的仍然是 Http 協議,而在國外諸如 Facebook、Twitter 這樣的網站,早已經全站強制 Https 協議。只是多了一個 s,兩者有什麼不同呢?後者的傳輸過程是加密的,這樣即使像前一種情況下有人攔截了你的數據請求包,他也無法獲知傳輸的到底是什麼內容。
當然,近兩年隨著國內網路安全環境的提升,越來越多的網站開始支持甚至全站使用 Https 協議,不過,像網易郵箱等網站,SSL 仍然作為可選項存在,雖然開啟後對速度會有一定影響,但相比起開啟後的安全性能提升,這點速度影響微乎其微。
對了,前段時間鬧得沸沸揚揚的 OpenSSL 漏洞事件,實際上就是說這種加密傳輸的實現方法有一個漏洞,正所謂沒有絕對的安全,對瀏覽器和網站證書也可以保持適當的關注。
建議:
- 如果可能,使用 SSL 加密;
- 保持瀏覽器在最新版本;
- 檢查網站證書是否可信(一般瀏覽器都會有提示)。
3. 伺服器端泄露
就算你的本地計算機再安全,網路傳輸過程再可靠,然而一旦你使用的網路服務提供商不可靠,如果對方的資料庫泄露(常稱為拖庫),那麼你的密碼安全一樣岌岌可危。乍一看如果是對方的問題,好像自己也無能為力,不過一旦你了解到作為網路平台是如何存儲用戶密碼的,那麼還是能在密碼設置方面為自己增加一些保障。
接下來的一些內容可能會有一些技術概念,不過我們為了方便大家的理解,儘可能地進行了簡化處理,並加以例子說明。
3.1 明文泄露
什麼是明文泄露呢?比如說你的密碼是 123456,你所在的平台直接在它們的資料庫里存下了你的密碼 123456,是的,原封不動地存在資料庫里。這意味著什麼呢?對方的資料庫一旦泄露,任何人,不需要藉助任何技術手段,你的密碼就直接展現在了他們面前。
聽著好像很蠢,真的會有平台直接原封不動地把密碼存下來嗎?不要懷疑,想當年 2011 年轟動全網的 CSDN 泄露事件,作為一家技術網站,用戶密碼的保存就是用的原文。遇到這種事情,簡直是叫天天不應,叫地地不靈。
建議:你選擇不知道對方有多坑爹,直到……
3.2 可逆加密泄露
建議:如果說那些直接明文保存用戶密碼的公司很蠢,那麼使用可逆加密的公司只是看起來不那麼蠢而已。什麼是可逆的加密呢?舉一個很簡單的例子,同樣是保存用戶的密碼 123456,你可以設定一個規則,比如 1 對應 z,2 對應 y,3 對應 x,以此類推,那麼最後存下來的密碼就是 zyxwvu。發現了嗎?可逆加密實際上是按照某個規則,加密後的密文與加密前的信息存在著一對一的關係。
由於可逆加密的這種可逆性,一旦資料庫發生泄露,密碼的暴露性實際上和明文差別不大,同樣非常危險。
建議:對方可能以為自己不坑爹,實際也還是坑的……
3.3 不可逆加密泄露
相對於可逆加密,自然就有不可逆加密。你可能經常聽說 MD5、SHA1、SHA256、SHA512、SHA-3 這些名字,實際上它們都是不可逆的哈希演算法。
顧名思義,不可逆加密處理後,你無法通過加密後的密文直接反推出原密碼,因為不存在一一對應的關係。這是如何實現的呢?比如說加密後的密文是 abcdefg,由於不對稱性,生成這串密文的原密碼可能是 123456,也可能是 woaisspai,它們經過哈希演算法處理後的結果可能都是 abcdefg,這就保證了密文的不可逆性。
然而現實總是殘酷的,即使是不可逆加密也並不是非常可靠。為什麼這麼說呢?由於任何人都可以模擬這些哈希演算法,而現實生活中,又有許多用戶的密碼位數過短,或者設置的是同樣的密碼,這就會導致一個結果:即使經過加密後,很多資料庫中存儲的加密後的密文,由於它們對應的原密碼是相同的,所以經過加密後生成的密文也是一樣的。
甚至,黑客們專門製作了彩虹表。什麼是彩虹表呢?就是預先模擬了一個資料庫,這個資料庫中窮盡了各種可能的密碼組合,實際上就是一種暴力窮舉的破解方法。黑客們可以將泄露的資料庫中的加密值與預先準備好的彩虹表進行查找配對,一旦發現同樣的密文,雖然不可逆加密的密文在理論上可能對應多個原始值,但由於有些密碼的通用性,其反推的結果中,各個可能的原始值可能性卻是不一樣的。
而且這件事情並不難,舉個例子來說,普通我們認為只要密碼位數夠長、組合夠複雜、有大小寫 + 數字 + 特殊符號總安全了吧?而事實情況是,一個由大小寫字母 + 數字 + 部分特殊符號預先設立的彩虹表,窮舉所有 14 位及以下的密碼可能加密值時,整個彩虹表的大小也不過才 64GB,在當今的計算能力看來,進行暴力破解的成功機率還是非常大的。
建議:
- 密碼位數不宜過短;
- 密碼採用數字 + 大小寫 + 特殊符號組成;
- 不要使用一些簡單的、他人也可能使用的密碼組合。
3.4 加鹽後的不可逆加密泄露
如果不可逆加密都如此不可靠,還有沒有什麼解決方案呢?當然是有的,那就是加鹽後的不可逆加密。什麼是加鹽呢?在理解這個概念前,讓我們先回過頭去看一下,為什麼說不可逆加密依然不可靠。原因主要有兩點:
- 同樣的密碼加密後生成的密文是一樣的,而一些簡單密碼的使用頻率很高;
- 由於計算能力的提升,使用暴力破解的成本越來越低,使得運用彩虹表進行暴力破解的成功概率上升。
要解決這兩個問題,實際上需要解決的核心是,讓加密後的密文與原密碼進一步隔離,這就需要加鹽了。例如最常用的組合 SHA512+SALT,這裡的 SALT 就是我們所說的鹽,當用戶註冊時,先進行一次不可逆加密後,再對生成的密文撒上一點鹽,就是隨機值,這個撒鹽的過程可以是添加前後綴,可以是改變順序,或者某種隨機的規則,並在此加了鹽的密文的基礎上,再進行一次不可逆加密,就大功告成了。
舉個例子來說,我們先把密碼 123456 不可逆加密到 abcdefg,然後對生成的密文加一些鹽,比如增加前後綴變成 xxxabcefgyyy,這時再對 xxxabcefgyyy 進行一次不可逆加密生成了二次密文 3kda3kd,這時候即使資料庫泄露,黑客也很難通過之前的彩虹表或大數定理的情況,反推出用戶的密碼了。
建議:看來真正的安全,還是要靠廠商靠譜,基本上國內外的大廠的加密都會採用類似比這種方案更加複雜一些的方案。
設置密碼時,牢記這幾點
如果你有耐心看完了上面這一節,一定已經理解了,密碼安全其實是一個「端到端」,即「客戶端 - 傳輸層 - 服務端」三位一體的問題,只要其中某一個環節有問題,哪怕另外兩個環節做得再好再安全,也是白搭。木桶理論在安全領域,實在是再適用不過了。
我們能做好的最重要的事情,其實用一句話來概括,就是永遠只在可信的設備和可信的網路環境下進行密碼操作。一旦到達伺服器端,基本事情就已經不在我們掌控的範圍內了。一家使用明文存儲密碼的公司一旦發生數據泄露,哪怕我們的密碼設計得再複雜,設備和網路安全再周密,這一切也都是白搭。
不過,即使是這樣,我們還是有一些措施,即使在伺服器端發生問題時,最小化我們的損失。
1. 密碼位數、大小寫和特殊符號
密碼越複雜,安全程度越高,這一假設的前提是你的本地設備和網路環境足夠安全,否則就像我們前面所說的,密碼再複雜,如果你本地有木馬程序監聽輸入,那麼一樣是徒勞。
在保證本機和網路環境安全的前提下,如果網站的數據發生泄露,對方在暴力破解時,密碼的複雜程度就直接對破解的效率和成本有關係,一般來說,位數越長,混雜得大小寫和特殊符號越多,暴力破解的成本就越大。所以一定杜絕使用常見的、簡單的密碼,建議大家的密碼盡量保持在 14 位以上、存在大小寫字母和數字、並混雜有特殊符號(理論上特殊符號當然是越不常見的越好,甚至有人用 emoji 作為密碼中的特殊符號)。
2. 在密碼中加入網站特徵值
如果最壞的情況發生了,密碼泄露並被破解了,怎麼才能不影響自己在其它平台的賬號安全?當然是不同平台和網站有不同的密碼是最安全的了,這樣泄露的賬號和密碼不會直接影響到其它平台。不過考慮到實際情況,我們很難在每一個不同的平台上都更換一個新的賬號和密碼,要記住不是一件容易事。這時就可以考慮一個非常簡單的策略:使用一個通用的基礎密碼,針對不同的網站,在前後或中間插入對應該網站的一個特殊值。比如我給自己設定的一個基礎密碼是 Jackson%!1128,那麼當我在不同的平台註冊時,可以加入不一樣的後綴,例如註冊百度時可以有 Jackson%!1128@baidu,註冊少數派時則是 Jackson%!1128@sspai,以此類推。
好處是什麼呢?首先顯然如果你不打算藉助一些密碼管理工具,而使用腦子來記密碼,又希望各個平台的密碼有所不同時,這是一個簡單可行的方法。其次,一旦你的密碼被泄露了,你還很快能追查出到底泄露源是哪。你可能會覺得黑客會不會很聰明,知道在不同網站去替換我的後綴呢?這其實很難,首次加入了這些網站特徵值後本身對破解造成了難度上的提升,而從另一個方面來說,黑客基本很少會關心茫茫密碼中的個人,他既沒興趣也沒精力來專門針對你進行一些特殊處理。如果還是不放心的話,可以考慮在這個策略上,再加入一些變化,比如我就不會直接使用 sspai,baidu 這樣的網站特徵值,而是使用這些網站名稱的五筆首字母,例如 baidu 就是 dy,少數派則是 ioi。
3. 直接生成隨機字元串
不知道到底設什麼樣的密碼好?其實還有一個很簡單的辦法,像 Safari、Chrome 等瀏覽器就會在頁面註冊賬號時智能地提供一個隨機字元串作為密碼選項。
好處就是,完全忘掉之前說的怎麼設置一個複雜的密碼規則,你只需要讓瀏覽器自動生成就可以了。不過缺點也很明顯,如果你在不同的平台上登錄,是 Web 環境的話需要保證全平台統一同步,而如果註冊的是某些 App 使用的賬號,那麼登錄的時候就非常不友好了。
4. 兩步驗證
最糟糕的情況就是密碼還是泄露了,這時候有沒有補救措施?當然也有,像現在大型的互聯網公司一般都提供了兩步驗證服務,如微軟、Google、蘋果、印象筆記等等。一旦開啟了兩步驗證,只要是在非授信的設置上登錄,除了常規的賬號和密碼外,網站還會要求你額外提供綁定手機的動態驗證碼,這樣就確保了即使的密碼泄露了,依然還有一道安全屏障阻礙黑客最終登錄你的賬號,保護你的數據財產安全。
關於兩步驗證的具體教程和使用方法,可以參見:
- 手把手教你設置 Google 兩步驗證
- 教程:如何開啟 Apple ID 兩步驗證,預防隱私泄露
- 關於 Apple ID 兩步驗證,你需要注意的 7 件事
- 安全門神:Authy 兩步驗證確保賬號安全
5. 定期更改密碼
這可能是聽起來最簡單的一件事情,但一定要做。前面提到了密碼泄露的各個環節,有的是你可控的,有的是你不可控的,有的甚至是你自以為可控但其實並不可控的。對於許多人來說,我們缺乏判斷本機或網路傳輸是否真的安全的能力,甚至像爆發的 XcodeGhost 事件,即使對於安全意識再高的人,也想不到會有這樣的事情發生。
正所謂防患於未然,既然我們永遠不知道水有多深,不如養成定期改密碼的好習慣。
6. 永遠假設你的密碼會泄露
不過,一個更殘酷的現實是:道高一尺,魔高一丈。網路中永遠潛伏著我們還未意識到的安全風險,隨時可能爆發的黑天鵝事件。
因此你在使用任何網路服務時一定要有一個意識,做好最壞的打算:永久假設你的密碼一定會泄露,只是時間早晚問題。那麼,這件事一旦發生後,被泄露的數據會對你造成致命的打擊嗎?會讓你的銀行卡變成人盡可取嗎?會讓你的身體變成人盡可看嗎?會讓你的陰謀變得人盡可知嗎?想想這些,你還敢把銀行卡密碼記在簡訊里嗎?還敢和冠希哥合拍小視頻嗎?還敢傳政府機密文件到網盤裡嗎?
用工具管理密碼
如果你針對不同網站設置了不同的密碼,這些密碼可能是之前提到的按一定規則組成的密碼,也可能是完全沒有任何內在邏輯、隨機生成的字元。想要記住這些密碼不是一件容易事,還好有許多第三方密碼管理工具可以幫助我們記住這些密碼,並方便地跨平台使用。
這些密碼管理軟體的思路都比較一致,你可以往其中添加記錄許許多多的密碼,在這些密碼之上,會有一個主密碼,只有掌握了這個主密碼,你就能解鎖訪問其中存儲的所有密碼。當然這也是這類軟體最為被詬病的地方之一,因為任何人只要掌握了這個主密碼,都可以訪問你的所有密碼。這就是安全領域常說的單點突破,這讓你的整個密碼管理有了最薄弱的那一個環節:主密碼。
當然,這些工具本身也提供了諸如生成隨機密碼、自動填充等實用的特性。如果你有信心,保證主密碼只有天知地知你知,這一類的軟體還是有用武之地的。我們就介紹一下最常見、最流行的幾款熱門密碼管理軟體吧。
1. KeePass:開源、免費、本地
KeePass 是一款開源的本地密碼管理軟體,採用了 AES 和 Twofish 演算法的加密,其官方版本覆蓋了主流的台式機平台,有 Windows/OS X/Linux 版本。由於其是開源軟體,也有一些人在其基礎上製作了 iOS/Android/Windows Phone 版本可以下載使用。
它最大的特點就是完全是一款本地服務,不需要聯網,不需要同步,甚至不需要安裝,KeePass 可以直接解壓使用,非常方便直接插上 U 盤在不同的電腦上使用。
如果想在移動端也使用 KeePass,可以查看少數派之前一篇文章中的介紹,有針對 iOS/Android/Windows Phone 三大移動平台做了專門的補充。
2. iCloud Keychain:蘋果生態鏈中的密碼守護者
iCloud 鑰匙串是蘋果提供的基於 iCloud 的密碼管理服務,其主密碼自然就是你的 iCloud 或系統賬號。使用 iCloud 鑰匙串服務,你可以在 iPhone、iPad 及 Mac 間無縫同步你的瀏覽器保存密碼、信用卡信息、WiFi 連接密碼、應用程序密碼等等。
你可以為 iCloud 鑰匙串設置一個獨立的安全碼,當你在其它移動設備上想要訪問所有的密碼時,除了登錄 iCloud 賬號外,還需要額外驗證安全碼,以確保密碼的安全。畢竟生活中有時候借別人的手機登一下自己的 iCloud 賬號還是很經常的事情。安全碼還會要求手機號簡訊驗證,和兩步驗證的概念很像,如果你習慣了使用整個蘋果生態鏈的產品,iCloud Keychain 可能是你最方便的選擇。
3. 1Password:密碼管理中的老牌王者
要是說起最有名的跨平台密碼管理軟體,大家最應該聽說過的就是 1Password 了。它支持所有主流的平台,包括 Windows/Mac/iOS/watchOS/Android。最關鍵的是,1Password 還是最有設計感的一款密碼管理軟體,實際上這些密碼管理軟體在實現的技術方式上差別不大,基本都是 AES 加密,但 1Password 卻是其中做得最精緻、最細節、最具有美感的一家。
在 iOS 8 之前,1Password 在 iOS 平台上還是一款收費軟體,而且由於限制,它不得不自帶集成瀏覽器,以實現填充密碼登錄。不過這一切現在都變了,1Password 不僅在 iOS 平台上免費了,而且得益於分享插件的引入,現在你可以直接在 Safari 甚至任何支持的第三方 App 中,使用 1Password 填充密碼。
1Password 不僅僅是保存密碼,除了生成隨機密碼這些常用的功能外,它還有一系列豐富的管理功能。例如可以針對不同的使用者設立不同的密碼倉庫,可以通過文件夾、標籤的形式管理密碼,還能存儲銀行賬號、護照、授權碼等一系列重要的數據資料。
想要了解更多關於 1Password 的信息,可以閱讀少數派之前的文章:
- 是時候在 iPhone 上忘掉密碼了:1Password 5.0 for iOS 上手完全指南
- 一個密碼的另一種生活:1Password 完全評測
- 1Password for iOS & Mac 大版本更新,帶來多項新特性
- 填充密碼比 iOS 版還方便:1Password for Android 新版體驗
4. LastPass:足夠好用的替代品
如果你想要 KeePass 那樣的免費,卻又希望有官方提供的原生跨平台體驗,你可以試試 LastPass。從功能上來說,其核心功能和 1Password 差別不大,除了顏值略低。LastPass 提供了 Mac/PC/Linux 的客戶端,並在所有主流瀏覽器中都有插件可以安裝,自然也支持當前最主流的移動平台。
在之前,LastPass 的瀏覽器插件及桌面端是完全免費的,但如果需要使用移動端,則要交 12 美元的年費,今年 8 月它更改了收費策略,你可以在任一平台免費使用 LastPass,但如果你需要在桌面端和移動端同步數據,或者在 iPhone 上使用 Touch ID,則需要額外交納年費。
另外需要注意的是,LastPass 曾發生過多次核心資料庫泄露事件,不過似乎並沒有造成實質性的損害,因為這些泄露的數據仍然是加密的。
- 全平台通吃:頂級密碼管理工具 LastPass 評測
- 密碼管理服務 LastPass 推出 Mac 桌面端管理應用
5. 花密:本地也可以撒點鹽
從密碼管理工具的角度上來說,花密可能是一款很另類的軟體,它不像之前介紹的 KeePass、1Password 之類的是由一個主密碼加密存儲了所有的個人密碼。相反,它和我們之前說的在伺服器端存儲密碼時的撒點鹽很類似。
前面我們也提到了利用瀏覽器或第三方的密碼管理工具,可以隨機生成一些無規律的字元串作為密碼。不過,這些密碼的缺點就在於不便於建議,如果是桌面端生成的密碼,在手機上要進行登錄操作實在是太痛苦了。花密就解決了這樣一個問題:你仍然只需要記住一個密碼,花密會自動根據網站幫你最方便記憶的密碼撒點鹽,二次生成一個隨機密碼。
這樣,方便你記憶的同時,也確保了密碼的複雜性,同時還做到了一站一密。花密的實現其實很簡單,如果有一定基礎,你完全可以自己實現一個類似的演算法工具。當然,花密也提供了網頁版、Mac、Windows、iOS、Android 及 Chrome 瀏覽器插件,方便你直接使用。
推薦閱讀: