第二代密碼管理器:有主密碼保護的獨立密碼管理器
➊ TL;DR(太長了,不想讀)
第二代密碼管理器:
- 安全技術: 設定獨立的主密碼,端到端加密
- 安全問題: 一旦主密碼洩露,可能導致所有密碼被盜
硬核警告,請酌情食用。
➋ 進化
第一代有管理,無保護;要麼不加密,要麼加密沒鳥用。
對於密碼這麼重要的資料,第一代密碼管理器實在是太不安全了。
為了解決這個問題,早在2000年左右,海外的一些技術狂人和鬼才程式設計師們已經開始埋頭苦幹,奮力研究如何更好地保護大家的密碼。
也就是從那時開始,獨立的專業密碼管理器接二連三地誕生,其中包括比較知名的開源密碼管理器:Password Safe(since 2002) 和 KeePass(since 2006)
☝️ 很多人還在用的 KeePass 密碼管理器
第二代密碼管理器帶來了真正的加密保護,
- 獨立的主密碼
私密筆記也可以設定密碼,輸入密碼才能看到儲存的密碼呢!
雖然用起來差不多,但關鍵還得看是怎樣加密的。
很多私密筆記設定的密碼僅僅用於訪問控制,
根本沒有加密!
根本沒有加密!
根本沒有加密!
➌ 加密
加密為什麼這麼重要?因為良好的加密設計能夠保證,目前的計算機水平無法破解!
同時也要明白,加密≠安全
密碼管理器一般都使用對稱加密演算法(至於非對稱加密演算法,本文不展開),就是加密和解密都使用相同的金鑰 key
,
cipher = encrypt(key, plain)
plain = decrypt(key, cipher)
密碼學的設計認為,
- 加密演算法
encrypt
/decrypt
無法保密,黑客是可以知道的; - 使用金鑰
key
可以很容易從密文cipher
解密得到明文plain
(要保護的資料),沒有key
就不行; - 要求保護好金鑰
key
,要求金鑰key
完全隨機,防止黑客破解。
目前最流行的對稱加密演算法是 AES(Advanced Encryption Standard)
,根據金鑰 key
的長度分為3個級別:128/192/256 bit。其中 AES-256
作為最高階別的演算法,被廣泛應用於金融、軍事等領域,也被很多密碼管理器採用。
有些密碼管理器聲稱使用了軍事級別等加密技術,一般就是指使用了 AES-256
演算法加密。
☝️ 軍事級別加密只是營銷口號
然而並不是使用了最高等級的加密演算法,密碼管理器就達到了最高的安全水平!
黑客通常不會破解加密演算法,只會嘗試獲得金鑰 key
。
➍ 金鑰生成
既然黑客最惦記的是金鑰 key
,那怎樣保護好金鑰就是密碼管理器的關鍵技術了。
一般來說,使用者設定的主密碼是不能用作金鑰 key
加密資料的,不滿足隨機性要求。
最低等級的 AES-128
要求至少需要20個完全隨機的字元,沒人記得住!!!
於是密碼學家們發明了 基於密碼生成金鑰的演算法 PBKDF(Password-Based Key Derivation Function)
,把密碼轉換成足夠長又完全隨機的安全金鑰,就可以加密資料了。
目前推薦的演算法是 PBKDF2, brcypt
, scrypt
等其他演算法也有應用。
儘管每個演算法的具體細節不盡相同,但基本原理其實都是一樣的,如下:
key = Hash(password, salt)
這裡的 salt
非常關鍵,它是完全隨機的。所以即使是很簡單的密碼,也能通過單向的 Hash
函式計算出完全隨機的 key
作為金鑰,滿足了加密要求。
salt
應該使用真隨機數生成器(True Random Number Generator)
生成
一句話解釋:通過主密碼生成保護資料的安全金鑰 key
。
➎ 暴力破解
密碼搜尋空間肯定沒有金鑰那麼大,那黑客是不是可以暴力破解密碼呢?
當然,密碼學的演算法都是公開的,黑客也可以使用同樣的演算法,一個一個試,總能夠算出那個相同的金鑰 key
,然後解密出資料原文。
為了應對暴力破解,PBKDF
演算法並不像普通的 Hash
演算法那樣快,相反它被故意設計成很慢(或者需要消耗較多計算資源)。
PBKDF
還可以設定迭代次數 count
,開發者可以根據當前的計算機硬體水平選擇合適的迭代次數。PBKDF2
演算法推薦設定為 10000 左右。這樣黑客要暴力破解,消耗的計算資源也就增長了10000倍。
不要把迭代次數 count
設定為 1,000,000,否則使用者輸入主密碼的時候,要計算很久。
一句話解釋:生成金鑰的演算法很消耗計算資源,提高了暴力破解的難度。
➏ 核心演算法
把前面的知識串起來就是第二代密碼管理器的核心演算法設計了,
(1)設定主密碼
使用者設定主密碼後,密碼管理器通過 PBKDF2
生成了加密金鑰 key
,並且把引數 salt
和 count
儲存起來 KeyFile
。
- 金鑰
key
用於加密資料,只在程式執行中使用,並不儲存 KeyFile
用於解鎖時生成金鑰key
大聲說三遍,
不儲存主密碼!
不儲存主密碼!
不儲存主密碼!
一句話解釋:通過主密碼生成安全的加密金鑰 key
,並且儲存金鑰生成演算法的引數。
(2)加密資料
加密後,把加密的引數 IV(Initial Vector)
和密文 cipher
一起儲存下來 CipherFile
。金鑰 key
和被保護的資料明文 plain
不儲存。
一句話解釋:使用安全金鑰加密資料,儲存密文(加密後的資料)。
(3)解密資料
解密就是把前面兩個步驟反過來,
- 先從
KeyFile
中讀取PBKDF2
引數salt
和count
,經過同樣的計算得到金鑰key
- 再讀取加密引數
IV
和 密文cipher
,使用AES解密演算法得到原文plain
一句話解釋:按照同樣的方法從主密碼生成金鑰 key
,再使用解密演算法從密文解密出原文。
實際應用中,每個密碼管理器都可能做一些獨特的設計和擴充套件。
比如不直接使用密碼生成的金鑰 key
來加密儲存的資料,而是加密另一個金鑰 key2
,再用 key2
來加密真正要保護的資料。
➐ 第二代安全技術
第二代密碼管理器技術特點:
- 使用
PBKDF
演算法,從主密碼生成安全的金鑰key
- 使用高強度的加密演算法(如AES)加密資料
- 不以任何形式儲存
主密碼
AES加密演算法本身很安全,只要選取了合適的金鑰生成演算法(如 PBKDF2
) + 真正隨機的 salt
+ 合理的迭代次數 count
,第二代密碼管理器就極難被破解,除非黑客能夠破解主密碼。
相比第一代密碼管理器,第二代密碼管理器大大提升了安全水平,只要保護好 主密碼
,就能保證資料安全。
第二代密碼管理器使用主密碼加密資料,真正提升了資料的安全性,是一個巨大的進步。
今天仍然有很多人使用小本子記密碼,使用瀏覽器儲存密碼,這都是不推薦的,因為密碼並沒有得到多少保護。
儲存密碼,至少應該使用第二代密碼管理器
➑ 假二代?
並不是設定了主密碼就是第二代密碼管理器。市面上很多密碼管理器甚至聲稱 軍事級別加密
,實際上大部分仍然停留在第一代的設計水平。
我們來打假吧。
TeamSIK 在並不遙遠的2016年,找到了一些密碼管理器的安全漏洞,從披露的資訊中可以得知它們的設計水平。
我們只能判斷漏洞修復前的設計水平,開發商有可能在修復漏洞時改善設計。
SIK-2016-020 My Passwords 披露的主要資訊,
The app stores an encrypted version of the user’s master password (“master_key”) in the shared preferences file.
With these two values, it is possible to reconstruct the user’s master password and log into the app. The attacker can thus extract all of the user’s stored passwords.
點評
My Passwords
使用了一個很弱的自創加密演算法,加密並儲存主密碼,安全性遠遠不如第二代密碼管理器不儲存主密碼的設計。SIK-2016-021 Mirsoft Password Manager 披露的主要資訊,
The master password is stored in an insecure way. The password is encrypted, but the key for this encryption is part of the application code (equal on all devices).
點評
Mirsoft Password Manager
使用了寫死的金鑰,加密並儲存主密碼,違背了金鑰應該保密的原則,而且也不應該儲存主密碼(即使是加密儲存)。SIK-2016-022 LastPass Password Manager 披露的主要資訊,
The master key and the PIN are symmetrically encrypted and stored in a shared preferences file in the local app folder. The key/PIN are stored encrypted. The key for encrypting/decrypting the credentials is hard coded into the application’s source code.
點評
LastPass
是非常流行的密碼管理器,和Mirsoft Password Manager
一樣使用寫死的金鑰,加密並儲存主密碼,同樣屬於第一代設計水平。SIK-2016-026 Keeper Password Manager 披露的主要資訊,
If the user is logged out the master password has to be entered to access the passwords in the app.
By entering the password incorrectly once the adversary can select “Forgot Password” after which a verification code has to be entered.
The app then fails to show the login activity but shows an empty password list with a different background. When spawning the com.callpod.android_apps.keeper/.DeepLinkActivity it is possible to add new passwords without providing the master password. When adding new passwords a user is able to attach files to the entry. An adversary could abuse this by attaching malicious files to the password entries. A user might wonder what these files contain when using the keeper desktop application or the online service. This can trick the user to execute code on his machine.
點評
黑客沒有輸入主密碼,也能夠儲存資料到
Keeper
裡面。從這個漏洞描述來推斷,資料很可能沒有經過主密碼生成的金鑰加密,不符合第二代密碼管理器的安全特性。SIK-2016-027 F-Secure KEY Password Manager 披露的主要資訊,
The master password of this password manager is stored in plain text in the local app folder.
點評
F-Secure 是一家歷史悠久的安全公司,旗下的密碼管理器產品竟然犯下明文儲存主密碼的低階錯誤。。。
只能說,他們知道怎麼殺病毒,但完全不知道怎麼保護密碼。
SIK-2016-030 Dashlane Password Manager 披露的主要資訊,
The Dashlane password manager implements an own browser. This browser contains an implementation flaw wich allows local app folder read access without root permission. An attacker can abuse this vulnerability to read out sensitive information from the local app folder.
點評
Dashlane
也儲存了主密碼,黑客偷取主密碼就可以偷取所有密碼了。SIK-2016-032 Hide Pictures Keep Safe Vault 披露的主要資訊,
Application stores master password or pin in plain text in app folder.
For a system using „military encryption“ standards this is a serious vulnerability.
點評
又一個“明文儲存主密碼”,
軍事級別加密
那只是營銷口號,並不代表安全。
再強調一遍,以上漏洞都已經修復
小心網路密碼管理器
密碼只需要儲存一次,就可以自動同步到所有裝置終端,網路密碼管理器好方便,但也好危險
按照第二代密碼管理器的方法設計,加上網路同步功能,
- 在裝置A上建立主密碼並儲存了
salt
和count
,加密資料; - 通過網路/雲服務,將儲存的
salt
,count
和 加密後的資料同步到裝置B; - 裝置B上輸入同樣的主密碼,有
salt
,count
生成金鑰,解密,檢視儲存的資料;
這就是著名的端到端加密(End-to-end Encryption)技術。只有終端裝置上可以檢視資訊,中間的傳輸網路無法解密。
如果網路密碼管理器可以重置主密碼,那可要小心了。
是重置主密碼,不是修改主密碼
既然加密金鑰 key
只能夠通過主密碼生成,那在不提供主密碼的情況下,服務商怎麼幫你重置主密碼呢?
答案是,服務商很可能幫你保管加密金鑰。
既幫你在雲端保管加密資料,又幫你保管加密金鑰,好貼心!
你的密碼離破解連一個主密碼的距離都沒有了
這還是第一代密碼管理器的安全水平!
➒ 怎樣設定主密碼
既然安全的關鍵在於主密碼,那應該怎樣設定主密碼呢?
斯諾登建議使用密碼短語(Passphrase)
順便幫他打一波廣告,他的書《永久記錄》在中國出版了,強烈推薦!
本文建議使用一整句話作為主密碼。例如,
Isetupmymasterpasswordin2020
2020nianWuhanbaofalebingdu
沒有特殊符號安全嗎?
從資訊量的角度計算,16個大小寫字母和數字組合,和12個字母、數字、符號組合強度差不多。當然你也可以在末尾加上標點符號。
從暴力破解的角度來看,如果黑客不知道你的密碼長度,通常會按照密碼長度遞增的方式嘗試破解。越長的密碼,暴力破解浪費的計算資源也就越多,增加了破解成本。
➓ 主密碼的安全問題
要想第二代密碼管理器能夠真正保護密碼的安全,主密碼需要滿足兩個條件:
- 要足夠長,足夠強
- 不能被別人知道
遺憾的是,現實中還是會遇到很多問題,
主密碼強度不夠
很多使用者並不知道主密碼需要很高的強度,也不知道怎樣設定高強度的主密碼。
主密碼很多時候會洩露,比如在輸入主密碼時,
- 可能被不懷好意的人偷窺,
- 被電梯的攝像頭錄製下來,
- 被裝置上的惡意App錄屏,
- 女朋友問密碼,說還是不說,這是個問題
主密碼會被重用
可能是記憶密碼實在是太困難了,以至於還有不少使用者會重用主密碼。
重用主密碼其實很危險。一方面,這增加了主密碼被偷窺的機會。
另一方面,很多網際網路服務安全性並不高,一旦另一個網際網路服務洩露了密碼,那密碼管理器的主密碼也就暴露了。
如果使用網路密碼管理器,還重用主密碼,那真的是很可能:哦豁,完蛋!
講個故事吧
有個小白叫小白,很喜歡用
第一密碼
這個網路密碼管理器,她把所有銀行賬號密碼都存進去了,資料同步到雲端很方便。有個小黑叫小黑,偷偷開啟了
第一密碼
的伺服器,在裡面找到了好多寶貝,都是加密的!解密寶貝這事兒可難不倒小黑,他找來
你的空間
這個平臺洩露的密碼資料庫,發現第一密碼
和你的空間
有很多相同的使用者,其中就有小白。(這不是什麼奇怪的事情,要知道前幾年誰都有
你的空間
的賬號呀)小黑試了一下,發現小白的
你的空間
密碼也可以解鎖她在第一密碼
存的資料呢!(然後,小黑開啟銀行網站…)
密碼管理器廠商會被入侵的嗎?
是的,是的,密碼管理器廠商也會被入侵,看這個 LastPass Security Notification 還有這個 LastPass Hacked
網際網路服務真的會洩露密碼嗎?
已經有很多網際網路服務都洩露密碼了,have i been pwned 能收集到證據的記錄就已經超過地球人口總數了,~95億。
曾經著名的社交網站
My Space
一家就洩露了3.6億之多
沒能收集到證據的還有很多,全部洩露的總數不敢想象。
本作品採用《CC 協議》,轉載必須註明作者和本文連結