Java HTTP基本身份验证而不是TLS客户端认证

Java HTTP基本身份验证而不是TLS客户端认证,java,web-services,security,rest,authentication,Java,Web Services,Security,Rest,Authentication,下面的答案来自于这个问题 获得的答案实际上根本没有解决这个问题。它只在数据传输的上下文中提到SSL,实际上不包括身份验证 您实际上是在询问如何安全地验证RESTAPI客户端。除非您使用的是TLS客户机身份验证,否则对于RESTAPI来说,仅SSL并不是一种可行的身份验证机制。没有客户端authc的SSL只对服务器进行身份验证,这与大多数restapi无关 如果不使用TLS客户端身份验证,则需要使用基于摘要的身份验证方案(如Amazon Web Service的自定义方案)或OAuth,甚至HTT

下面的答案来自于这个问题

获得的答案实际上根本没有解决这个问题。它只在数据传输的上下文中提到SSL,实际上不包括身份验证

您实际上是在询问如何安全地验证RESTAPI客户端。除非您使用的是TLS客户机身份验证,否则对于RESTAPI来说,仅SSL并不是一种可行的身份验证机制。没有客户端authc的SSL只对服务器进行身份验证,这与大多数restapi无关

如果不使用TLS客户端身份验证,则需要使用基于摘要的身份验证方案(如Amazon Web Service的自定义方案)或OAuth,甚至HTTP基本身份验证(但仅限于SSL)

因此,考虑到我将使用未经客户端认证的HTTPS 我这里的问题是,海报上说,如果我们不使用客户端SSL认证,服务器实际上不知道它在跟谁说话。我在这里理解的是,如果我使用身份验证令牌访问以针对服务器对客户端进行身份验证。然后,如果令牌与我的服务器数据库中的用户id配对,服务器甚至不知道是谁在发送令牌

首先

这真的是个问题吗?如果我特别使用Https?(无TLS客户端身份验证)

2-最重要的是,假设这是一个重要的安全漏洞;如海报所述,Http基本身份验证在这里有何帮助?Http基本身份验证只发送头中的编码用户名密码。因此,当客户机收到一个令牌(在他发送用户名密码后作为回报)之后,对于他的其余请求,他将在该头中使用该令牌而不是密码,并且突然间一切正常

服务器仍然不知道请求来自何处,可能服务器的数据库中有一个匹配用户的有效令牌,但不知道真正发送它的用户是谁。 (虽然我仍然很难看出令牌会通过https被盗并被其他人使用!)

每当我提出这个主题时,我都会收到回复。“好吧,你发送了一个令牌,但服务器不知道是谁发送了令牌,这不是很安全”,所以我理解这一点,因为浏览器保持某种身份验证,服务器知道请求来自正确的位置,那么我可以确保配对用户使用该令牌(从我的数据库中检查)“真的正确”吗


或者也许我在这里说的不正确

也许我误解了这个问题

您引用的答案告诉我,如果您不使用某种形式的身份验证,无论是客户端证书、HTTP BASICAUTH还是其他形式,服务器都不知道它正在与谁通信

(也许这对你的申请没问题,也许不是,只有你能回答。)

换句话说,如果您确实使用某种形式的身份验证,服务器确实知道它与谁通信;它正在与经过身份验证的凭据所属的“人员”通信

在此上下文中,身份验证是通过某些凭据建立身份的过程

身份验证不能保证凭据没有被盗。SSL保证(我不会说它“保证”)在客户端和服务器之间传输的凭证是安全的

当你使用GMail时,你使用的是SSL,谷歌怎么知道它在跟你说话?

当我们谈论“验证用户”时,我们真正的意思是“检查用户是否知道其他人不应该知道的事情”。这些“东西”可能是密码、证书、硬件安全令牌,甚至是用户的视网膜模式,但在所有情况下,我们真正检查的都是对这些信息的访问,而不是用户的身份(不管这到底意味着什么)

问题是,原则上,所有这些验证器都可能被窃取并用于模拟用户。密码可以被记录,证书可以从存储在其上的磁盘复制,硬件令牌可能被窃取(也可能被反向工程和克隆),甚至用户的视网膜模式原则上也可以被扫描、记录和伪造。在每种情况下,我们所能做的最好的事情就是尽可能地“非常困难”

海报上说,如果我们不使用客户端SSL认证,服务器就不知道它在跟谁说话

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

除非您使用的是TLS客户机身份验证,否则对于RESTAPI来说,仅SSL并不是一种可行的身份验证机制

孤独是这里的关键词。此外:

如果不使用TLS客户端身份验证,则需要使用基于摘要的身份验证方案(如Amazon Web Service的自定义方案)或OAuth,甚至HTTP基本身份验证(但仅限于SSL)

换句话说,TLS客户端身份验证是对RESTAPI客户端进行身份验证的一种方法。因为最初的SO问题是关于SSL的,所以我提到了TLS客户端authc是唯一的“内置”身份验证形式,如果您仅依赖TLS。因此,如果您使用的是TLS,而您没有利用TLS客户端authc,则必须使用另一种形式的身份验证来对您的客户端进行身份验证

有许多方法可以对REST客户端进行身份验证。TLS客户端authc只是其中之一(TLS的唯一“内置”客户端,通常非常安全)。然而,TLS是一种网络级协议,大多数人认为它过于复杂,许多最终用户无法配置。因此,大多数RESTAPI产品都选择了更易于使用的应用程序级协议,如HTTP,因为它对大多数人来说更易于使用(例如,只需设置HTTP头)

因此,如果要使用HTTP头路由,则必须使用头值对REST客户端进行身份验证

在HTTP身份验证中,您有一个头,
授权
,以及它的值(hea)
String concatenated = username + ":" + raw_password;
String schemeSpecificTextValue = base_64_encode(concatenated.toCharArray());
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==