HTTP基本身份验证,而不是TLS客户端认证(HTTP Basic Authentication i

2019-07-17 14:11发布

下面的答案是来自这个问题;

获奖的答案并没有真正解决问题的根本。 只提到了数据传输的情况下SSL和实际上并不涵盖认证。

你真的问安全验证REST API客户端。 除非你使用TLS客户端认证,SSL孤独不是一个REST API一个可行的认证机制。 无客户端SSL authc只对服务器进行验证,这是无关紧要的大多数REST的API。

如果不使用TLS客户端身份验证,您需要使用像一个基于摘要验证方案(如亚马逊Web服务的定制方案)或OAuth的,甚至HTTP基本身份验证(但只能通过SSL)。

因此,考虑我将使用HTTPS没有客户端认证在这里,我的问题是海报上写着,如果我们不使用客户端SSL认证服务器并不知道它的人交谈。 如果我使用一个认证令牌来获得对服务器进行身份验证客户端我明白这里。 然后,服务器不知道是谁送的令牌即使令牌在我的服务器数据库的用户ID配对。

首先

这个1是一个真正的问题? 如果我特别是具有使用HTTPS?(不使用TLS客户端身份验证)

2-和最重要的,假设这是一个重要的安全漏洞; 这里怎么能HTTP基本身份验证的帮助,海报提及? HTTP基本身份验证只是在头发送编码的用户名密码。 因此,当客户端接收的令牌( 作为回报,他将在他的用户名密码),然后为他的请求的其余部分,他将在这头,而不是密码使用此令牌,并且一切都很好,突然?

尽管如此Server不知道从哪里请求是从哪里来的,也许服务器在其数据库匹配用户,但不知谁真正它有效的令牌。 (虽然我仍然认为这很难令牌将被偷走了HTTPS和其他人使用!)

每当我把这个题目我得到的答复。“Well..you发送一个令牌,但服务器不知道谁送的道理,不是很安全”,让我明白这是浏览器会将某种权威性认证和服务器知道请求从正确的地方来了那么我可以肯定的是与该令牌(从我的DB检查)配对的用户是“真的正确”

或者,也许我是什么告诉这里是不正确的

Answer 1:

[中],如果我们不使用客户端SSL认证服务器并不知道它的人交谈,海报上写着。

这不是我说的:)这就是我说的:

除非你使用TLS客户端认证,SSL孤独不是一个REST API一个可行的认证机制。

一个人在这里是关键字。 也:

如果不使用TLS客户端身份验证,则需要使用像一个基于摘要验证方案(如亚马逊Web服务的定制方案)或OAuth的,甚至HTTP基本身份验证(但只能通过SSL)。

换句话说,TLS客户端认证是认证REST API客户端的一种方式。 因为原来的SO问题是关于SSL具体而言,我提的是,TLS客户端authc是唯一的“内置”认证的形式,如果你仅仅依靠TLS。 因此,如果您正在使用TLS,你不利用TLS客户authc,您必须使用身份验证的另一种形式来验证客户端。

有许多方法来验证REST客户端。 TLS客户authc只是其中一个(唯一的“内置”一个TLS和平时很安全)。 然而,TLS是网络 -level协议,被大多数认为是太复杂了许多最终用户配置。 所以大多数REST API的产品选择一种更容易使用的应用程序 -level协议,如HTTP,因为它是更容易为大多数使用(例如,只需设置一个HTTP标头)。

所以,如果你要的HTTP头路线,你必须使用标头值来验证REST客户端。

在HTTP认证,您有一个标题, Authorization ,并将其值(因为它通常用于验证和不经常访问控制,又名授权的头名是相当不幸的)。 在Authorization报头值是什么是由服务器使用以执行认证,并且它的三个令牌组成(通常)

  1. 一个HTTP认证方案名,其次是
  2. 白色空间(几乎总是一个空格字符),其次是
  3. 具体的方案文本值。

一个常见的HTTP认证方案是Basic方案,这是非常......呃......基本:)。 具体的方案文本值就是下面的计算值:

String concatenated = username + ":" + raw_password;
String schemeSpecificTextValue = base_64_encode(concatenated.toCharArray());

所以,你可能会看到对应首是这样的:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

服务器知道如何解析值。 它说:“嘿,我知道了Basic方案,所以我要采取尾随文本值,BASE64 解码 ,然后我要的用户名和密码提交,然后我可以看到,如果这些值匹配我有什么存储“。

这本质上是Basic身份验证。 因为特别是在本方案中包含提交原始密码base64编码, 除非您使用TLS连接它不被视为安全的。 TLS保证(大部分)是窥探无法拦截的报头(例如,通过数据包检测),并看到密码是什么。 这就是为什么你应该使用HTTP基本身份验证,除非它是通过TLS连接。 始终 -即使是在公司内部网环境。

当然也有其他更安全的HTTP身份验证方案。 一个例子是使用基于摘要验证的任何方案。

基于摘要身份验证方案更好,因为他们的方案文本值包含提交的密码。 相反,某些数据的基于密码的散列(通常其他报头字段和值)的计算,并将结果放在Authorization报头值。 服务器计算使用它本地存储的密码相同的基于密码的哈希值。 如果服务器的计算值的请求的头值匹配,服务器可以考虑通过身份验证的要求。

这也是为什么这项技术更安全:只有一个散列发送 - 而不是原始密码本身。 这意味着该技术可用于验证甚至超过明文(非TLS)的连接请求(但你只是想这样做,如果请求的数据本身是不敏感的课程)。

一些基于摘要身份验证方案:

  • OAuth的1.0A,也就是RFC 5849 。
  • HTTP摘要访问认证(使用浏览器本身)。
  • Stormpath的自定义方案 (全面披露,我Stormpath的CTO)。
  • 亚马逊AWS的定制方案 。

Stormpath的和Amazon的是REST比OAuth的1.0A更安全,因为他们总是对请求进行认证实体的有效载荷。 OAuth的1.0A不仅会为application/x-www-form-urlencoded内容是不相关的使用REST API的application/xmlapplication/json有效载荷(这似乎是最REST API的这些天)。

有趣的是,OAuth2用户是无法消化基础-它使用的东西,我认为不太安全的,被称为“承载令牌”,这在我看来是对症的OAuth 2的各种问题 。

最后,是的,这是一个无耻的插头,但如果你不想担心这个东西,只是用Stormpath (许多用例是免费的)。 所以你的应用程序没有自动化,我们这个东西。



Answer 2:

当我们谈论“认证用户”,我们真正的意思是“检查用户知道的东西没人应该知道”。 那个“东西”可能是一个密码,证书,硬件安全令牌,甚至用户的视网膜模式,但在所有的情况下它是可以访问这些信息,我们真的检查,而不是用户的身份(无论是真的装置)本身。

问题的关键是,在原则上, 所有这些鉴别器可能被窃取,并用来模拟用户。 密码可以被记入日志,证书可以从它的存储在磁盘复制,硬件令牌可能被窃取(以及可能的反向工程和克隆),甚至在用户的视网膜模式可以在原则上,进行扫描,记录和伪造。 我们能做的最好的是,在每种情况下,要尽量让这个“非常难”成为可能。



Answer 3:

也许我误解的问题。

您所引述的答案对我说,如果你不使用某种形式认证,无论是客户端证书,HTTP BASICAUTH,还是别的什么,服务器不知道与谁进行通信。

(也许这就是好为你的应用,也许它没有,只有你能回答这个问题。)

换句话说在其他方面,如果你使用某种形式的认证,服务器不知道与谁进行通信; 它与“人”向谁认证证书属于通信。

在这种情况下,认证是通过一些证书证明身份的过程。

认证不保证该证书还没有被偷走了。 SSL保证(我不会走那么远,说这“担保”)的证书是在客户端和服务器之间传输的安全。

当您使用Gmail时,您正在使用SSL,请问谷歌知道这是跟说话?



文章来源: HTTP Basic Authentication instead of TLS client certification