天真和直接的方式似乎是使用Heroku的ENV变量存储私钥和密码.然而,这似乎并没有增加太多安全性,因为任何有权访问环境的人都可以轻松访问这两个值.
这样做的目的是适当地加密任何与隐私有关的信息,例如SIN号码.
场景:
假设您有一些字段,对于某些通用的监管隐私要求,需要或建议加密存储,例如政府ID(例如SIN号).使用pgcrypto加密此信息的适当或甚至常见的过程是什么.
如果某人对某个场景有其他建议,我也很乐意将其包括在内.
解决方法
>根本不存储数据.根据您的需要,您可以避免因任何原因将数据存储在您自己的服务器上.例如,您可以要求用户输入他们的信用卡号码并立即将其转发至信用卡处理器而不保存(这意味着您需要在下次再次询问他们的号码,除非信用卡处理器挂起它适用于你.)有些支付处理方案甚至会将支付数据直接发送给处理器,这样您的网站就根本不需要触摸那些数据.根据您的要求,这可能适合您的需求,也可能不适合您.
>仅将数据存储为哈希,如密码.如果您实际上不需要数据,但仅需要验证使用您站点的某人是否有数据,这将非常有用.这通常是密码和其他“秘密”的解决方案,但对其他数据无用.
>使用公共/私有加密存储数据,并且不要将私钥保留在服务器上.例如,如果服务器在其环境中具有公钥,并将数据保存到表中,则可以使用此方法,但管理员必须下载加密数据并在本地解密才能使用它.同样,这有严重的限制,因此只有在您对数据的要求兼容时才能使用它.
>使用客户端对称加密存储数据,仅使用客户端密钥加密和解密.这就是例如LastPass有效.这意味着您(服务器管理员)无法对数据执行任何操作,除非将其返回给提交数据的用户.再一次,只有在您的要求非常狭窄时,这才有效.
如果您对数据处理的要求与上述任何内容不兼容,那么您无法追索.您可以使用对称加密对数据进行加密,并将密钥保存在服务器环境中,以防止备份或访问数据库,但不是应用程序,落入坏人之手,但这与攻击者的威胁模型不匹配访问操作环境.
这里没有一个通用的“最佳实践”,因为处理攻击者可以访问环境的威胁模型所涉及的权衡是如此之大,以至于只有具有非常具体,有限要求的应用程序才能防范它.如果服务器可以读取数据,那么攻击者也可以.