之前的文章提到了个人的安全注意事项,并且简单提到了互联网公司的安全注意事项。这篇文章注意谈一谈如何存储重要的明文信息。

通常情况下,密码的存储通过单向加密算法实现。比如在 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

注册 DigitalOcean 1G 内存, 30GB SSD 硬盘 VPS, 获取 10 美元折扣

推荐这些相关文章

订阅这个博客:

关注我的微博:

关注我的推特: