如果没有身份验证API,如何安全地将用户凭据存储到第三方网站?

时间:2017-02-10 22:45:06

标签: python django postgresql security encryption

我正在开发一个依赖于来自一个或多个第三方网站的数据的网络应用程序。这些网站不提供任何类型的身份验证API,因此我使用非官方API从第三方网站检索数据。

我计划向用户询问他们在第三方网站上的凭据。我理解这要求用户信任我和我的工具,并且我打算通过尽可能安全地存储凭证来尊重这种信任,并明确分享其凭据的风险。

我知道今天有一些流行的工具可以解决这个问题。例如,Mint.com要求用户的财务帐户凭据,以便它可以定期检索交易信息。 LinkedIn要求用户的电子邮件凭据,以便它可以收集他们的联系人。

存储用户凭据的安全设计是什么?特别是,我正在编写一个Django应用程序,可能会建立在PostgreSQL后端之上,但我对其他想法持开放态度。

对于它的价值,从这些第三方站点访问的数据远不及金融帐户,电子邮件帐户或社交网络配置文件/帐户的级别。也就是说,我打算以最大的尊重对待这种访问,这就是我首先在这里寻求帮助的原因。

2 个答案:

答案 0 :(得分:1)

在存储密码/机密时,没有安全的设计。只有,你愿意承担多少安全开销权衡。以下是我认为你应该做的最低限度:

  1. 仅限HTTPS(所有密码都应在传输过程中加密)
  2. 如果可能,请在使用密码时将密码加密到内存中,除非您需要访问它们才能访问服务。
  3. 数据存储中的加密。所有密码都应在数据存储中进行高度加密。
  4. [可选,但强烈推荐]客户键控;客户应该拿钥匙来解锁他们的数据,而不是你。这意味着您与第三方服务的通信只能在客户与您的应用程序交互时进行。密钥应在一段时间后过期。这可以保护您免受恶意DBA或您的数据库泄露。
  5. 这是艰难的,审计。应记录对任何客户信息的所有访问,并且客户应该能够查看日志以验证/查看活动。有些人甚至在数据库级别启用了此日志记录,因此会记录数据库级别的所有行访问。

答案 1 :(得分:1)

除了2ps所说的:

有一个名为django-cryptographic-fields的项目,它使用Django处理在Postgres数据库中存储加密数据。

如上面链接的README中所述:

  

django-cryptographic-fields是一组字段,它们使用python加密库提供的加密来包装标准Django字段。这些字段与12因素设计更加兼容,因为它们从设置文件中获取加密密钥,而不是keyczar使用的磁盘上的文件。

     

虽然keyczar是用于加密的优秀工具,但事实却并非如此   与Python 3兼容,对于像Heroku这样的主机,它需要   你要么将你的密钥文件检查到你的git仓库中   部署,或实现手动部署后处理来编写   存储在环境变量中的密钥到keyczar可以的文件中   读取。