API 密钥和秘密密钥如何工作?如果我必须将我的 API 和密钥传递给另一个应用程序,它会安全吗?

Posted

技术标签:

【中文标题】API 密钥和秘密密钥如何工作?如果我必须将我的 API 和密钥传递给另一个应用程序,它会安全吗?【英文标题】:How do API Keys and Secret Keys work? Would it be secure if I have to pass my API and secret keys to another application? 【发布时间】:2011-02-10 02:14:37 【问题描述】:

我刚刚开始思考 api 密钥和密钥是如何工作的。就在 2 天前,我注册了 Amazon S3 并安装了 S3Fox Plugin。他们要求我提供访问密钥和秘密访问密钥,这两者都需要我登录才能访问。

所以我想知道,如果他们要我提供我的密钥,他们一定是把它存储在某个地方吧?这与询问我的信用卡号或密码并将其存储在他们自己的数据库中基本上不是一回事吗?

密钥和 api 密钥应该如何工作?他们需要保密到什么程度?这些使用密钥的应用程序是否以某种方式存储它?

【问题讨论】:

【参考方案1】:

Public Key Cryptography 用于防御非常具体的攻击,其中一些是常见的。简而言之,这是一个复杂的数学运算,它允许人们在只知道公钥的情况下验证个人是否同时拥有公钥和私钥对。这与信用卡或静态密码有很大不同。例如,如果您使用 OpenSSH 服务器进行身份验证,则使用服务器 doesn't need the private key。

理想情况下,如果亚马逊的 API 数据库在哪里受到攻击,攻击者将拥有一个公钥列表,并且无法使用此信息访问用户的 API。然而,理想的系统并不总是付诸实践,我不确定亚马逊是否正在防范这种攻击媒介,但它们应该是。

在公钥身份验证中,统计上不受暴力破解的影响。密码通常是字典中的单词,可以快速破解相对论。然而,私钥是一个不容易猜到的庞大数字。如果攻击者拥有公钥,那么他们可以在超级计算机上“离线”执行许多猜测,但即便如此,破解密钥也需要大量时间和金钱。

【讨论】:

不需要私钥链接现在已损坏。 @Joset 从 2008 年起更新了指向互联网回程机器中副本的链接【参考方案2】:

基本上详细说明了here 的概述。

它是这样工作的:假设我们有一个函数,它接受一个从 0 到 9 的数字,加上 3,如果结果大于 10,则减去 10。所以 f(2) = 5, f(8) = 1 等等。现在,我们可以创建另一个函数,称为 f',它通过添加七个而不是三个来倒退。 f'(5) = 2、f'(1) = 8 等

这是一个双向函数及其逆函数的示例。从理论上讲,任何将一件事映射到另一件事的数学函数都可以反转。不过,在实践中,您可以创建一个函数,将其输入打乱得非常好,以至于难以逆转。

获取输入并应用单向函数称为“散列”输入,亚马逊在其系统上存储的是您的密钥的“散列”。 SHA1 就是这种“单向”功能的一个例子,它还可以抵御攻击。

HMAC function 建立在已建立的哈希函数的基础上,使用已知密钥对文本字符串进行身份验证。它的工作原理是这样的:

您获取请求文本和密钥并应用 HMAC 函数。 您将该身份验证标头添加到您的请求中并将其发送到 Amazon。 Amazon 会查找他们的密钥副本以及您刚刚发送的文本并应用 HMAC 函数。 如果结果匹配,他们就知道您拥有相同的密钥。

这个和 PKI 的区别在于这个方法是RESTful,允许你的系统和亚马逊服务器之间的最少交换次数。

这不是和 询问我的信用卡号码 或密码并将其存储在他们的 自己的数据库?

是的,尽管有人对 S3 造成的损害似乎仅限于耗尽您的帐户。

他们需要保密到什么程度?是 这些使用秘密的应用程序 以某种方式存储它的密钥?

在某些时候,您将不得不加载密钥,并且对于大多数基于 Unix 的系统,如果攻击者可以获得 root 访问权限,他们就可以获得密钥。如果你加密密钥,你必须有代码来解密它,并且在某些时候解密代码必须是纯文本以便它可以执行。这与 DRM 的问题相同,只是您拥有计算机。

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

【讨论】:

“接受输入并应用单向函数称为“散列”输入,亚马逊在其系统上存储的是您的密钥的“散列”” - 如果亚马逊存储一个 HASH你的密钥,亚马逊怎么可能对发送给他们的文本进行哈希处理? 首先你说“亚马逊在他们的系统上存储的是你的密钥的“散列””,然后是“亚马逊查找他们的密钥副本”。这些似乎相互矛盾。我认为第一种说法是错误的。 这个 url 讲述了 Amazon S3 Auth 实施的更多细节 - docs.aws.amazon.com/AmazonS3/latest/dev/S3_Authentication2.html “理论上,任何将一件事映射到另一件事的数学函数都可以颠倒”——这不是真的,哈希函数就是一个例子。这很容易展示。假设我们有一个函数可以根据值的总和(a=1、b=2、c=3 等)将单词转换为数字。例如“SO”将是 18 + 14 = 32。所以我们已将 SO 更改为 32,但如果我向某人透露此功能,并给他编号 32,他无法知道我们的基本词是“SO”还是“ZF”(26+6) 或其他几十种可能性之一 根据@asyncwait 链接的文档,亚马逊肯定会存储您的密钥,而不仅仅是它的哈希值。事实上,看起来唯一发生的散列是 HMAC 函数内部发生的任何事情【参考方案3】:

AWS 设计了自己的自定义身份验证算法。 v4 于 2014 年发布。此处概述了详细信息:Authenticating Requests (AWS Signature Version 4) 。重点是请求不是用秘密本身签名的,而是使用使用秘密生成的签名密钥。它还使用 HMAC-SHA256 进行签名。

使用非对称密钥会更安全,因为 AWS 只会存储公钥而不是用户和 AWS 都存储的秘密。

【讨论】:

以上是关于API 密钥和秘密密钥如何工作?如果我必须将我的 API 和密钥传递给另一个应用程序,它会安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过哈希比较限制 API 密钥的使用

什么是最安全的存储和使用API 密钥和秘密的方法?

如何使用 API 密钥和秘密保护 Spring Boot API

在数据库中存储 API 密钥和秘密

如何将秘密 API 密钥存储在应用程序的二进制文件中?

在 travis-ci 上使用秘密 api 密钥