通过 ssl 完成 OAuth 请求时是否需要验证随机数?

Is verifying the nonce necessary when OAuth request is done over ssl?

我的应用程序实现了 LTI,它接收带有 OAuth HMAC-SHA1 的签名请求。它们看起来像:

oauth_version:1.0
oauth_nonce:0aaa53c5d8518ahh56203f5eac773023
oauth_timestamp:1497069755
oauth_consumer_key:foo-test
oauth_callback:about:blank
user_id:99
lti_version:LTI-1p0
lti_message_type:basic-lti-launch-request
oauth_signature_method:HMAC-SHA1
oauth_signature:qe5puCiqcU7UjIe/0NZ0oy4M/8c=

请求只能通过 SSL 发生(我们没有实施其他连接选项)。所以我试图确定验证 oauth_nonce 是否有任何目的。我相信 nonce 的目的完全是 prevent replay attacks 这已经是 SSL 的一个特性。

存储 nonce 值对每个用户来说都会花费金钱和时间,所以我只想在它有一些价值时才这样做。

当通过 SSL 发出请求时,存储随机数并拒绝任何重复请求是否有价值?

是也不是,

SSL/TLS 通道本身使用 MAC 来防止重播攻击,使用 MAC 秘密和序列号计算。 (MAC 机制是确保 TLS 通信完整性的机制)。 See TLS 1.1 specification Appendix F.2

但是,这种保护只是为了防止第三方窃听者看到该应用程序请求,从而防止他们使用自己单独的 SSL/TLS 连接重放它。

但是,SSL/TLS 本身 不一定会 阻止合法的初始用户重播请求。需要这种额外保护级别的协议和应用程序往往在应用程序级别具有基于 nonce 的机制(如 LTI OAuth 签名所做的那样)来解决此问题。

我会观察到,LTI 应用程序通过确保时间戳在 300 秒以内并且不太担心 nonce 来保护启动是很常见的。许多示例代码实现了这一点。

问题是要处理随机数,您需要一个数据库来存储随机数至少与 "timestamp window".

一样长的时间

有两种实现 LTI 提供程序的通用方法之一。首先,验证启动有效性,然后将所有数据放入会话并让用户登录。更复杂的应用程序实现收集所有启动数据,包括随机数,并将其吸收到一组表中。

事实证明,大多数 LTI 实施都是紧急工作,因此他们对 "put it in session" 方法很满意。构建更复杂的应用程序有很多好处 - 检查 nonce 只是好处之一。但这很重要。

我构建了一个框架来处理一个应用程序的繁重工作,该应用程序想要处理一组非常丰富的用例,称为 "Tsugi"。您可以在以下位置查看 Tsugi 数据模型:

https://github.com/tsugiproject/tsugi/blob/master/admin/lti/database.php

您可以在这段代码中查看 Tsugi 如何处理启动(包括随机数):

https://github.com/tsugiproject/tsugi-php/blob/master/src/Core/LTIX.php

查找名为 extractPostloadAllDataadjustData 的方法。它们非常重要 - 但在单个 JOIN 中,代码会进行秘密查找、数据吸收和随机数检查(您的原始问题)。

我猜你会选择 "TL;DR;" 版本,只停留 5 分钟 window - 但如果你快速浏览一下 LTIX class 在 Tsugi 中,您可以看到除了单点登录之外,LTI 还可以做很多事情。