API密钥和密钥如何工作?

时间:2010-04-20 10:57:30

标签: security passwords amazon-s3 api-key

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

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

秘密密钥和API密钥如何工作?他们需要有多秘密?这些应用程序是否以某种方式使用密钥存储它?

感谢您的见解。

3 个答案:

答案 0 :(得分:91)

基本上详细阐述了概述here

以下是它的工作原理:假设我们有一个函数,它从0到9加一个数,加三,如果结果大于十,则减去十。所以f(2)= 5,f(8)= 1,等等。现在,我们可以通过添加7而不是3来创建另一个函数,称之为f',即向后。 f'(5)= 2,f'(1)= 8等

这是双向函数及其反函数的一个例子。从理论上讲,任何将一件事物映射到另一件事物的数学函数都可以颠倒过来。但是,在实践中,你可以创建一个能够很好地改变其输入的函数,以至于它非常难以反转。

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

HMAC function构建于已建立的哈希函数上,以使用已知密钥对文本字符串进行身份验证。它的工作原理如下:

  • 您可以获取请求和密钥的文本并应用HMAC功能。
  • 您将该身份验证标头添加到您的请求中并将其发送到亚马逊。
  • 亚马逊会查找他们的密钥副本,以及您刚发送的文本并应用HMAC功能。
  • 如果结果匹配,则表示您拥有相同的密钥。

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

  

这不是基本相同的事情   问我的信用卡号码   或密码并将其存储在其中   自己的数据库?

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

  

他们需要有多秘密?是   这些使用秘密的应用程序   键以某种方式存储它?

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

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:0)

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

Signature Generation

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