Categories
程式開發

密碼管理器的進化史(上)


很多關於密碼管理器的評測和討論大多聚焦於功能特性,而對於最關鍵的安全性,都沒解釋清楚。本系列文章主要從密碼管理器保護密碼的安全性角度,分享一下相關的專業知識。因密碼管理器涉及很多方面的知識,本系列文章只討論數據加密保護。

密碼管理器的進化史(上) 1

密碼管理器已經進化到第四代,每一代在安全性上都有巨大提升。

一、第一代密碼管理器

  • 安全技術:有管理,無保護
  • 典型代表:小本子、記事本、瀏覽器集成的密碼管理器和一些私密雲筆記

眾所周知,互聯網服務越來越流行,需要登錄的網站不斷增多,需要記住的密碼快速增加。

但是,密碼設置要求要復雜,包含數字、字母、符號等;不能使用相同密碼。 ( 密碼重用的危害及規避方法)於是,人們開始嘗試各種管理密碼的方法,有人用小本子記、有人用記事本保存到文件。同時,雲筆記開始流行,還能寫私密筆記,只需設置一個密碼,就能隨時同步。

我們使用瀏覽器上網,需要經常輸入用戶名和密碼,瀏覽器就集成記密碼和填充密碼的功能。

密碼管理器的進化史(上) 2

第一代密碼管理器通常都沒加密,換句話說,這和你用記事本(記密碼)保存在電腦上差不多。

不過,其最大的問題在於:密碼明文集中保存。

並且,瀏覽器廠商也知道這個問題很嚴重,慢慢開始加密保存。不過,這並沒有什麼卵用。

比如,Chrome瀏覽器在Windows上使用 DPAPI 加密,用戶打開任何其他程序都可以調用 CryptUnprotectData 解密來獲得密碼。 (加密 ≠ 安全)

甚至有人寫了開源程序,能從Windows、Mac、Linux等平台上抓取Chrome瀏覽器保存的密碼。

第一代安全技術

第一代密碼管理器的安全技術特點:有管理,無保護。它根本沒有加密保護,或很容易破解的簡單加密保護。如果瀏覽器能直接讀取保存的密碼,那麼其他應用程序也可以使用相同方法讀取。

因此,如果瀏覽器能直接填充密碼,而不要求輸入獨立的主密碼解鎖,那就沒有真正的保護。

