互联网公司如何安全的存储用户信息
之前的文章提到了个人的安全注意事项,并且简单提到了互联网公司的安全注意事项。这篇文章注意谈一谈如何存储重要的明文信息。
通常情况下,密码的存储通过单向加密算法实现。比如在 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