Web Security Security model of password managers

閒聊

這篇算是接續上次 Meetup 分享會的內容,由於有人提出 password manager 的相關疑問,覺得會不會因為使用 password manager 導致所有隱私資料被看光。與其猜測,不如來看看他們所提出的 security 方案,這篇以 1password 為例,整理其中 security white paper 所提到的保存資料方式,來檢視是不是能夠防止資料被盜取。

Master Password / Secret Key / Vault

在說明 security model 之前,要先了解幾個基本的要素:

  1. Master password (your password)
  2. Secret key (account + 26 bytes random data)
  3. Vault (sensitive data)

password_1

當我們在首次建立帳號的時候,會需要我們輸入 Master Password,而這個 master password 就是存取隱私資料的核心要素,此外,系統同時會產生另一個核心要素 Secret Key,secret key 是由 user account 結合 26 bytes 的隨機亂數,這兩個核心要素將會用來解密隱私資料。Vault 則是泛指我們所記錄的隱私資料庫,例如 account / password、credit card 等。

由於用戶會希望能在多個平台使用 password manager,例如可以手機和桌機都能夠取得個人 password 紀錄,如此一來,這些隱私資料勢必要上傳到 cloud storage 才能供多台設備讀取。不過,這些隱私資料會在經由 AES256 加密後才上傳,避免 storage 被盜時讓 hacker 看光所有資料。

隱私資料 (Vault) 是如何被加解密的?

Password manager 最重要的就是安全地處理用戶隱私資料的加解密過程,因此以下將逐步地說明大致流程。

Vault 加密

Vault 是使用對稱式加密法 AES256-GCM 進行加密,而加密所使用的 32-byte key (vault key) 是透過 software 方式去產生 (e.g. Linux /dev/urandom)。當然,vault key 既然是拿來解密 vault 的重要鑰匙,它當然也會被加密,vault key 會被非對稱式加密法的 Public Key 所加密。

當用戶在建立帳號的時候,系統會在 Client 端 (Local 端) 產生非對稱式加密所需的 Private Key & Public Key pair,而 vault key 即是使用這階段所產生的 public key 所加密。

password_1

而為了能實現跨設備使用的目的,我們必須將幾個資料上傳到 cloud ,包含:

  • encrypted vault
  • encrypted vault key
  • public key
  • encrypted private key

這邊有個比較不常見的使用方式,就是通常在使用非對稱式加密的場景下,只會傳送 public key,而 private key 是不會外流,但是由於 vault key 是使用 public key 加密,為了解密 vault key ,就必須也將 private key 上傳到 cloud 上,如此一來才能在換設備時使用 private key 解密。當然我們不能直接將 private key 上傳,而是再次使用對稱式加密 AES256-GCM 的方式將 private key 加密後上傳。

生成 Encryption Key

Private key 需要被加密才能上傳,那麼到底加密 private key 所使用的 key 從哪裡來?

這把 key 被稱作 Encryption Key,它是由一開始所提到的 Master PasswordSecret Key 所產生,而這也是 vault 加解密過程中最為重要的 key。其產生的流程為:

password_1

產生 Encryption Key 的過程涉及到兩個演算法 HKDFPBKDF2。使用 HKDF 的最主要原因是要將不定長度的 master password 和 secret key 轉換為固定長度 32-byte 的 key。而使用 PBKDF2 是由於 PBKDF2 算法中加入了 iteration,提高 key 的複雜度,並且 input 的長度不像 Bcrypt 一樣有所限制。

此外,之所以產出的 key 要限制在 32 bytes,是因為後續加密是使用 AES256 方式。

這邊要特別注意的地方是:encryption key 只在 local 端生成,因此 private key 解密行為只能在 local 端進行,這也意味著 vault 的解密也只能在 local 端完成。這個概念十分重要,因為用戶最擔心的地方就是上傳到 cloud 的隱私資料會不會被盜取,而透過這種方式,所有隱私資料只會在 local 端被解密,透過這樣的機制來保護用戶資料。

Security model 要點

  1. 永遠只在 local 端解密
    如果用戶要使用其他裝置,就必須把加密後的隱私資料下載到新的裝置 (local 端),並且在 local 端輸入一開始建立帳號用戶指定的 Master Password 以及系統自動生成的 Secret Key,如此一來才能夠產生出同一把 Encryption Key,並且解密隱私資料。

  2. 用戶所記的 Master Password 和亂數生成的 Secret Key
    由於 Master Password 是由用戶指定,因此可能會是風險性高的常用 password,所以在 1password 中額外加入了部分亂數的 Secret Key,以提高安全。

  3. Server 端不會紀錄 Master Password 和 Secret Key
    為了確保 password manager 能夠維護用戶的隱私,在 1password 中提到,用戶的 Master Password 和 Secret Key 都不會被記錄在 server 端,這也意味著用戶必須自行保存這兩個重要的 key,如果遺失了將無法透過 server 端來取回。

結論

在這篇雖然是以 1password 為例,不過我查看其他家的 password manager 實作概念,基本上大同小異,如果 password manager 真的能夠依循上述的流程來實作,那我覺得安全性是蠻足夠的。但這還是取決於用戶到底信不信任此公司的技術能力,畢竟概念是概念,但是在實作過程中如果有差錯,還是有可能將資料暴露於危險之中。如果有疑慮的話,我是覺得可以從 Google Chrome 或是 Apple Safari 開始使用瀏覽器自建的 password manager,畢竟這兩大科技巨頭在實作這類功能,一定會有資安專家來檢視實作方式,相對上也比較安心。