互聯(lián)網(wǎng)公司如何安全的存儲用戶信息
之前的文章提到了個人的安全注意事項,并且簡單提到了互聯(lián)網(wǎng)公司的安全注意事項。這篇文章注意談一談如何存儲重要的明文信息。
通常情況下,密碼的存儲通過單向加密算法實現(xiàn)。比如在 20 年前可以使用人人皆知的 MD5 算法加密,現(xiàn)在可以使用 Bcrypt 算法加密。這樣用戶登錄的時候,只需要對比明文的 HASH 是否一致即可判斷密碼的正確性。
但是,還有很多需要使用這些明文信息的場景。比如,我們經(jīng)常會遇到存儲用戶信息的情況,比如:姓名、地址、電話號碼、信用卡信息、第三方不支持 OAuth 的系統(tǒng)登錄密碼等等。
首先,不建議在自己的系統(tǒng)內(nèi)存儲不必要的用戶信息。盡量規(guī)避風(fēng)險,使用可靠的第三方服務(wù)。只要存儲了用戶信息,就有可能成為攻擊對象。
但是假如業(yè)務(wù)邏輯無法避免這些信息的存儲。本文是一個思路:使用 Mcrypt 算法進行信息的雙向加密
- 可行性
數(shù)據(jù)庫是信息泄露的主要源頭,需要避免在數(shù)據(jù)庫存儲明文敏感信息。而且,數(shù)據(jù)庫基本是一個互聯(lián)網(wǎng)公司的核心數(shù)據(jù)源,對于應(yīng)用系統(tǒng)來說,數(shù)據(jù)庫數(shù)據(jù)的內(nèi)部人員訪問權(quán)限非常難以限制。即,需要一種即使讓其他人訪問數(shù)據(jù)庫但卻不泄露用戶敏感信息的策略。 - 思路
雖然很多人喜歡 Bcrypt 超過了 Mcrypt,但是 Bcrypt 不支持雙向加密,所以這里使用 Mcrypt 。
首先,需要在一個安全的地方存儲一個加密的秘鑰。這個秘鑰除了線上的應(yīng)用程序,其他人是不可訪問的。
加密
密文 = BASE64_ENCODE(加密算法(明文 + 隨機 Salt, 秘鑰))
解密
明文 = BASE64_DECODE(加密算法(密文,秘鑰))- 隨機 Salt - 部署
關(guān)于秘鑰的存儲是整個系統(tǒng)的關(guān)鍵,否則將功虧一簣。一般情況下可以將其存儲在應(yīng)用的配置文件中,僅僅會有泄露給運維人員的風(fēng)險。 - 加密服務(wù)
可以單獨獨立部署加密用的 HTTP 或者 RPC 服務(wù),通過網(wǎng)絡(luò)服務(wù)進行加密。這樣做的好處是:可以進行訪問記錄的審計;方便進行訪問權(quán)限控制;方便進行訪問頻率控制,防止大規(guī)模泄密;可以將加密服務(wù)和普通應(yīng)用系統(tǒng)進行部署隔離;等等。 - 其他
加密服務(wù)可以統(tǒng)一管理秘鑰。將不同業(yè)務(wù)系統(tǒng)的秘鑰進行隔離。另外可以進行秘鑰的版本管理,以及秘鑰的統(tǒng)一過期和更新。貌似絕大部分互聯(lián)網(wǎng)公司都有客戶敏感信息存儲的需求,比如現(xiàn)在廣泛使用的用戶手機號碼作為驗證碼的方式。希望這篇文章對你有幫助,減少安全風(fēng)險。 - 其他幾個安全問題的考慮
之后有機會再寫文章說明:如何安全的第三方存儲敏感信息,比如 Github;Amazon S3 如何實現(xiàn)數(shù)據(jù)的簽名訪問。