身分認證防護之道
認證主要是驗證個人是否為該宣稱的身任. 驗證通常透過提供使用者帳號與其他使用者應該知道的隱私訊息組成..
會話管理主要是維持認證狀態的一種機制. 這需要後端伺服器記得整個完整交易的請求過程. Sessions就會在用戶端與伺服器端不斷的往返溝通. 因此sessions應該必須保持唯一性而且不容易被猜測.
身分認證管理是一個更大的主題, 不僅僅包含認證與會話管理,還包含服務間的相互認證identity federation, 單一帳號登入認證single sign on與密碼管理, 授權,身份儲存等.
以下是安全防護建置的建議與相關的程式碼範例.
使用多因子認證Multi-Factor Authentication
多因子認證-factor authentication (MFA)的方式可以確保使用者透過下列多重組合的方式認證:
- 使用者知道—密碼或是PIN
- 使用者擁有的 – 手機
- 使用者是誰 – 生物特徵, 例如指紋
可參考 OWASP Authentication Cheat Sheet 其他詳細說明.
手機應用程式: Token-Based Authentication
當開發手機應用程式時,建議避免儲存身分認證在用戶端或是手機裝置. 通常是在使用者輸入帳號密碼之後,服務器會產生一組短期可以使用的授權碼token,這個授權碼可以讓伺服器驗證手機端而不需要再次傳遞使用者身份.
安全的密碼儲存
為了要提供要強的認證防護,應用系統應該要用更安全的方式儲存身份資訊. 除此之外,加密金鑰或是密碼如果被駭客入侵,也應該讓駭客無法立即的存取到該資訊.
參閱 OWASP Password Storage Cheat Sheet
忘記密碼的安全防護機制
提供使用者忘記密碼是應用系統很普遍的功能. 一個好的密碼回復流程會採用多因子認證的方式進行, 例如詢問使用者問題 – 使用者知道的事, 另外透過使用者的手機發送認證碼 – 使用者所擁有的裝置
請參閱Forgot_Password_Cheat_Sheet and Choosing_and_Using_Security_Questions_Cheat_Sheet
會話:產生與過期失效
只要認證成功或是重新認證時,軟體就會產生新的session ID.
為了要避免駭客對於有效的會話session進行攔截攻擊,每一個session必須設置閒置失效時間. 當一段時間沒有任何交易進行時,該會話就會自動失效. 時間的長短應該與資料的價值成反比. 越重要的資料,失效時間應該越短. 請參閱 Session_Management_Cheat_Sheet .
對於敏感性功能應該要重新驗證
對於敏感性交易,像是更改密碼或是更改寄送購買貨品的郵件地址,都應該要有重新認證的過程,並且在認證成功的時候重新產稱新的session ID.
PHP密碼儲存範例
以下是PHP使用password_hash()密碼儲存範例(5.5.0版本)預設使用bcrypt演算法. 下列的範例使用work factor=15.
[pastacode lang=”php” message=”” highlight=”” provider=”manual”]
<?php
$cost = 15;
$password_hash = password_hash("secret_password", PASSWORD_DEFAULT, ["cost" => $cost] );
?>
[/pastacode]
結論
身分認證是安全一個重要的課題. 我們只有討論基本的防護原則, 團對開發時也建議讓最資深的工程師共同來為這部分的安全把關.
防護弱點
- OWASP Top 10 2013 A2- Broken Authentication and Session Management
- OWASP Mobile Top 10 2014-M5- Poor Authorization and Authentication