2012-05-24 220 views
3

我正在爲一家公司開發移動應用程序。公司的每個人都有@ company.com電子郵件地址。該應用程序本身是保密的,所以它只會安裝在員工的設備上。此應用程序與外部服務器通信以存儲和檢索數據。保護無密碼登錄系統

理想情況下,我想完成的是讓人們通過提供他們的電子郵件地址登錄到應用程序,而無需輸入密碼。這是我目前的想法:

  1. 新用戶首次在某個設備上打開該應用程序並放入他們的電子郵件地址。電子郵件地址會連同嵌入應用程序中的靜態令牌(對於應用程序的所有實例都是相同的)一起發送到服務器。
  2. 服務器驗證令牌以及電子郵件地址爲@ company.com的事實。它使用新的令牌/密鑰進行響應,僅用於該用戶和設備,客戶端以本地純文本形式存儲該用戶和設備。該密鑰實際上是用戶的密碼。它被散列,存儲在服務器數據庫中,並被標記爲禁用。
  3. 此時有兩種可能:
    1. 服務器向該地址發送一封電子郵件,確認他們想要登錄新設備。該電子郵件包含一個鏈接,點擊該鏈接後,該鏈接將被標記爲啓用。如果有人發現嵌入到應用中的令牌,那麼需要對新的設備請求進行速率限制,以便人們不會收到垃圾郵件。
    2. 管理員專門批准新的設備請求。
  4. 每個後續客戶端對服務器的請求都必須包含密鑰。

假設所有的通信都是通過SSL,這聽起來像一個安全的策略?有沒有更安全或更簡單的方法?

此外,生成將存儲在客戶端的令牌的最佳方式是什麼?由於我希望用戶在第一次使用該應用程序時只輸入他們的電子郵件地址,我相信這個令牌永遠不會改變。這是我目前的算法(PHP)鬆散的基礎上Drupal的drupal_get_token():

// Usage: get_token($email) or get_token($client_token) 
function get_token($value = '') { 
    $salt = hash('sha256', 'Some static, predefined phrase'); 
    $hmac = base64_encode(hash_hmac('sha256', $email, $salt, TRUE)); 
    return $hmac; 
} 

正如你可以看到它並不能防止並行攻擊(例如,如果有人想出了預定義的短語和算法,他們得以進入到數據庫,他們可以生成哈希值並將它們與存儲在數據庫中的哈希值進行比較),但由於原始鍵值已經很長,我認爲這不會像正常密碼那樣有效。此外,我不確定如何創建動態鹽,如果攻擊者可以訪問數據庫,那麼攻擊者將無法訪問它們(或者,老實說,如果它在那個時候甚至是重要的,因爲訪問數據庫會暴露數據無論如何我們都試圖保密)。

回答

1

經過一番研究和更多思考,我相信這個問題的答案歸結爲本地存儲的脆弱性。由於在這種情況下假設只有公司員工將使用該應用程序是安全的,因此即使代碼中存在可能使其成爲可能的問題,其中運行的惡意代碼的風險也很小。因此,主要的風險來自其他一些應用程序利用操作系統本地存儲實施中的安全漏洞從磁盤讀取本地私鑰。由於應用程序的存在不應該被公司外部的任何人所瞭解,所以這些信息不可能直接作爲目標。所以我認爲這是該公司可以接受的過程。

在一般情況下,任何考慮實施類似模型的人都應該意識到在本地以純文本存儲密碼的風險。 (這與在用戶頭部存儲密碼相反,或者在他們機器的其他地方的密碼文件中以明文形式存儲密碼;這是更安全的您的呼叫。)