在 Oauth 中,访问令牌不透明有什么好处

信息安全 oauth
2021-09-02 08:28:10

为什么决定客户端不需要能够解析访问令牌?

在我看来,如果令牌除了当前字段、client_id 和 user_id 之外还包括,它将使生活变得更加简单,防止欺骗,启用身份验证等。

我已经注意到,根据RFC 6749 的第 1.4 节,它不必是不透明的,但在我看来,OpenID Connect 的大部分(如果不是全部的话)都是使访问令牌变得有意义的一种方式。是的,它添加了一个 ID 令牌,但它被实现为附带的东西而不是嵌入在访问令牌中的事实并没有改变这一事实。似乎每个视频、教程和博客文章都在谈论它,就好像假设是这样(访问令牌将是不透明的,因为“客户不是目标受众”)......然而它是无法基于拥有令牌的持有者建立身份验证的 API 或资源提供者。

实际上我需要补充一点,我不认为令牌对客户端不透明是问题所在。问题是令牌是不限制 WHO 可以使用它的不记名令牌。

1个回答

在 OAuth 或令牌可以是不透明或透明的任何其他协议中,收益和风险取决于您想要的结果是什么:

  • 如果您希望客户端能够解析访问令牌,则需要令牌是透明的。
  • 如果您不希望客户端能够解析访问令牌,则需要该令牌是不透明的。

确实,这就是不透明和透明令牌的定义;客户可以看到它们,也可以不看到。

如果您的令牌是透明的,您必须对其进行签名,否则,任何人都可以简单地编辑您的令牌内容,并索取他们想要的任何东西。

因此,拥有不透明令牌的第一个明显好处是您可以丢弃任何签名机制;你不需要它,相反,如果你有一个适当的透明令牌,客户端可以读取令牌,但不能编辑它。

拥有不透明令牌的另一个好处是更安全。没有一种加密方法是真正随机的(即必须有一种方法来解密它),这意味着如果您可以读取足够多的令牌内容(透明令牌),您总是可以判断使用了哪种加密协议。这本身就减少了识别密码(了解协议)的时间。许多人不认为这是非常冒险的,事实上,如果您使用超过 80 位的熵,他们是正确的(10 个真正随机的字符作为您的密码,即“密钥”)。

但是,这风险更大;透明令牌允许破解者使用内容(因为他们看到它们),并且一些协议具有严重的弱点,允许您创建冲突甚至在更短的时间内解码密码,因为破解者会知道协议以及内容有效块的数量(大多数加密协议使用 16 字节长的块,因此如果您的令牌包含 160 个字符的数据,则您已为破解者提供了 10 个有效的密码组合。这减少了他们识别您的密码所需的时间一个数量级。给他们更透明的令牌也将进一步减少这个时间。一些协议降低了这种风险,但根据编码的性质,编码块和解码块都在你手中, 你'

这就是为什么许多人选择不透明令牌的原因。事实上,如果不需要任何外部实体能够解析您的令牌,您应该始终选择不透明的令牌。这方面的一个示例是一个服务框架,在该框架中,您仅将令牌作为盲声明传递给服务;您不知道它在说什么,但您知道它有效并且可以识别您。仅由服务通过密钥或密码来确认您的身份。

不透明令牌也不需要签名,我在上面提到过,它们也不需要透露有关所选协议的任何信息。

出于这个原因,它们更加安全,不仅在数学和逻辑上,而且摆脱了人为的实施错误,老实说,99% 的原因都是一开始就出现了裂缝。

有趣的笔记

即使是真正的随机性也意味着随机猜测时组合空间的 36.7% 损失(1 除以 e)。这意味着一个有 1000 种可能性的密码锁,如果随机猜测,实际上有 630 分之一的机会猜对它。

所以 1 / e 是你拥有的绝对最佳机会,那是纯随机的。

任何对人类感兴趣的“可能性”,即“信息”,根据定义并不是真正随机的,更糟糕​​的是,任何用于对其进行解码的协议都会通过协议的工作方式为密码放弃一些可能的空间。因此,实际上,您随机猜测答案的机会远小于大多数人谈论或认为他们实际拥有的熵或组合空间;通常,当所有帐户都由优秀的黑客衡量时,至少比外行认为的要容易一个数量级。