当前位置: 首页 > 知识库问答 >
问题:

基于散列片段的安全性到底是如何工作的?

微生慈
2023-03-14

我正在学习OAuth2.0,无法获得在隐式授权流中保护访问令牌的方法。在规范中有一些论题,有些被推翻,所以答案看起来相互矛盾。有人能把它清理一下吗?引自SO的答案和说明,让我困惑:

  1. (来自规范)用于将访问令牌传递给客户端的重定向URI。访问令牌可以公开给资源所有者或具有访问资源所有者用户代理权限的其他应用程序
  2. (来自spec)访问令牌凭据(以及任何机密的访问令牌属性)在传输和存储过程中必须保密,并且只能在授权服务器、访问令牌有效的资源服务器和向其颁发访问令牌的客户端之间共享。只能使用TLS传输访问令牌凭据。
  3. (从accepted and upvoted SO answer)在隐式流中,访问令牌作为哈希片段传递,只有浏览器知道哈希片段。浏览器将把散列片段直接传递给目标网页/重定向URI,即客户端的网页(散列片段不是HTTP请求的一部分),因此您必须使用JavaScript读取散列片段。哈希片段不能被中间服务器/路由器截获(这很重要)。

我的问题是:

P1表示通过重定向URI传递给客户端令牌,P2表示传递通道必须是TLS-ED。但是P3说哈希片段没有发送到网络。如果访问令牌因为它是哈希片段而没有发送,它如何到达客户端?不管怎样,它必须通过网络发送,不是吗?或者用重定向URI发送令牌在没有网络交易的情况下会有一些魔力?

唯一可能的解释是--在底层,浏览器只通过网络发送非哈希部分的url,在加载新页面后,只插入哈希片段并使其对JS可用。如果我是对的,我仍然不明白为什么我们不简单地发送带有可靠的、安全的HTTPS通道作为响应参数的令牌?

共有1个答案

焦阎宝
2023-03-14

OAuth提供者通过HTTP响应重定向将访问令牌发送回OAuth使用者:

HTTP/1.1 302 Found
Location: https://consumer.org/redirect_uri#access_token=1111-2222-3333-4444

请注意访问令牌是如何通过网络发送的,作为来自OAuth提供者的HTTP响应的一部分,除了使用者之外,OAuth提供者也应该在HTTPS上。

然后,您的浏览器将向使用者endpoint执行一个新的HTTP GET请求:

GET /redirect_uri HTTP/1.1
Host: consumer.org

请注意访问令牌是如何不通过网络发送给使用者的。位于consumer.org的服务器将不会接收此HTTP请求中的令牌。相反,从https://consumer.org/redirect_uri返回的web页面将包含javascript,该javascript能够并将从url片段中读取访问令牌。

因此,您需要信任从Consumer.org(通过使用HTTPS)接收的javascript代码,因为如果攻击者可以插入代码,它也可以间接获得访问令牌(并将其发送到任何地方)。

使用者的HTTP响应示例

200 OK
Content-Type: text/html

<html><head><script> 
    alert(window.location.hash) 
</script>
</head><body></body></html>
 类似资料:
  • 问题内容: 我正在学习OAuth 2.0,无法获得 隐式授权流程 中保护访问令牌的方法。规范中有一些论点,有些被推崇的SO答案看起来彼此矛盾。有人可以解决吗?SO答案和规范引述让我感到困惑: (来自规范)用于将访问令牌传递给客户端的重定向URI。访问令牌可以向资源所有者或其他具有资源所有者的用户代理访问权限的应用程序公开。 (根据规范)访问令牌凭据(以及任何机密的访问令牌属性)必须在传输和存储过程

  • 我试图完全理解密码散列,以便能够向审计员解释它。 基于我对答案的搜索,我知道函数是的包装器。在阅读预定义常量的PHP手册时,我看到它使用作为默认整数值(基本上它使用算法来散列密码)。 让我困惑的是,变量如果省略,会生成一个随机salt,并且成本将设置为。如果我提供了更高的成本(例如:),由于我没有提供salt值,它还会生成随机salt吗?我在这里感到困惑的原因是,我没有忽略,而是提供了不同的成本。

  • 我们知道主存域很少:年轻的、终生的(旧的gen)和PermGen。 年轻领域分为伊甸园和幸存者(有两个)。 OldGen用于生存的对象。 MaxTenuringThreshold防止对象过早地被最终复制到OldGen空间。这很清楚,也很容易理解。 但是它是如何工作的呢?垃圾回收器如何处理这些在MaxTenuringThreshold之前仍然存在的对象,以何种方式?它们位于何处? 对象被复制回幸存者

  • 我正在学习Spring核心认证,我对Spring如何处理bean生命周期有一些疑问,特别是bean后处理器。 所以我有了这个模式: 我很清楚这意味着什么: 然后在bean创建阶段执行以下步骤: > 每个bean都在缺省情况下被急切地实例化(按照正确的顺序创建,并注入其依赖项)。 在依赖注入之后,每个bean都会经历一个后处理阶段,在这个阶段中可能会进行进一步的配置和初始化。 > 初始化器:如果指示

  • 这是一个简单的错误:我在对象的格式字符串中使用了而不是。但我完全困惑于我的测试结果与错误的格式字符串。 以下代码: @Jan建议依赖toString()方法可能会有问题,所以我定义了一个日期格式,以与上面相同的代码打印。下面是附加输出:

  • 我几乎理解了尾递归是如何工作的,以及它与普通递归之间的区别。我只是不明白为什么它不要求堆栈记住它的返回地址。 在尾递归函数中调用函数本身后没有什么可做的,但对我来说这没有意义。