1

我的应用程序实现了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 的目的完全是为了防止重放攻击,这已经是 SSL 的一个特性。

存储 nonce 值会为每个用户花费金钱和浪费时间,所以我只想在它有一定价值的情况下这样做。

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

4

2 回答 2

1

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

问题是要处理随机数,您需要一个数据库来存储随机数至少与“时间戳窗口”一样长。

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

事实证明,大多数 LTI 实现都是紧急工作,因此他们对“将其置于会话”方法感到满意。构建更复杂的应用程序有很多好处——检查 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

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

我猜你会选择“TL;DR;” 版本并只保留 5 分钟的窗口 - 但如果您快速查看 Tsugi 中的 LTIX 类,您会发现除了单点登录之外,LTI 还可以做很多事情。

于 2018-02-11T22:01:33.573 回答
1

是与否,

SSL/TLS 通道本身使用 MAC 保护免受重放攻击,使用 MAC 机密和序列号计算。(MAC 机制确保了 TLS 通信的完整性)。请参阅 TLS 1.1 规范附录 F.2

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

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

于 2017-08-08T18:16:00.963 回答