使用用户存储的第三方 API 密钥的最佳实践?



我正在构建一个应用程序,要求用户存储他们的第三方API密钥和机密,以便在我的应用程序中使用第三方服务。我已经将这些密钥安全地存储到数据库中,并对秘密进行了散列处理。但我不知道如何在申请中使用第三方服务的最佳实践。无论是在应用程序的前端使用它更好,还是在后端使用它更好。

对于前端选项,我需要从前端应用程序调用数据库中的api密钥和机密。然后需要进行第三方api调用,以便从第三方提取数据和信息。但这难道不会暴露用户的api密钥吗?

或者从后端,但我需要从服务器向第三方服务进行呼叫,然后将该信息发送到前端以显示给用户。担心有多少电话和加载时间。

可能经常需要来自第三方服务的这些数据。设置一个websocket并从后端调用会更好吗?

提前感谢

首先要考虑存储API密钥的最佳实践(您已经提到将它们存储在数据库中,所以您的方式是正确的,这仍然是值得一提的):

  1. 不要直接在代码中嵌入API密钥
  2. 不要将API密钥存储在应用程序源树中的文件中,或存储在任何浏览器存储选项(sessionStorage、localStorage、cookie…)中
  3. 尝试限制API密钥只能由需要它们的IP地址、引用URL或移动应用程序使用
  4. 限制您的API密钥仅可用于某些API,或仅授予它们工作所需的权限(例如,如果您的应用程序仅要求从第三方服务读取信息,则不要生成具有写入权限的API密钥)

您可以在每个平台文档中搜索有关安全使用API密钥的最佳实践的进一步文档(以下是Google对使用Google Cloud platform API密钥的建议https://support.google.com/googleapi/answer/6310037)

现在,对于您描述的用法,我看到了几个解决方案,我将尝试揭示每种方法的优缺点:

  1. 使用后端处理对第三方服务的请求:正如您之前提到的,这种方法将使您避免将API密钥暴露给客户端应用程序,但是,如果您的应用程序没有足够的安全性,并且容易受到XSS或CSRF攻击,例如,如果您在数据库中拥有良好的API密钥,攻击者有可能通过您的应用程序访问您的目标用户可以访问的任何信息。而且您的后端仍然需要处理它通常处理的所有请求,加上从数据库获取API密钥的查询,再加上后端需要使用该API密钥向第三方服务发出的请求
  2. 在您的前端处理第三方请求:对于这种方法,您将面临XSS和CSRF攻击同样的潜在安全问题(我不是网络安全专家,但据我所知,这两种攻击被认为是最常见的类型,可以通过前端应用程序访问您的安全后端信息,任何网络安全专家如果我错了,请纠正我)。然而,如果您的前端应用程序是安全的,并且您正确地处理了API密钥,并将它们存储在内存中(例如,以redux),而不是任何浏览器存储中,那么您的前端可以处理向第三方服务的请求,您将避免后端的潜在瓶颈
  3. 使用API网关,微服务只处理对第三方服务的请求,并将API密钥存储在像Redis这样的内存数据库中:在我看来,这可能是最好的方法。您的后端不会承担任何费用过载,因此您可以避免潜在的瓶颈,您的前端不会暴露任何敏感信息,因为这些信息将由专门用于此任务的服务处理。唯一的缺点是,如果你不使用微服务架构,这可能是最难构建的方法。我使用Apollo Gateway(GraphQL)开发了一个应用程序,该应用程序处理了一个与您需要使用的用例类似的用例,您可以在Apollo文档中阅读到这一点https://www.apollographql.com/docs/federation/v1/gateway/

摘要:如果您有足够的时间,或者如果您可以在后端开发API网关而无需付出太多努力,那么在我看来,选项3可能是最适合您的。相反,如果选项3太难实现或太耗时,那么在您的情况下,我宁愿选择选项2,同时考虑到前端应用程序的最佳安全实践。

您可以在上阅读有关web应用程序安全的更多信息https://owasp.org/www-project-top-ten/特别是针对react应用程序,这篇媒体文章可能会对您有所帮助https://medium.com/strands-tech-corner/frontend-application-security-b1ea9999cd02

最新更新