我的应用程序实现了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发出请求时,存储nonce并拒绝任何重复请求是否有价值?
答案 0 :(得分:1)
是和否,
使用MAC保护SSL / TLS信道本身免受重放攻击,使用MAC密钥和序列号计算。 (MAC机制确保TLS通信完整性)。 See TLS 1.1 specification Appendix F.2
但是,这种保护只是针对第三方窃听者看到该应用程序请求,从而通过自己单独的SSL / TLS连接重播它。
但是,SSL / TLS本身不必然会阻止合法的初始用户重播请求。需要此额外保护级别的协议和应用程序往往在应用程序级别具有 nonce 为基础的机制(如LTI OAuth签名所做的那样)以解决此问题。
答案 1 :(得分:1)
我将观察到,LTI应用程序通过确保时间戳在300秒内并且不必过多担心nonce来保护启动是很常见的。很多示例代码都实现了这一点。
问题是要处理nonce,你需要一个数据库来存储nonce,至少和" timestamp window一样长。"。
实施LTI提供商有两种通用方法之一。第一个,验证启动有效性,然后将所有数据放入会话并记录用户。更复杂的应用程序实现收集所有启动数据,包括nonce,并将其吸收到一组表中。
事实证明,大多数LTI实施都是繁忙的工作,所以他们很满意"把它放在会话中#34;做法。构建更复杂的应用程序有很多好处 - 检查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
查找名为extractPost
,loadAllData
和adjustData
的方法。它们是非平凡的 - 但在单个JOIN中,代码执行秘密查找,数据吸收和随机数检查(您的原始问题)。
我猜你会选择" TL; DR;"版本只需保留一个5分钟的窗口 - 但是如果你快速浏览一下Tsugi的LTIX课程,你可以看到LTI除了单点登录之外还有一些好处。