ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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


b
ben

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

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

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

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

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

您获取您的请求文本和您的密钥并应用 HMAC 函数。

您将该身份验证标头添加到您的请求中并将其发送到 Amazon。

亚马逊查找他们的密钥副本,以及您刚刚发送的文本并应用 HMAC 函数。

如果结果匹配,他们就知道您拥有相同的密钥。

此方法与 PKI 之间的区别在于此方法为 RESTful,允许您的系统和 Amazon 的服务器之间进行最少数量的交换。

这与询问我的信用卡号或密码并将其存储在他们自己的数据库中基本相同吗?

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

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

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

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


“接受输入并应用单向函数称为“散列”输入,亚马逊在他们的系统上存储的是你的密钥的“散列”——如果亚马逊存储你的密钥的散列,它是如何亚马逊可以散列发送给他们的文本吗?
首先你说“亚马逊在他们的系统上存储的是你的密钥的“散列””,然后是“亚马逊查找他们的密钥副本”。这些似乎相互矛盾。我认为第一种说法是错误的。
此 url 提供有关 Amazon S3 身份验证实施的更多详细信息 - 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 函数内部发生的任何事情
o
oligofren

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

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

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


不需要私钥的链接现在被破坏了。
@Joset 从 2008 年更新了指向互联网回路机器中副本的链接
J
JBaczuk

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

https://i.stack.imgur.com/Zgnj7.png

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