如何安全地存储客户的API密钥?

时间:2018-08-25 10:13:55

标签: php api security oauth key

我正在开发一种SAAS服务,该服务允许我的客户连接第三方电子邮件工具(例如MailChimp)。因此,我要求输入与所需服务关联的API密钥,以允许在其帐户上自动执行某些操作。

为此,我将他们的密钥API记录在他们的数据库中,并完成了连接。但是从安全的角度来看,尽管我在安全性(准备好的请求等)方面采取了所有倾向,但是如果我的数据库遭到黑客攻击,这些都是我的客户端的所有API密钥,以及它们的电子邮件地址自己的客户可以被检索,使用,转售……因为我所连接的工具本质上允许存储联系人,组织和发送电子邮件。

因此,我想知道什么是让我的客户使用自己喜欢的工具的API而不危害其自己的帐户和客户数据(电子邮件等)安全性的最佳实践。我知道,当前使用数据库中明确的数据启动Web应用程序将很危险。

我想到了几种解决方案:

  • 加密数据库中的API密钥,但是由于它不像密码,因此我看不到如何测试它们(解密)?

  • 将API密钥存储在其他地方托管的其他数据库中,但是加密问题仍然相同...不?

  • 使用OAuth流:似乎很方便,但是我想通过API连接的所有服务都没有提供此功能,我甚至不确定这是否真的适合我。

  • 我打算将我的SAAS托管在Amazon Web服务上,我看到它正在提议一项名为“ KMS”密钥管理存储的服务,但是我不知道它是否真的再次适应了我遇到的问题...

如果有人已经必须回答这个问题,或者知道如何解决这个问题,我希望对它有所启发!

注意:对不起,我的英语不好,我是法语。

1 个答案:

答案 0 :(得分:0)

您提到的所有解决方案在某种程度上都是有效的,并且最有可能组合使用。您的应用程序需要访问这些API密钥,因此黑客实际上不可能完全控制您的应用程序,而无法获得对API密钥的控制权。完全控制是关键部分-您可能很难找到他们。

加密

您需要使用诸如AES之类的方法对它们进行加密,而不是对它们进行哈希处理。因为您需要能够解密它们,并在对第三方的请求中使用它们。这将帮助您防止例如。数据库泄漏-如果有人获取了您的数据库,他们将必须破解加密才能进入数据库(只要正确实施了加密)。加密/解密密钥当然必须不在数据库中,否则整个过程毫无意义:)

分离

不同的数据库也很有意义-如果有人转储您的主数据库,他们将不会进入API密钥数据库,而必须深入到应用程序中才能访问该数据库(理想情况下,这是一个完全独立的DB服务器,只能从您的应用程序。)

解决方案的架构也很重要-您可以将一台服务器冒充为面向Internet的Web界面,并通过一些有限的(尽可能多的)API与不面向Internet的后端服务器进行通信攻击面。然后,只有后端服务器才能访问密钥数据库,并向第三方执行请求。现在,攻击者必须跳过多个服务器才能接近密钥。


结合上述内容将确保您必须获得应用程序(及其所有部分)的完全控制,才能获取密钥,加密密钥并绕过您可能设置的任何其他保护措施就位。