精華區beta NetSecurity 關於我們 聯絡資訊
2017.W12 - Store your password > 依然是工作上的抱怨... ## 前言 ## 依然分享一下工作上遇到的故事 這次分享如何在不得已的情況之下 儲存使用者的密碼 ... ## 內容 ## 實務上 資訊安全專家或者是相關人員 都會告誡開發者 千~~萬不要儲存明文密碼 相關的慘案可以參考 [0] 在技術上 認證一個使用者的密碼透過 Hash + Salt 來處理使用者的密碼 在伺服器端就可以不用儲存密碼 當因為不知名的資安事件 造成駭客可以任意存取伺服器上的資料時 也不至於造成使用者最敏感的密碼資料外洩 在某些不得已的情況之下 開發者需要儲存明文密碼 像是 browser[1] 就需要儲存使用者的明文密碼 下次需要的時候就可以自動填入 (auto-complete[2]) 密碼 但是這種情況下 駭客一定可以有辦法拿到儲存的密碼 因此如何有誠意的儲存密碼則是一門技巧 Level 0 最沒有誠意的方式 就是直接將密碼明文的儲存在某個檔案/設定檔中 其中這個儲存方式又顯著的標出來這個值是密碼 像是 loginPassword = XXXXXXXX 比這個方式好一點的方式 則是針對這個檔案額外賦予存取權限 只有系統管者才能夠存取 Level 1 相對有誠意的方式 則是儲存密碼的時候做一些混淆 在這種方式中會存在一種方式 (e.g. 函數 F) 密碼會透過這個函數 1-1 對應到另一個 不容易被發現是密碼 的格式 但因為還是需要逆轉成原本的密碼 如果駭客知道逆轉的方式與儲存的位址 則還是可以獲得原始的明文密碼 在實務上會使用對稱式加密[3]的方式來處理原始的密碼 在這個之外 還有降低使用者經驗/UX[4] 前提下的誠意做法 像是強迫使用者在程式執行初期 重新輸入一次密碼 在程式運作期間 利用作業系統提供的保護方式 將密碼儲存在一個程式-唯讀寫的記憶體空間 像是在 Linux 的環境中 可以透過 mprotect[5] 將資料寫入之後 沒有使用的期間中重新設定為 PROT_NONE 讓這塊記憶體空間無法被其他程式讀取 只有在需要的時候才重新設定為 PROT_READ [0]: https://www.facebook.com/PlainPass/ [1]: http://raidersec.blogspot.tw/2013/06/how-browsers-store-your-passwords-and.html [2]: https://en.wikipedia.org/wiki/Autocomplete [3]: https://zh.wikipedia.org/wiki/%E5%B0%8D%E7%A8%B1%E5%AF%86%E9%91%B0%E5%8A%A0%E5%AF%86 [4]: https://zh.wikipedia.org/zh-tw/%E4%BD%BF%E7%94%A8%E8%80%85%E7%B6%93%E9%A9%97 [5]: http://man7.org/linux/man-pages/man2/mprotect.2.html -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.193.122.171 ※ 文章網址: https://www.ptt.cc/bbs/NetSecurity/M.1490109027.A.F1E.html