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