如何安全地儲存和驗證移動設備上使用的 4 位 PIN?
我希望能夠安全地 (1) 創建和 (2) 驗證 PIN,該 PIN 主要由使用者在移動應用程序中鍵入。沒有“典型”密碼,儘管還有第二個因素。
起點將是基於OWASP密碼標準的東西:
- 獲取 salt_1(發送到使用者設備)
- 使用 salt_1 和 bcrypt 在設備上散列 PIN
- 通過 HTTPS 發送到後端
- 獲取 salt_2
- 使用 salt_2 和 bcrypt 對接收到的雜湊進行雜湊處理
- 保存結果雜湊或與之前保存的雜湊進行比較
現在,由於 PIN 熵低(4 位),這種情況顯然具有有限的可行性和穩健性,因此密碼的典型方法至少需要一些更改。
我對額外安全措施的想法是:
- 鹽應該被視為秘密並與散列 PIN 分開安全地儲存(如本答案所示)?如果是,將其發送到使用者設備,即使是短暫的,也會大大損害這種安全性?我可以在這裡做更多的事情嗎?
- 限制 PIN 驗證的重試似乎比密碼更重要
我應該考慮對現有方法進行任何其他方法或改進嗎?
顯然,至少有 3 個觀點:後端洩漏、MITM 和設備洩漏,最後一個是我最不自信的,但如果他“選擇”損害他的設備安全性,也許我應該把這個留給使用者?
PIN 檢查必然依賴受信任的設備或隱蔽的安全性。
如果 4 位數的個人辨識碼在已知結構的設備(可能是複合設備,如伺服器和移動設備的組合)中儲存和驗證,並且攻擊者獲取/提取設備中儲存的所有數據,包括(可能加密或散列)PIN 並嘗試計數器,然後該對手能夠以最多 10000 倍嘗試錯誤 PIN 值所需的努力/精力找到 PIN。論據:對手模擬設備測試候選 PIN 的操作,當錯誤時會觸發另一個模擬。可以並行嘗試多個 PIN,因此它所花費的時間可以減少到單個 PIN 嘗試。
將 PIN 和計數器移動到受信任的設備中的所有方法:用於離線解決方案或線上伺服器的安全 IC(智能卡、訂戶身份模組、受信任的平台模組……)。在受信任設備中進行 PIN 檢查的適當邏輯是:
如果錯誤計數器低於門檻值(通常為 3)
增加非易失性儲存器中的錯誤計數器,如果成功
將建議的 PIN 與儲存的 PIN 進行比較,如果匹配
- 將錯誤計數器重置為 0
- 在某些事件之前授權訪問,例如重置或計時器經過。
歷史部分:實施者有時會犯錯。可以看到我已故的朋友和智能卡發明者羅蘭·莫雷諾(法語音頻)展示了一種設備,該設備可以找到 1990 年代初期或更早在法國使用的銀行卡的 PIN 碼。那個特別的:
為 PIN 錯誤計數器使用 PROM(實施為具有 UV 擦除保護的 UV-EPROM),並依靠單獨的 V PP電源觸點對其進行程式,從而允許對手通過提供過低的電壓來禁止寫入。
為計數器使用了一個位數組,考慮到物理上不可能擦除一個位,採用最大化 PIN 顯示數量的方案:程式位的位置告訴計數是否被重置或增加,計數器由上的模式確定未程式位右側區域左側的邊界(
*
=已程式,.
未程式,x
=任何)
xxxxxx**................
0xxxxxx**.*..............
1xxxxxx**.*.*............
2xxxxxx**.*.*.*..........
3為了選擇要程式的位,在增量之前執行了 PIN 比較。
通過側通道洩露了該比較的結果。碰巧,PIN 比較的字節特徵位於 RAM 緩衝區中,該緩衝區也用於通信,並且在未清除該字節的熱復位後可使用標準命令讀取。
有人告訴我,使用類似技術的不同型號的卡,並且不受這種精確攻擊的影響,仍然允許在計數器更新之前通過一些定時攻擊來恢復 PIN 比較的結果。
實用部分:
我可以做更多的事情嗎?
兩個主要案例(關於第二個的問題):
需要在移動設備上本地檢查 PIN:加密大多無濟於事!
將 PIN 檢查安全功能解除安裝到移動設備作業系統,這比應用程序程序員更適合使用底層硬體。如果沒有這樣的明確服務,仍然可以通過僅解鎖設備來代替 PIN 身份驗證,讓使用者來決定是否使用 PIN 或其他方式。
或在移動應用程序中通過默默無聞的方式使用安全性。
OR/AND,假設 (D)RAM 比更永久的東西更難被對手讀取,並且如果有某種形式的更安全的使用者登錄(甚至是密碼),並且使用者使在每次啟動時使用它:在磁碟上使用更安全的使用者登錄憑據加密/保護 PIN 雜湊,並在啟動時在 RAM 中對其進行解密。當使用者設備斷電到 (D)RAM 內容失去的程度時,這使 PIN 與其他登錄表單一樣安全。
PIN 只需要在線上場景中檢查:加密有幫助,但不是靈丹妙藥!
讓移動設備仔細驗證負責 PIN 檢查和計數器維護的遠端伺服器,例如通過固定的 TLS 證書,並將使用者鍵入的 PIN 通過 TLS 隧道發送到伺服器進行檢查。此外,發送用另一個專用於 PIN 的伺服器公鑰加密的消息(例如 PIN 或衍生品),以及防止重播密碼的伺服器質詢,理論上與 TLS 是多餘的,但會使攻擊複雜化。另一種選擇(幾乎沒有任何好處)是PAKE,例如SRP(標籤:pake srp),用於在伺服器上發送和儲存 PIN。
並且,如果使用者重置設備或使用其他設備在功能上可能會阻止僅使用 PIN 登錄,則在移動端使用長期機密。這可以幫助防止拒絕服務(攻擊者送出錯誤的 PIN 以阻止合法使用者登錄),並且無法從伺服器端數據中找到實際的 PIN(這在使用者重複使用相同的 PIN 時很有用多台伺服器上的 PIN 碼)。
一種可能是使用者設備提取並儲存了一個新的 ECC 私鑰和一個隨機秘密整數 $ S\in[0\ldots9999] $ 每次更改 PIN 時,都會使用公鑰和隨機辨識碼 $ \text{RIN}=(S+\text{PIN})\bmod10000 $ 儲存在伺服器端。每次登錄時,伺服器都會發送一個隨機挑戰 $ C $ , 設備詢問 PIN 並獲取 $ \text{PIN}’ $ ,設備計算 $ \text{RIN}’=(S+\text{PIN}’)\bmod10000 $ 並發送 $ \operatorname{Sign}(C\mathbin|\text{RIN}’)\mathbin|\text{RIN}’ $ 加密到伺服器(參見 2.1 了解如何)。伺服器提取簽名並 $ \text{RIN}’ $ , 僅當簽名與 $ C\mathbin|\text{RIN}’ $ , 那麼在肯定測試中如果 $ \text{RIN}’=\text{RIN} $ 決定是否應重置計數器並授予訪問權限。
注意:這提供了類似於其他答案的功能,每個使用者在伺服器端儲存 35 個字節而不是幾千字節。 3. 並採取電腦安全預防措施,以使伺服器不會洩露其儲存空間,這(結合移動端的長期秘密,如果有的話)勢必允許有能力的攻擊者不費吹灰之力地找到 PIN 碼(僅僅是滾動的能力)備份 PIN 狀態計數器不可避免地使此類攻擊成為可能)。預防措施必須包括值得信賴的伺服器管理員對管理具有強大的訪問控制、加密的離線備份(最好使用公鑰),並且可以包括在 HSM 等安全設備中或在安全設備的幫助下進行 PIN/RIN 檢查和計數器更新或安全IC。 4. 並且它只能幫助將 2.1 的 PIN 或 RIN 儲存在伺服器端(在磁碟/NVM/(D)RAM/數據庫上..),因為密碼應該是:用故意慢速記憶體-硬熵散列-拉伸雜湊,例如 Argon2,以及隨機鹽(儲存在雜湊中)和半秘密胡椒,以及充足的安全參數(迭代次數,RAM)。但同樣,這不是一個甚至可以通過的保護,因為 10000 次嘗試肯定會允許找到 PIN(誰知道雜湊、鹽和胡椒,以及移動端的長期秘密,如果有的話)。