2017.W12 - Store your password - 資安

Table of Contents

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

--

All Comments