这里和其他地方似乎有些混乱,所以我添加了这个答案,希望它能为其他用户澄清情况。
可以使用两种类型的 API 机密。
此页面上的大多数答案都在讨论的用例是密钥,用于使用 HMAC 等算法对消息进行签名和验证。在这种情况下,客户端和 API 都需要密钥的实际值来创建消息的签名。然后,服务器将其生成的签名与客户端发送的签名进行比较,并能够验证消息。如上所述,如果原始密钥在服务器上不可复制,则无法正常工作。在最初与客户端共享密钥(通过加密通道)之后,密钥不再需要在客户端和服务器之间传输。
另一个常见的 API 客户端机密只是机密凭证(您可能会在典型的 OAuth2 访问令牌请求中看到)。此凭据在每个请求上传输,因此只能通过加密通道(例如 HTTPS)传输。在这种情况下,服务器只需要保留足够的信息来验证客户端提供的秘密值是否正确,因此可以并且应该对秘密进行哈希处理。在这种情况下,秘密实际上充当了密码,因此应采取相同的预防措施。
免责声明:我不是安全研究人员,在盲目遵循 StackExchange 上的任何建议之前,您绝对应该对此和任何主题进行更多研究。
tl;dr最重要的一点是不同的 API 可能以不同的方式使用秘密。为了评估存储它的最佳实践,了解您的 API 如何使用客户端密码非常重要。