PKCE OAuth 2.0中“ code_verifier”的意义是什么?

时间:2019-04-10 16:02:44

标签: oauth-2.0 pkce

在PKCE中,我了解到code_verifier用于生成代码质询,并且稍后此code_verifier值由授权服务器验证,以完成PKCE流程。

此code_verfier值的敏感性如何?此值是否必须保密?如果此值泄漏,对手可以执行哪些攻击?

2 个答案:

答案 0 :(得分:2)

DECLARE @res_csv VARCHAR(10000) BEGIN SELECT SomeIntField INTO #tmp FROM YourTblName WHERE 1=1 -- a hardcoded query UPDATE #tmp SET @res_csv = @res_csv + case when @res_csv is not NULL then ',' end + CONVERT(VARCHAR, SomeIntField) drop table #tmp print @res_csv END 确实是敏感的:这是客户端在对令牌端点的调用中证明其首先发起授权请求的机制。

此值应保密,也请参见下文。

泄露该信息将使攻击者可以在对授权服务器的令牌端点的调用中模拟(公共)客户端,从而获得用于真实客户端的令牌。

请注意,即使在授权请求的code_verifier中不对code_verifier使用任何(哈希)转换,而以plain的形式发送它,也仍然很难攻击者能够拦截对重定向URI的回调,因为他还必须拦截传出的请求。

但是通常,code_challenge应该用SHA256散列到code_verifier中,因此即使在拦截请求时,攻击者也无法推断出code_challenge

答案 1 :(得分:0)

来自RFC Section 1

  

OAuth 2.0 [RFC6749]公共客户端容易受到      授权码拦截攻击。

     

在此攻击中,攻击者截获授权码      从通信路径中的授权端点返回      不受传输层安全性(TLS)的保护,例如      客户端操作系统中的应用程序通信。

     

一旦攻击者获得了授权码的访问权,它就可以      用它来获取访问令牌。

     

...

     

为减轻这种攻击,此扩展程序动态地利用了      创建了称为“代码验证程序”的加密随机密钥。一种      为每个授权请求创建唯一的代码验证程序,并且      其转换后的值(称为“代码挑战”)被发送到      授权服务器获取授权码。的      然后将获得的授权码发送给令牌端点      “代码验证程序”,然后服务器将其与之前的代码进行比较      收到请求代码,以便它可以执行所有权证明      客户端的“代码验证程序”。这可以缓解      因为攻击者不会知道该一次性密钥,因为它已经发送了      通过TLS,无法被拦截。

此处的关键措辞是:“客户端拥有“代码验证者”的证明。这是缓解措施,因为攻击者不知道该一次性密钥,因为它是通过TLS发送的并且无法被截获。”

TL; DR:

代码质询+验证者对至关重要,它证明了请求身份验证令牌的客户端与最初请求授权代码的客户端相同(或受其信任)。如果代码验证程序泄漏,那么RFC中此处提到的攻击(本质上是利用串扰来模仿合法应用的恶意应用)不会得到缓解,因此PKCE(防止此类攻击)的目的受到了阻碍。