是否有允許臨時密碼生成的永久 2 因素身份驗證方案?
回想一下,目前形式的雙因素身份驗證 (2FA) 依賴於:
- 你知道的東西,即你的密碼
- 您擁有的東西,即您在受信任設備上的一次性密碼(OTP) 生成器
程序如下:
- 客戶端發送
username
(公開)- 客戶端發送
password
(私人)- 客戶端發送
otp = HashOTP(client_seed, time())
- 伺服器查找
salt
,salted_password_hash
和seed
forusername
- 伺服器
HashPW(password, salt)
比較salted_password_hash
- 伺服器
HashOTP(seed, time())
比較otp
- 如果所有比較成功,則客戶端通過身份驗證。
當然,這個想法是,即使所有傳輸的資訊都被攻擊者截獲,攻擊者也無法進行身份驗證,因為他沒有
client_seed
生成後續有效的otp
.到目前為止一切順利,除了攔截
password
永久減少 2FA 到 1FA。*“永久”*是因為使用者不知道他的
password
已被洩露,因此沒有理由更改它。因此,具有諷刺意味的是,不僅是
otp
“一次性密碼”,它password
本身也是如此。(!)(現在,在這一點上,我相信你們中的一些人已經準備好結束這個問題了,想,“但是 TLS 應該在傳輸過程中保護密碼,如果客戶端本身被洩露,那麼問題是無效的!”如果你在那個陣營,好吧,意識到這不是世界的運作方式。客戶端上的被動鍵盤記錄器可能會秘密記錄所有內容,但實際被盜的憑據可能會一直保持未使用狀態,直到使用者不太可能注意到時它。因此,如果可能,使任何此類鍵盤記錄器無用是有意義的。)
鑑於使用者會在
password
不知道他的 2FA 真的是 1FA 的情況下重複使用,他的設備被盜是他和他的帳戶之間的唯一障礙,他可能認為他是安全的,因為他不知道他的密碼可能已經妥協。那麼,我們如何解決這個問題呢?
最初,我認為使用者可以
password
在他信任的 OTP 生成器中輸入他的密碼並生成一個一次性 密碼,該密碼將驗證他的身份,而無需發送他的實際密碼。但現在在我看來,伺服器需要知道密碼本身才能使這種方法起作用。換句話說,它破壞了散列密碼的儲存——即,伺服器端洩漏現在會將所有使用者的 2FA 減少到 1FA,而不是客戶端洩漏。
基本上,2FA 似乎基本上是“一次性”的:任何具有隻讀訪問權限的攻擊者都會將 2FA 減少到 1FA,並且客戶端和伺服器可以無限期地保持不知情。
但我不知道是否真的是這樣。
即使在客戶端或伺服器數據洩露之後,我們能否保持2FA 的雙因素特性,而不會削弱系統的安全性?如何(或為什麼不)?
如果你使用非對稱加密,你可以讓它工作。受信任的設備儲存一個私鑰和鹽,使用者將輸入他的密碼,它將用鹽進行散列並得到加密/簽名,並將結果發送到具有公鑰和加鹽散列密碼的伺服器。主要問題是受信任的設備現在發送的東西比今天使用的常見短令牌要大得多。公鑰加密的計算成本也更高,我們知道如何使伺服器端便宜,但不是雙方。伺服器洩露不會洩露私鑰,受信任設備洩露不會洩露密碼,密碼失去不會洩露私鑰。
受 PIN 保護的智能卡可以完成這項工作。PIN 是你知道的東西,卡是你擁有的東西。
它有點貴,因為您還需要一個帶有集成密碼鍵盤的閱讀器(以阻止鍵盤記錄器),但一些銀行確實使用這種方法來驗證線上交易。
這是來自 NatWest 的範例:https ://www.youtube.com/watch?v=pSykGdRyDMM