我刚刚开始考虑 api 密钥和密钥是如何工作的。就在 2 天前,我注册了 Amazon S3 并安装了S3Fox 插件。他们要求我提供我的访问密钥和秘密访问密钥,这两者都需要我登录才能访问。
所以我想知道,如果他们要我提供我的密钥,他们一定是把它存储在某个地方吧?这与询问我的信用卡号或密码并将其存储在他们自己的数据库中基本相同吗?
密钥和 api 密钥应该如何工作?他们需要保密到什么程度?这些使用密钥的应用程序是否以某种方式存储它?
基本上详细说明了这里概述的内容。
它是这样工作的:假设我们有一个函数,它接受一个从 0 到 9 的数字,加上 3,如果结果大于 10,则减去 10。所以 f(2) = 5, f(8) = 1 等等。现在,我们可以创建另一个函数,称为 f',它通过添加七个而不是三个来倒退。f'(5) = 2,f'(1) = 8,等等。
这是一个双向函数及其逆函数的示例。从理论上讲,任何将一件事映射到另一件事的数学函数都可以反转。但是,在实践中,您可以创建一个函数来很好地对其输入进行打乱,以至于很难反转。
获取输入并应用单向函数称为“散列”输入,亚马逊在其系统上存储的是您的密钥的“散列”。SHA1 就是这种“单向”功能的一个例子,它也可以抵御攻击。
HMAC 函数建立在已建立的散列函数之上,以使用已知密钥来验证文本字符串。它是这样工作的:
这和 PKI 之间的区别在于,这种方法是RESTful的,允许您的系统和 Amazon 的服务器之间进行最少数量的交换。
这与询问我的信用卡号或密码并将其存储在他们自己的数据库中基本相同吗?
是的,尽管有人可以对 S3 造成的损害似乎仅限于耗尽您的帐户。
他们需要保密到什么程度?这些使用密钥的应用程序是否以某种方式存储它?
在某些时候,您将不得不加载密钥,并且对于大多数基于 Unix 的系统,如果攻击者可以获得 root 访问权限,他们就可以获得密钥。如果你加密密钥,你必须有代码来解密它,并且在某些时候解密代码必须是纯文本以便它可以执行。这与 DRM 的问题相同,只是您拥有计算机。
在许多情况下,我只是将密钥放在权限有限的文件中,并采取通常的预防措施来防止我的系统被 root。有一些技巧可以使它在多用户系统中正常工作,例如避免使用临时文件等。
公钥密码术用于防御非常具体的攻击,其中一些是常见的。简而言之,这是一个复杂的数学运算,它允许人们在只知道公钥的情况下验证个人是否同时拥有公钥和私钥对。这与信用卡或静态密码有很大不同。例如,如果您使用 OpenSSH 服务器进行身份验证,则该服务器不需要 private key。
理想情况下,如果亚马逊的 API 数据库在哪里受到攻击,攻击者将拥有一个公钥列表,并且无法使用此信息访问用户的 API。然而,理想的系统并不总是付诸实践,我不确定亚马逊是否正在防范这种攻击媒介,但它们应该是。
在公钥认证中,统计上不受暴力破解的影响。密码通常是字典中的单词,可以快速破解相对论。然而,私钥是一个不容易猜到的庞大数字。如果攻击者拥有公钥,那么他们可以在超级计算机上“离线”执行许多猜测,但即便如此,破解密钥也需要大量时间和金钱。
AWS 设计了自己的自定义身份验证算法。v4 于 2014 年发布。此处概述了详细信息:身份验证请求(AWS 签名版本 4)。一个要点是请求不是用秘密本身签名的,而是使用使用秘密生成的签名密钥。它还使用 HMAC-SHA256 进行签名。
使用非对称密钥会更安全,因为 AWS 只会存储公钥而不是用户和 AWS 都存储的秘密。