为什么要使用API​​密钥和秘密?

时间:2012-07-19 09:38:38

标签: security api authentication

我遇到了许多API,它们为用户提供了API 密钥密钥。但我的问题是:两者之间有什么区别?

在我看来,一把钥匙就足够了。说我有一把钥匙,只有我和服务器知道它。我用这个键创建一个HMAC哈希并进行API调用。在服务器上,我们再次创建HMAC哈希并将其与发送的哈希进行比较。如果它是相同的,则呼叫被认证。

那么为什么要使用两把钥匙?

编辑或用于查找API密码的API密钥是什么?

5 个答案:

答案 0 :(得分:46)

你需要两个单独的键,一个告诉他们你是谁,另一个证明你是谁,你

“密钥”是您的用户ID,“密码”是您的密码。他们只是使用“密钥”和“秘密”术语,因为这就是他们实现它的方式。

答案 1 :(得分:36)

秘密密钥加密依赖于使用相同的密钥进行编码,然后再解码消息。因此,只有那些知道“秘密”的人才能阅读该信息。

RSA安全性基于2个匹配的密钥。每个用户都有一个公钥,每个人都可以(应该)知道它。还有一个只有用户应该知道的私钥。由公钥加密的消息只能通过私钥解密,反之亦然。

因此,如果我想向您发送只有您可以阅读的消息,我会(从网络)获取您的公钥,使用该密钥加密消息,并且您是唯一可以解密它的人。

或者,如果我想向您证明我发送了一条消息,我可以使用我的私钥加密消息,告诉您(在开放文本或其他消息中)它是如何加密的。然后你可以使用我的公钥解密消息,如果它变得可读,你知道它来自我。

这种形式的加密是计算机密集型的,所以有时候做的是用RSA技术加密一次性“密钥”,然后用密钥加密其余的消息,然后加密我的签名。第二时尚。然后,您可以撤消此过程,因此如果消息和签名是可读的,您和只有您可以阅读它并确保我发送了消息。

OR

您可以访问此链接以获取更详细的说明。

How do API Keys and Secret Keys work?

答案 2 :(得分:3)

简单回答,如果我理解正确的话......

如果您使用API​​密钥进行加密,该服务将如何知道谁与他们联系?他们将如何解密该消息?

您使用API​​密钥来说明您的身份,这是您以纯文本形式发送的内容。 您不发送给任何人的秘密密钥。您只需将其用于加密。然后发送加密的消息。您不会发送用于加密的密钥,这会破坏目的。

答案 3 :(得分:1)

有答案解释秘密和(公共)密钥是什么。它是一个公钥 - 私钥对,它们给出了令人困惑的名字。但没有人说为什么API需要这两者,而且许多API只给你一个秘密!我也从未见过任何API的文档解释为什么他们有两把钥匙,所以我能做的最好就是推测...

最好只将您的公钥放入您的请求中,并使用您的私钥在本地签署请求;不需要发送任何更多内容。但有些人只是在请求中拥有秘密。好的,任何好的API都会使用一些传输安全性,比如TLS(通常通过HTTPS)。但是你仍然以这种方式将你的私钥暴露给服务器,增加了他们以某种方式错误处理它的风险(参见:最近发现的GitHub和Twitter的密码记录错误)。从理论上讲,HTTPS同样安全,但总有一些实施漏洞。

但是很多 - 实际上看起来最多 - API让你在请求中发送两个密钥,因为这比让人们自己签名更容易;否则不能有纯粹的cURL示例!在这种情况下,将它们分开是毫无意义的。我想单独的密钥只是为了以后他们更改API以利用它们。或者有些客户端库可能以更安全的方式执行此操作。

答案 4 :(得分:1)

尽管这是Marcus Adams回答的扩展,但我在这里未提及的一件事是,如果有{{的可能性,则不应使用一条信息来识别和验证用户。 3}},它可以利用响应时间的差异来猜测字符串比较的结果。

如果您使用的系统使用“键”来查找用户或凭据,则可以通过发送数千个请求并检查数据库查找所花费的时间来逐步猜测该信息。 (或找不到)记录。如果“密钥”以明文形式存储而不是密钥的单向哈希,则尤其如此。如果需要能够再次向用户显示密钥,则希望将其密钥存储为纯文本格式或对称加密。

通过获取第二条信息或“秘密”信息,您可以首先使用“密钥”查找用户或凭据,这可能容易受到定时攻击,然后使用定时安全比较功能进行检查“秘密”的值。

这是该函数的Python实现:

timing attacks

它在hmac库(可能还有其他库)中公开:

https://github.com/python/cpython/blob/cd8295ff758891f21084a6a5ad3403d35dda38f7/Modules/_operator.c#L727


这里要注意的一件事是,我认为这种攻击不会对在查找之前经过哈希处理或加密的值起作用,因为每次输入字符串中的字符发生更改时,被比较的值都会随机更改。我对此https://docs.python.org/3/library/hmac.html#hmac.compare_digest有了很好的解释。

然后,用于存储API密钥的解决方案将是:

  1. 使用单独的密钥和机密,使用密钥来查找记录,并使用定时安全的比较来检查机密。这使您可以向用户再次显示用户的密钥和机密。
  2. 使用单独的密钥和机密,对机密使用对称的确定性加密,并对加密后的机密进行正常比较。这样一来,您便可以再次向用户显示密钥和机密,并且可以避免执行定时安全的比较。
  3. 使用单独的密钥和密钥,显示密钥,对其进行哈希处理并存储,然后对哈希密钥进行常规比较。这消除了使用双向加密的必要性,并具有在系统受到威胁时保持机密安全的附加好处。缺点是您无法再次向用户显示秘密。
  4. 使用单个密钥,向用户展示一次,对其进行哈希处理,然后对哈希或加密密钥进行常规查找。这使用一个键,但是无法再次显示给用户。如果系统受到破坏,则可以确保密钥安全。
  5. 使用单密钥,向用户展示一次,对其进行加密,然后对加密的机密进行常规查找。可以再次向用户显示,但是如果密钥被盗用,则会以使密钥易受攻击为代价。

其中,我认为3是安全性和便利性的最佳平衡。我已经看到许多网站在发布密钥时实现了这一点。

此外,我邀请任何实际的安全专家来批评这个答案。我只是想把它作为另一个讨论点。