为B2B产品生成测试和生产API密钥的最佳方法是什么?

时间:2019-11-18 03:20:31

标签: api security jwt key sandbox

我正在开发一种我们需要具备的产品:

  • 具有开发/生产模式的B2B仪表板
  • 可以集成到我们客户的应用程序/网站中的前端SDK
  • 供他们测试后端流程的API沙箱
  • 开发/产品环境的不同速率限制

我正在寻找有关这种用例的见解和最佳实践。在典型的B2B SaaS产品(例如对讲机,条带等)中,这是一种非常常见的模式。

我对此有两个疑问:

  • 为B2B客户提供单独的开发/产品环境吗?
  • 或者给定的API密钥对于dev / prod应该是不同的,但是应该在相同的环境中? (这是我们系统的“产品”)

1 个答案:

答案 0 :(得分:1)

enter image description here

API密钥易于使用,它们简短,静态,除非被撤销,否则不会过期。它们为多种服务提供了一种简便的通信方式。首先,我想简要概述构建安全API密钥的一些关键点。

以下是需要研究的一些重要方面。

  • API密钥生成
  • 安全存储
  • 主要将其用于身份验证和受控授权
  • 时间和速率限制它们

API密钥生成

由于API密钥本身是用来标识应用程序或用户的身份,因此它必须是唯一,随机且不可猜测的。生成的API密钥还必须使用字母数字和特殊字符。此类API密钥的示例是

  

da354cab-4bb1-4884-a8e8-641ee66b164a:zaCELgL0imfnc8mVLWwsAawjYr4RxAf50DDqtlx

尽管稍后我将在这里详细说明结构的使用,但是上面显示的API密钥由两部分组成。 密钥标识符 API密钥,以“

分隔

安全存储

最好存储API密钥的HASH值而不是对其进行加密,因为这不仅省去了管理加密基础结构的工作,而且即使有人未经授权访问您的数据库,也不会泄漏API密钥,并且一切安全。最终用户将在每个API请求中发送原始API密钥,我们可以通过对请求中的API密钥进行哈希处理并将其与数据库中存储的哈希进行比较来对其进行验证。

但是,当您将散列值存储在数据库中时,存在一些可用性问题,因为在这种情况下,您无法以任何形式向用户提供API密钥,因此很多次您会发现UI给出了您可以看到的消息密钥只有一次,因为他们没有将密钥存储在后端,而是在生成期间仅向用户展示密钥一次。在此期间,前面概述的密钥标识符可为您提供帮助,因为用户可以使用它来识别仪表板中密钥值的目的,日期和时间以及到期时间,如下所示。

API Identifier example

使用密钥进行身份验证和有限授权

虽然您可能会想授予对API密钥的广泛访问权限,但这样做是一个坏主意,因为对密钥的任何妥协都会使您的系统广泛开放滥用,因为广泛访问密钥就像是一个主密钥。键。

正确的方法是允许最终用户适当限制API密钥访问并选择API密钥可以执行的特定操作。这可以通过提供范围来实现,其中每个范围代表一个特定的权限。

例如,

  

如果您仅需要一个API密钥即可发送电子邮件,则可以生成范围为“ email.send”的API密钥

如果最终用户有多个服务器,并且每个服务器都执行特定的操作,则可以在特定范围内生成单独的API密钥。 因此,在创建API密钥时,允许用户选择该API密钥应具有的访问权限。

时间和速率限制

您设计API并由开发人员使用它们,当然您不能保证针对不良实施情况的完全安全性,但是从设计方面来说,请确保开发人员可以选择从最小到最大的有效期限。 “值”和“速率”都适用,它限制了用户可以使用特定的API密钥进行的调用次数。

此方法还有助于管理可能影响您其他客户的性能问题。拥有适当的速率限制和监视解决方案可以使API服务保持健康。

现在要回答您的其他问题,是的,作为行业最佳实践,拥有独立的开发和生产环境以及独立的开发和生产密钥很重要。

在大多数情况下,您会发现Dev密钥在团队成员之间毫不留情地共享,因此它们仅在提供有限呼叫数量的Dev环境中才有效。

从安全性方面讲,大多数企业/ IT部门不喜欢让任何人(除了选定的少数人)有权访问产品环境和生产级别的密钥。这也有助于管理各种安全合规性。