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


136

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

所以我想知道,如果他们要我提供我的秘密密钥,他们一定会将它存储在正确的位置吗?问我输入信用卡号或密码并将其存储在他们自己的数据库中,这基本上不是同一件事吗?

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

Answers:


90

基本上详细说明这里概述的内容。

它是这样工作的:假设我们有一个函数,该函数接受一个从零到九的数字,然后加三个,如果结果大于十,则减去十。因此,f(2)= 5,f(8)= 1,依此类推。现在,我们可以通过添加七个而不是三个来制作另一个函数,称为f'。f'(5)= 2,f'(1)= 8,依此类推。

这是双向函数及其逆函数的示例。从理论上讲,将一个事物映射到另一事物的任何数学函数都可以颠倒。但是,实际上,您可以创建一个功能来很好地加扰其输入,以至于难以逆转。

接受输入并应用单向功能称为“散列”输入,Amazon在其系统上存储的是您的密钥的“散列”。SHA1是这种“单向”功能的一个示例,它也可以抵抗攻击。

HMAC功能基础上建立的散列函数使用已知的密钥进行身份验证的文本字符串。它是这样的:

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

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

问我输入信用卡号或密码并将其存储在他们自己的数据库中,这基本上不是同一件事吗?

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

他们需要成为什么秘密?这些使用秘密密钥的应用程序是否以某种方式存储了密钥?

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

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


14
“接受输入并应用单向功能称为对输入进行“散列”,而亚马逊在其系统上存储的是您的密钥的“散列””-如果亚马逊存储了您的密钥的散列,那怎么办亚马逊有可能对发送给他们的文本进行哈希处理吗?
富兰克林

21
首先,您说“ Amazon在其系统上存储的是您的密钥的”哈希””,然后说“ Amazon查找其密钥的副本”。这些似乎相互矛盾。我相信第一句话是错误的。
肖恩

3
此URL告知Amazon S3 Auth实现的更多详细信息-docs.aws.amazon.com/AmazonS3/latest/dev/S3_Authentication2.html
asyncwait 2014年

10
“从理论上讲,将一个事物映射到另一事物的任何数学函数都可以颠倒” –事实并非如此,哈希函数就是示例。这很容易显示。可以说我们有一个基于值之和(a = 1,b = 2,c = 3等)将单词转换成数字的函数。例如,“ SO”将为18 + 14 =32。因此,我们将SO更改为32,但是如果我向某人透露此功能并给他32号,他将无法知道我们的基本词是“ SO”还是“ ZF”(26 + 6)或其他数十种可能性之一
-Leo

1
根据@asyncwait链接的文档,亚马逊肯定存储了您的秘密密钥,而不仅仅是它的哈希。实际上,似乎唯一发生的哈希是HMAC函数内部发生的任何事情
Cowlinator

7

公钥密码术用于防御非常特殊的攻击,其中某些攻击很常见。简而言之,这是一个复杂的数学运算,它使人们可以在仅知道公钥的情况下验证个人是否同时具有公钥和私钥对。这与信用卡或静态密码有很大不同。例如,如果您正在使用OpenSSH服务器进行身份验证,则该服务器不需要私钥

理想的情况是,如果要攻击的Amazon API数据库受到攻击,攻击者将拥有一个公开密钥列表,并且将无法使用此信息访问用户的API。但是,理想的系统并不一定总是付诸实践,我不确定Amazon是否在防御这种攻击媒介,但确实如此。

在公共密钥认证中,​​统计学上不受暴力侵害。密码通常是字典单词,可以快速打破相对性。但是,私钥是一个很大的数字,不容易猜测。如果攻击者拥有公钥,那么他们可以在超级计算机上“脱机”执行许多猜测,但是即使那样,破解密钥也将花费大量时间和金钱。


2
不需要私钥现在链路断开。
setzamora

@Joset更新了指向2008
互联网回溯

1

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

签名生成

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.