【发布时间】:2017-06-10 04:51:02
【问题描述】:
我的应用程序实现了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 发出时,存储 nonces 和拒绝任何重复请求是否有价值?
【问题讨论】:
-
视情况而定。您的威胁模型是否包括重放攻击?如果不是,那么您可能不需要随机数,因为不存在坏人重播先前消息的威胁。另请参阅 InfoSec.SE 上的 What is the use of a client nonce?。不要嘲笑消除你不喜欢或不想处理的威胁。 Web 和浏览器安全模型做了很多工作。消除不便的威胁是网络钓鱼在浏览器和其他用户代理中如此严重的原因。用户和针对他/她的一些攻击已从模型中删除。
-
但是,根据 this answer 在 InfoSec.SE 问题上的说法:“根据 RFC 2617,cnonce 和 nc 参数可以防止选定的明文攻击。” 听起来就像你需要验证它。
-
我绝对做的是防止重放攻击,但我相信这是 SSL 的一个特性,所以在这里是不必要的。我确实认识到在这里防止这种攻击的价值,我的第一直觉是验证随机数,但是由于存储它会花钱并占用用户时间,我不想无缘无故地这样做。
-
我投票结束这个问题,因为它不是关于特定的编程问题,而是更多关于特定协议的安全属性。因此最好在 security.stackexchange.com 上询问。
-
您引用的 RFC (2617) 用于通过普通 http 进行身份验证,不适用于(除了非常普遍)这个问题。