在 Ionic4/Angular 项目中安全存储 API 密钥的位置

Ale*_*are 6 ionic-framework angular

我感觉我在这里问了错误类型的问题,因为它在 30 秒内无法通过谷歌搜索到。请告诉我。

无论如何,我已经environment.ts设置environment.prod.ts了后端和第三方服务的 url 和 api 密钥。但我读到,将 API 密钥保留在那里并不安全。我应该把它们放在哪里?如果确实在其他地方,最简单的方法是什么?

tim*_*mur 6

如果我正确理解你的问题,你会在这里看到两个潜在的关键误用点:

  1. 开发人员在开发应用程序时可能会意外使用生产密钥 - 通过将密钥存储在 CI 管道中(假设您有一个)并将正确的密钥注入到正确的环境配置中,这很容易解决。一些可能感兴趣的工具:OctopusHashicorp Vault。然后,开发人员在其代码库中将仅拥有开发密钥。请记住 - 如果您使用版本控制系统 - 仅删除生产代码并添加新提交是不够的 - 有一些工具可以让您搜索提交历史记录以查找意外暴露的秘密,因此您将拥有更改您的钥匙

  2. 用户可以对您的应用程序进行逆向工程并从代码中提取密钥。这个问题更难解决,因为它很大程度上取决于操作系统、版本以及您如何处理机密。通常,您希望完全避免在应用程序中存储机密,而是在对用户进行身份验证时获取它们。之后 - 您将利用目标操作系统的安全本地存储功能(请记住,即使这样也不能保证 100% 的保护)。对于第三方访问,请考虑通过服务器代理请求以隐藏密钥可以在此处找到更多灵感

UPD为了澄清您对用户交互的担忧,请考虑这个简化的工作流程:

1) 用户向后端端点发出未经身份验证的请求,该请求将检查用户名、密码并返回token1(最好是JWT/authorise

2)您的应用程序将此令牌1存储在设备上的本地存储中 - 这是用户有权访问的唯一秘密,并且它特定于该用户

3) 您的用户使用token1向您发出经过身份验证的请求/3rd-party-api-proxy

4)您的服务器将验证步骤3中的令牌1 ,并使用您从未公开过的令牌2向第三方发出实际请求。

5) 您的第 3 方请求成功,您将数据返回给用户。

通过此流程,您的token2永远不会被暴露,并且您始终知道哪个用户请求访问第 3 方 API(您可以添加日志记录、审核等)。互联网上有很多关于如何构建这个东西的文章,我在这里只是概述了非常基本的概念,希望这能给您一些思考。