保护API:SSL和HTTP基本身份validation与签名

在为我们的Web应用程序devise一个API时,我们将使用他们的子域作为“用户名”并生成一个API密钥/共享密钥。 首先,可以使用子域名作为用户名吗? 我看不到产生另一个密钥的好处。

不同的API似乎做了以下两件事之一:

  1. 使用SSL进行HTTP基本authentication

在每个请求中,用户名被设置为子密码和API密码的密码。 由于我们使用SSL,所以这应该是安全的欺骗。

值得注意的API: Google Checkout , Freshbooks , GitHub , Zendesk

  1. 使用共享密钥创build请求的签名

通常通过对密钥/值对进行sorting并使用HMAC-SHA1和共享密钥来生成签名。 签名随后与请求一起发送,并在另一端进行validation。

值得注意的API: Google Checkout , Amazon AWS

PS:这是没有错,Google Checkout支持

编辑:只要阅读,OAuth 2正在放弃签名,赞成通过SSL发送用户名/密码。

任何人的意见,select什么:SSL与签名?

基于SSL的HTTP基本authentication对我的研究是完全安全的。

毕竟,现在使用SSL(严格TLS)意味着传输层是encryption的,我们可以安全地假设通过这个传递的任何信息是安全的,并没有被篡改。

因此传递用户名和密码而不产生签名就足够了。

伊戈尔的回答并不完全正确。 尽pipeTLS确保传输层是encryption和安全的,但它仍不如使用具有相互authentication的实例TLS那样安全,其中客户端使用数字签名forms的“强密码学”进行authentication。 有两个主要原因为什么这比基于TLS的基本身份validation更好:

  • 密码是密码,我认为我们星球上现在有70亿人使用了一个完全随机的30个字符的密码。 我们其余的人select了一个熵less得多的东西。 因此攻击者更容易暴力使用密码而不是数字签名的服务。

  • 有人可能会争辩说,对于客户端的数字签名,通常还有一个涉及访问私钥的密码。 但是这与我们使用Basic Auth的情况完全不同:首先,私钥作为资源驻留在客户机器上,所以即使恢复,也只会影响一个人而不是所有人,其次,对于典型的密钥容器格式(如PKCS#12)还有用于访问密钥的基于密码的encryption。 这些algorithm专门devise用于减慢攻击者的速度,降低每单位时间的蛮力企图率,这也是数字签名的一个优势。

毫无疑问,TLS Basic Auth的设置和使用要方便得多,但对于高安全性的环境,我总是比用户/密码解决scheme更喜欢“强大的encryption技术”,这是值得的。

只要有某种forms的秘密就可以使用子域名作为用户名。

使用共享密钥的好处是,做“请求”的“方”不需要知道秘密,只需要知道签名就可以执行请求。 例如,如果希望用户允许通过浏览器进行请求,则这是有益的。

使用S3你可以创build一个签名,将其发送到浏览器,并直接从浏览器上传到S3。

你也可以使用HTTP摘要,这两者都有好处。 您仍然可以在浏览器中轻松testingAPI,因为浏览器支持Digest和Basic,并且明文密码永远不会通过线路发送。

OpenSSL的Heartbleed问题说明了单纯依靠SSL保护API的潜在隐患。 根据API的使用情况以及SSL传输是否受到影响,可能需要采取额外的安全措施,如浮雕的答案中所述。

回答一个古老的话题,因为没有人真正触及到这个主要观点

SSL / TLS与所有PKI一样都存在根本性的缺陷,因为它们依赖的信任链已被certificate越来越容易受到MiM攻击 :

  • authentication机构已经并可以被黑客入侵。 其中一个例子就是DigiNotar案,在违规被承认所有证书被撤销之前,一个CA被泄露了几个月。 与此同时,伊朗政府为google.com,facebook.com,twitter.com等伪造了完美有效的SSL证书

  • 公司的代理过滤工具,比如Zscaler,可以对所有的stream量进行解密和重新encryption,用于未指定的“安全目的”。 在SO上看到这个问题/答案

  • 最常见的SSL实现(openSSL)的错误总是被发现(但事情会随着时间的推移而变得更好)?

因此,大玩家不喜欢只依靠SSL:

在这些情况下,HMAC令牌不会给你保密,但不会允许任何人监视你的凭据 ,如果你只是通过基本的身份validation通过它们,那么这将是微不足道的。

PKI模型的一个替代scheme是不依赖单一权限来validation证书真实性的信任网 ,而是取决于大多数已知和可信的对等方提供的意见,或者已知但不一定是可信的对等方

这个模型并不完美,因为它受到臭名昭着的51%的攻击,就像比特币区块链一样(这是分布式可信模型的一个例子)

我想指出一些在security.stackexchange.com上提到的事情,因为你说“基于SSL的HTTP基本authentication对我的研究是完全安全的”。 你可能会争辩说,下面的第3点和第4点对于REST API来说很less有效,但是这取决于它们是如何实现的。

“HTTP基本身份validation有几个问题:

  • 密码通过base64编码的线路发送(可以很容易地转换成明文)。
  • 密码重复发送,为每个请求。 (更大的攻击窗口)
  • 密码由网页浏览器caching,至less是窗口/进程的长度。 (可以被任何其他请求静静地重用到服务器,例如CSRF)。
  • 密码可以永久存储在浏览器中,如果用户
    要求。 (和以前一样,另外也可能被偷
    另一个共享机器上的用户)。

其中,使用SSL只解决了第一个。 即使如此,SSL只保护直到Web服务器 – 任何内部路由,服务器日志等,将看到明文密码。

所以,就像看待整个画面的任何事情一样重要。 HTTPS是否保护传输中的密码? – 是的。

够了吗? 通常,不。 (我想说,永远不会 – 但是这取决于你的网站是什么以及它的安全程度。)“