目前,瀏覽器還是黑客最主要的攻擊目標之一,因此建議,不要使用瀏覽器自帶的密碼管理器。 ( Opera服務被黑,用戶數據和存儲密碼洩露

眾所周知,用記事本記密碼很不安全,而輸入密碼才能查看的私密雲筆記,卻有很大的迷惑性,被很多用戶誤以為很安全。

一些雲筆記僅僅使用密碼限制用戶訪問,而不是使用密碼加密筆記內容。如果雲端被黑客入侵,那保存的密碼就很可能被盜。

我不會告訴你,雲筆記的開發者也可能偷看

因此,使用雲筆記保存密碼要小心,除非確信設置的密碼是用於加密內容。

第二代密碼管理器

第二代密碼管理器:

  • 安全技術: 設置獨立的主密碼,端到端加密
  • 安全問題: 一旦主密碼洩露,可能導致所有密碼被盜

對密碼這麼重要的數據,第一代密碼管理器實在不安全。為解決這個問題,2000年左右,海外一些技術狂人和鬼才程序員已開始埋頭苦幹,奮力研究如何更好保護大家的密碼。

從那時起,獨立的專業密碼管理器不斷誕生,包括較知名的開源密碼管理器:Password Safe(since 2002)KeePass(since 2006)

第二代密碼管理器帶來真正的加密保護,有著獨立的主密碼。

擴展一下:為什麼加密如此重要?

因為良好的加密設計可以確保當前的計算機水平無法破解。

密碼管理器一般都使用對稱加密算法(至於非對稱加密算法,本文不展開),就是加密和解密都使用相同的密鑰 key
$$
cipher = encrypt(key, plain)
$$

$$
plain = decrypt(key, cipher)
$$

密碼學設計認為:

  • 加密算法 encrypt/decrypt 無法保密,黑客可以知道;
  • 使用密鑰 key 可以很容易從密文 cipher 解密得到明文 plain(要保護的數據),沒有 key 就不行;
  • 要求保護好密鑰 key,要求密鑰 key 完全隨機,防止黑客破解。

目前,最流行的對稱加密算法是AES(Advanced Encryption Standard)。根據密鑰key的長度分為三個級別: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,開發者能根據當前計算機硬件水平選擇合適的迭代次數。 PBKDF算法推薦設置為10000左右。

這樣,黑客想暴力破解,消耗的計算資源也就增長10000倍。

不過,也不要將迭代次數 count 設置為 1000000,否則用戶輸入主密碼時要計算很久。

用一句話解釋:生成密鑰的算法很消耗計算資源,這提高了暴力破解的難度。

核心算法

我們將前面的知識串起來,就是第二代密碼管理器的核心算法設計。

1.設置主密碼

graph TD

MasterPassword & salt & count--> PBKDF2 -->|derive| key((key))
salt & count -->|save| KeyFile(KeyFile)

用戶設置主密碼後,密碼管理器通過 PBKDF2 生成了加密密鑰 key,並且把參數 saltcount 保存起來 KeyFile

  • 密鑰 key 用於加密數據,只在程序運行中使用,並不保存
  • KeyFile 用於解鎖時生成密鑰 key

這裡要強調,不保存主密碼!不保存主密碼!不保存主密碼!

用一句話解釋:通過主密碼生成安全的加密密鑰 key ,並且保存密鑰生成算法的參數。

2.加密數據

graph TD

key((key)) & plain & IV --> AES -->|encrypt| cipher

cipher & IV -->|save| CipherFile(CipherFile)

加密後,把加密的參數 IV(Initial Vector) 和密文 cipher 一起保存下來 CipherFile。密鑰 key 和被保護的數據明文 plain 不保存。

  • 一句話解釋:使用安全密鑰加密數據,保存密文(加密後的數據)。

3.解密數據

graph TD

MasterPassword --> PBKDF2
KeyFile(KeyFile) -->|read| salt & count --> PBKDF2
PBKDF2 -->|derive| key((key))

CipherFile(CipherFile) -->|read| cipher & IV

key & cipher & IV --> AES -->|decrypt| plain

解密即把前面兩個步驟反過來:

  • 先從 KeyFile 中讀取 PBKDF2 參數 saltcount,經過同樣的計算得到密鑰 key
  • 再讀取加密參數 IV 和 密文 cipher,使用AES解密算法得到原文 plain

用一句話解釋:按照同樣方法從主密碼生成密鑰 key ,再使用解密算法從密文解密出原文。

在實際應用中,每個密碼管理器都可能做一些獨特的設計和擴展。

比如不直接使用密碼生成的密鑰 key 來加密保存的數據,而是加密另一個密鑰 key2,再用 key2 來加密真正要保護的數據。

第二代安全技術

第二代密碼管理器技術特點:

  • 使用 PBKDF 算法,從主密碼生成安全的密鑰 key
  • 使用高強度的加密算法(如AES)加密數據
  • 不以任何形式存儲主密碼

AES加密算法本身很安全,但只要選取合適的密鑰生成算法(如 PBKDF2) + 真正隨機的 salt + 合理的迭代次數 count,第二代密碼管理器就極難被破解,除非黑客能破解主密碼。

相比第一代密碼管理器,第二代密碼管理器安全水平大大提升,只要保護好 主密碼,就能保證數據安全。並且,第二代密碼管理器使用主密碼加密數據,真正提升了數據安全性,這是一個巨大進步。

今天不推薦用小本子記密碼或用瀏覽器保存密碼,因為密碼沒得到多少保護。

保存密碼,至少使用第二代密碼管理器。

假二代密碼管理器?

有一個事實是,並非設置主密碼就是第二代密碼管理器。雖然很多市面的密碼管理器聲稱使用軍事級別加密,但大部分仍停留在第一代的設計水平。

TeamSIK在2016年找到一些密碼管理器的安全漏洞,從公開披露的信息中可以得知它們的設計水平。

注意:我們只能判斷漏洞修復前的設計水平,開發商有可能在修復漏洞時改善設計。

1.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 使用了一個很弱的自創加密算法,加密並保存主密碼,安全性遠遠不如第二代密碼管理器不保存主密碼的設計。

2.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 使用了寫死的密鑰,加密並保存主密碼,違背了密鑰應該保密的原則,而且也不應該保存主密碼(即使是加密保存)。

3.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 一樣使用寫死的密鑰,加密並保存主密碼,同樣屬於第一代設計水平。

4.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 裡面。從這個漏洞描述來推斷,數據很可能沒有經過主密碼生成的密鑰加密,不符合第二代密碼管理器的安全特性。

5.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 是一家歷史悠久的安全公司,旗下的密碼管理器產品竟然犯下明文保存主密碼的低級錯誤。只能說,他們知道怎麼殺病毒,但完全不知道怎麼保護密碼。

6.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 也保存了主密碼,黑客偷取主密碼就能竊取所有密碼。

目前,以上漏洞都已修復。

主密碼的安全問題

想要第二代密碼管理器能真正保護密碼安全,主密碼應滿足兩個條件:

  • 足夠長,足夠強
  • 不能被別人知道

遺憾的是,現實中它還是會遇到很多問題:

1.主密碼強度不夠

很多用戶並不知道主密碼需要很高強度,也不知道怎樣設置高強度的主密碼。怎樣設置主密碼

2.主密碼被洩露

例如在輸入主密碼時,可能被不懷好意的人偷窺、被電梯攝像頭錄製下來、被設備上的惡意App錄屏等等。

3.主密碼會被重用

鑑於記憶密碼太困難,以至於不少用戶會重用主密碼。重用主密碼有很大的安全風險,一方面,這增加了其被偷窺的機會;另一方面,很多互聯網服務安全性並不高,一旦某一個互聯網服務洩露密碼,那密碼管理器的主密碼就暴露了。

即使是密碼管理器廠商,也有可能被入侵,比如 LastPass Security NotificationLastPass Hacked

此外,互聯網服務也會洩露密碼。目前,已有很多互聯網服務提供商洩露密碼。have i been pwned 收集的洩露記錄已超過地球人口總數,近95億。

密碼管理器的進化史(上) 3

在下一篇文章中,我們將介紹第三代密碼管理器和第四代密碼管理器。