1. 程式人生 > >專注.Net開發、安卓開發、智慧家居、物聯網應用及專案管理

專注.Net開發、安卓開發、智慧家居、物聯網應用及專案管理

App登入需要解決的問題有兩個:安全、體驗。它們分別對應著登入過程的使用者認證,以及使用者登入過程操作複雜度兩個問題。


一、登入過程的使用者認證,常見的手段有密碼加密傳輸、動態密碼、驗證碼等。


1、密碼加密。
目前網際網路行業的移動APP有不少在使用最簡單的做法:根據密碼生成一個雜湊值,把雜湊值傳送給伺服器。伺服器計算庫中使用者密碼的雜湊值,然後和客戶端傳來的雜湊值比較,一致的話,登入成功。
如果安全性要求更高一些的話,常見的做法就是公鑰加密。具體做法是這樣,登入前先向伺服器請求一個公鑰金鑰,用公鑰金鑰加密一串根據密碼生成的雜湊值,然後傳送給伺服器。伺服器使用私鑰金鑰解密,然後與根據資料庫中的使用者密碼計算出來的雜湊值進行比較,一致的話,登入成功。當然,還可以做的更優化一些,就是控制公鑰金鑰的有效期來增強安全性,比如公鑰10秒鐘失效、只能使用一次等。

關於公鑰加密,可以參考這篇文章:http://www.360doc.com/content/11/0406/17/4146412_107621805.shtml


2、動態密碼。
關於動態密碼,其本質就是選擇另外一種可以識別使用者身份唯一性的方式來和使用者的靜態密碼一起做使用者認證。具體常見的幾種實現手段,可以參考這篇文章:http://baike.soso.com/v5973952.htm
目前市面上適合App使用的最常見的方式是利用手機簡訊進行動態密碼認證。即使用者常規登入時,如果伺服器發現有異常,可以向用戶手機發送一條包含動態密碼的簡訊,使用者在有效期(常見的是30秒到1分鐘)內把使用者名稱、使用者密碼、動態密碼一起傳送給伺服器進行驗證。這個對使用者來說,操作門檻比較低,也很方便。



3、驗證碼。
伺服器一旦發現登入有異常,如IP變化、短時間內登入次數過多等,會向App下發一個圖片,使用者把圖片中要求輸入的資料和使用者名稱、使用者密碼一起提交給伺服器。


為了降低使用者登入過程的複雜性,通常情況下,使用者只需要輸入使用者名稱和密碼,只有伺服器發現異常情況才會啟用驗證碼、動態密碼等機制。


二、減少使用者輸入次數的自動登入。
App登入成功後,伺服器會告訴App一個session,後續交流都使用session。但通常為了安全起見session都是要設定有效期的,從1星期到20天都見過。那麼,為了不讓使用者在session失效後重新登入,減少使用者的手動輸入使用者名稱和使用者密碼的次數,引入了“自動登入”概念。

流程如下:
登入成功後,伺服器給App下發sesion的同時,還下發一個認證token,客戶端把token做為應用程式的私有資料儲存起來。以後,每當session過期後,就把token傳送給伺服器獲取新的session。整個過程都是對使用者透明的,對使用者來說,輸入一次使用者名稱和密碼後,就再也沒有登入這個事情了。
當然,這種自動登入的前提,是能保證token的安全性遠大於session。我們知道,由於手機OS的安全機制,token做為應用程式的私有資料,對其它應用是不可見的,可以保證token的安全性。我們還可以再上一個鎖,把token和使用者使用App的那個裝置做繫結。可供選擇的繫結資料有imsi,mac等。這樣的話,只要使用者手機不丟,就沒事。


沒有一種安全機制是絕對安全的,我們需要在實際應用過程中綜合運用App使用場景、具體業務型別、使用者習慣等各種方式來平衡安全性、使用者體驗還有商業應用中很重要的成本。