我遇到了许多API,这些API为用户提供了API密钥和秘密。但是我的问题是:两者之间有什么区别?
在我眼中,一把钥匙就足够了。说我有一把钥匙,只有我和服务器知道。我使用此密钥创建HMAC哈希并进行API调用。在服务器上,我们再次创建HMAC哈希并将其与发送的哈希进行比较。如果相同,则对呼叫进行身份验证。
那么为什么要使用两个键呢?
编辑:还是该API密钥用于查找API机密?
Answers:
秘密密钥加密技术依赖于使用相同的密钥来编码,然后再对消息进行解码。因此,只有知道“秘密”的人才能阅读该消息。
RSA安全性基于2个匹配密钥。每个用户都有一个公共密钥,每个人都可以(应该)知道它。还有一个只有用户应该知道的私钥。用公钥加密的消息只能用私钥解密,反之亦然。
因此,如果我想向您发送一条只有您可以阅读的消息,我(从网络中)会获得您的公共密钥,使用该密钥对消息进行加密,并且您是唯一可以解密它的人。
或者,如果我想向您证明我已发送邮件,则可以使用私钥对邮件进行加密,然后(以公开文本或另一封邮件的形式)告诉您邮件是如何加密的。然后,您可以使用我的公共密钥解密该消息,如果该消息可读,那么您就知道它来自我。
这种加密形式相当耗费计算机资源,因此有时要做的是使用RSA技术加密一次性的“秘密密钥”,然后使用秘密密钥加密消息的其余部分,然后以第二种方式加密我的签名。然后,您可以逆转此过程,以便如果邮件和签名可读,则只有您自己可以阅读,并且可以确保我发送了邮件。
要么
您可以访问此链接以获取更多详细说明。
您需要两个单独的键,一个告诉他们您是谁,另一个则证明您是您所说的人。
“密钥”是您的用户ID,“秘密”是您的密码。他们只使用“密钥”和“秘密”术语,因为这就是它们的实现方式。
Bearer:
为此使用身份验证?您将在那里有一个ID和一个密码。
简单的答案,如果我理解正确的话...
如果您使用API密钥进行加密,则服务如何知道与谁联系的人?他们将如何解密该消息?
您使用API密钥来说明您的身份,这就是您以纯文本格式发送的内容。您不会发送给任何人的SECRET密钥。您只需将其用于加密即可。然后,您发送加密的消息。您不会发送用于加密的密钥,否则会达到目的。
secret
纯文本。你能给我一个链接吗?我看到的是secret
用来加密一些数据的。连同加密的数据一起发送,apiKey
以便服务器知道如何解密数据。
secret
,apiKey
而实际上他们在做什么username
和password
。这是完全不同的事情……
有答案说明秘密和(公共)密钥是什么。他们给他们一个令人困惑的名字,是一个公私钥对。但是没有人说为什么这些API要求同时使用,许多API只给您一个秘密!我也从未见过任何API的文档解释为什么它们有两个键,所以我能做的最好的就是推测...
最好只在请求中放入公钥,然后用私钥在本地签署请求;不需要再发送任何内容。但是有些人只是在请求中包含秘密而逃脱了。好的,任何好的API都会使用某些传输安全性,例如TLS(通常通过HTTPS)。但是您仍然以这种方式将私钥暴露给服务器,从而增加了以某种方式误处理私钥的风险(请参阅:GitHub和Twitter最近发现的密码记录错误)。从理论上讲,HTTPS同样安全,但是始终存在实现缺陷。
但实际上,似乎很多API都可以让您在请求中发送两个密钥,因为这比让人们自己签名容易得多。否则不能有纯cURL示例!在这种情况下,将它们分开是没有意义的。我猜想单独的键只是为了防止它们以后更改API以利用它们。或有些客户端库可能更安全。
尽管这是Marcus Adams回答的扩展,但我没有看到的一件事是,如果存在定时攻击的可能性,则不应使用一条信息来识别和验证用户,这可能使用响应时间的差异来猜测字符串比较能达到的程度。
如果您使用的系统使用“密钥”来查找用户或凭据,则可以通过发送数千个请求并检查数据库查找(或不查找)所花费的时间来逐步猜测该信息查找)一条记录。如果“密钥”以明文存储而不是密钥的单向哈希,则尤其如此。如果需要能够再次向用户显示密钥,则希望将其密钥存储为纯文本格式或对称加密。
通过获取第二条信息或“秘密”信息,您可以首先使用“密钥”查找用户或凭证,这可能容易受到定时攻击,然后使用定时安全比较功能来检查“秘密”。
这是该函数的Python实现:
它在hmac
lib(可能还有其他)中公开:
https://docs.python.org/3/library/hmac.html#hmac.compare_digest
这里要注意的一件事是,我认为这种攻击不会对在查找之前经过哈希处理或加密的值起作用,因为每次输入字符串中的字符更改时,被比较的值都会随机更改。我在这里找到了很好的解释。
存储API密钥的解决方案如下:
其中,我认为3是安全性和便利性的最佳平衡。在获取密钥时,我已经在许多网站上实现了此功能。
另外,我邀请任何实际的安全专家来批评这个答案。我只是想把这个作为另一个讨论重点。