API密钥和秘钥是如何工作的?如果我需要将我的API密钥和秘钥传递给另一个应用程序,这是否安全?

143
我刚开始思考api密钥和秘密密钥的工作方式。就在2天前,我注册了Amazon S3并安装了S3Fox插件。他们要求我提供我的访问密钥和秘密访问密钥,这两个密钥都需要我登录才能访问。
所以我想知道,如果他们要求我提供我的秘密密钥,他们一定会在某个地方存储它,对吗?这岂不是与要求我提供信用卡号码或密码并将其存储在他们自己的数据库中基本相同?
秘密密钥和api密钥应该如何工作?它们需要多么保密?这些使用秘密密钥的应用程序是否以某种方式存储它?
3个回答

96
基本上是对这里所概述的内容进行阐述。
它的工作原理如下:假设我们有一个函数,它接受从零到九的数字,加上三,如果结果大于十,则减去十。因此f(2) = 5,f(8) = 1等。现在,我们可以制作另一个函数,称之为f',通过添加七而不是三来倒退。f'(5) = 2,f'(1) = 8等。
这是一个双向函数及其反函数的示例。理论上,任何将一件事映射到另一件事的数学函数都可以被反转。但实际上,您可以制作一个混淆其输入的功能,以使其难以反转。
采用单向函数对输入进行处理称为“哈希”输入,亚马逊在其系统中存储的是您的秘密密钥的“哈希”值。 SHA1是这种“单向”函数的示例,它也经过了攻击的强化。 HMAC函数建立在已知密钥的哈希函数基础上,用于验证文本字符串。它的工作原理如下:
  • 您需要将请求内容和密钥应用 HMAC 函数。
  • 然后,您将该验证头添加到请求中并将其发送到亚马逊。
  • 亚马逊查找他们拥有的密钥副本和您刚发送的文本,并应用 HMAC 函数。
  • 如果结果匹配,他们就知道您拥有相同的密钥。

与 PKI 不同之处在于,这种方法是 RESTful 的,允许您的系统与亚马逊服务器之间进行最少量的交换。

这不是基本上和要求我提供信用卡号或密码并将其存储在它们自己的数据库中一样吗?

是的,尽管使用 S3 可能造成的损失似乎仅限于耗尽您的账户。

它们需要多么保密?使用这些秘密密钥的应用程序是否会以某种方式将其存储?

在某些时候,您需要加载密钥,并且对于大多数基于 Unix 的系统,如果攻击者可以获得 root 访问权限,他们就可以获取密钥。如果加密密钥,则必须具有解密代码,而在某个时候,解密代码必须是明文,以便可以执行它。这与 DRM 所具有的问题相同,除了您拥有计算机。

在许多情况下,我只需将秘密密钥放入具有受限权限的文件中,并采取通常的预防措施,以防止我的系统被入侵。有一些技巧可使其在多用户系统中正常工作,例如避免使用临时文件等。


16
将输入进行单向函数处理称为“哈希”,亚马逊在其系统中存储的是您秘密密钥的“哈希”值。如果亚马逊存储了您的秘密密钥的哈希值,那么它如何对其发送的文本进行哈希处理呢? - Franklin
23
首先,您说,“亚马逊在其系统上存储的是您的秘密密钥的“哈希值””,然后稍后又说“亚马逊查找他们拥有的秘密密钥的副本”。这些似乎相互矛盾。我认为第一个陈述是错误的。 - Sean
3
这个网址提供了亚马逊S3身份验证实现的更多细节信息 - http://docs.aws.amazon.com/AmazonS3/latest/dev/S3_Authentication2.html - asyncwait
10
理论上,将一件事物映射到另一个事物的任何数学函数都可以被反转。但这并不正确,哈希函数就是一个例子。举个例子,我们有一个函数,根据字母值的总和(a=1,b=2,c=3等)将单词转换为数字。例如,“SO”将变成18 + 14 = 32。因此,我们已经将“SO”转换为32,但如果我向某人透露这个函数并给他数字32,那么他就无法知道我们的基本单词是“SO”还是“ZF”(26+6)或其他几十种可能性之一。 - Leo
1
根据@asyncwait提供的文档,亚马逊肯定会存储您的秘密密钥,而不仅仅是其哈希值。实际上,看起来唯一进行的哈希处理就是HMAC函数内部发生的处理。 - cowlinator
显示剩余4条评论

8

公钥密码学用于防御特定攻击,其中一些攻击是常见的。简而言之,这是复杂的数学方法,允许验证个人是否具有公钥和私钥对,同时只知道公钥。这与信用卡或静态密码非常不同。例如,如果您正在使用OpenSSH服务器进行身份验证,则服务器不需要私钥

理想情况下,如果Amazon的API数据库被攻击者入侵,攻击者将拥有公钥列表,并且无法使用此信息访问用户的API。但是,理想系统并不总是被实施,我不确定亚马逊是否正在防范这种攻击向量,但他们应该这样做。

在公钥认证中,对暴力破解具有统计学上的免疫性。密码通常是字典单词,可以相对较快地破解。然而,私钥是一个巨大的数字,不容易被猜测。如果攻击者拥有公钥,则可以在超级计算机上进行许多“离线”猜测,但即使如此,破解密钥也需要很多时间和金钱。

2
“_doesn't need the private key_” 的链接现在已经失效。 - setzamora
@Joset 更新了链接,指向互联网档案馆2008年的副本。 - oligofren

1
AWS 设计了自己的自定义认证算法。v4 于2014年发布。相关详情请参考:身份验证请求(AWS签名版本4)。一个重要的点是,请求并不是使用秘密本身签名,而是用秘密生成的签名密钥进行签名。此外,它还使用 HMAC-SHA256 进行签名。

Signature Generation

使用非对称密钥会更安全,因为AWS只会存储公钥,而秘钥会被用户和AWS同时存储。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接