如何计算PCKE的code_verifier?

2023-11-26

我正在经历Okta PKCE 流程演示为了更好地理解它是如何工作的,但我在重现同样的事情时遇到了困难code_challenge生成的哈希值code_verifier。这是演示的屏幕截图:

Pcke Flow Demo

Using Zg6klgrnixQJ629GsawRMV8MjWvwRAr-vyvP1MHnB6X8WKZN作为代码验证者,他们是如何产生的
iF_7prUeJ6rr3jMG3LmhW3R1cZ2ecZavFqS0jtb6tzo作为代码挑战?

使用这个SHA256 哈希计算器 and Base64编码器, I got ODg1ZmZiYTZiNTFlMjdhYWViZGUzMzA2ZGNiOWExNWI3NDc1NzE5ZDllNzE5NmFmMTZhNGI0OGVkNmZhYjczYQ这与预期值不匹配iF_7prUeJ6rr3jMG3LmhW3R1cZ2ecZavFqS0jtb6tzo。我做错了什么而没有获得预期值?

This 来自 Approsto 的 SHA256 Base 64 哈希计算器给我一个非常接近预期值的值。使用这个计算器我得到iF/7prUeJ6rr3jMG3LmhW3R1cZ2ecZavFqS0jtb6tzo这与预期值相差一个字符(注意其中有一个/代替_).

我在做什么导致这种差异?我如何计算预期code_verifier的价值iF_7prUeJ6rr3jMG3LmhW3R1cZ2ecZavFqS0jtb6tzo? Thanks


PKCE 代码质询是验证者的 Base64-URL 编码的 SHA256 哈希值。这意味着您需要获取原始字符串,计算其 SHA256 哈希值,然后对哈希值进行 Base64-URL 编码。话太多了,我们来逐一讲解一下。

您上面尝试执行的操作存在两个问题:

您找到的在线 SHA256 哈希计算器将哈希输出为十六进制编码的字符串,而不是原始字节。这通常很有帮助,但在这种情况下却没有。因此,您通过 Base64 编码要做的下一件事是对哈希的十六进制表示形式而不是原始字节进行 Base64 编码。您需要使用输出原始字节的哈希函数,并将原始字节传递到 base64-url-encoder。

下一个问题是您需要进行base64-url 编码,而不是base64 编码。 Base64-URL-encoding 是 Base64 编码的一个小变体,唯一的区别是使用字符-代替+ and _代替/,并修剪=从末尾开始填充字符。这使得它是 URL 安全的,因为否则+/=URL 中的字符需要转义。

因此,要计算 PKCE 代码挑战,您需要使用可以为您提供原始字节的 SHA256 函数,然后使用修改后的 Base64 编码函数对这些字节进行编码。

下面是 PHP 中的一些代码,可以实现这一点:

function pkce_code_challenge($verifier) {
    $hash = hash('sha256', $verifier, true);
    return rtrim(strtr(base64_encode($hash), '+/', '-_'), '=');
}

也可以在浏览器中使用纯 JavaScript,但由于 WebCrypto API 的复杂性,代码稍长:

function sha256(plain) { 
    // returns promise ArrayBuffer
    const encoder = new TextEncoder();
    const data = encoder.encode(plain);
    return window.crypto.subtle.digest('SHA-256', data);
}

function base64urlencode(a) {
    // Convert the ArrayBuffer to string using Uint8 array.
    // btoa takes chars from 0-255 and base64 encodes.
    // Then convert the base64 encoded to base64url encoded.
    // (replace + with -, replace / with _, trim trailing =)
    return btoa(String.fromCharCode.apply(null, new Uint8Array(a)))
        .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}

async function pkce_challenge_from_verifier(v) {
    hashed = await sha256(v);
    base64encoded = base64urlencode(hashed);
    return base64encoded;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何计算PCKE的code_verifier? 的相关文章

随机推荐

  • 使用其他 Observable 过滤 RxJava Observable

    我正在使用 RxAndroid 2 0 1 和 RxJava 2 0 6 我有两个可观察量 一个返回Maybe
  • onClickListener 和 onItemClickListener 之间的区别

    Android ListViews 中的 onClickListener 和 onItemClickListener 有什么区别 这些有哪些不同的实现 ListView 为列表视图的每一行都有一个 Item Click 侦听器 但 onCl
  • Python 和 Selenium - 当带有换行符的 send_keys() 时避免提交表单

    我在用Python 3与硒 我们假设var whatever nelse 我的问题是当我使用elem send keys var 它在之后发送表格 任何 因为换行符 我如何将 whatever nelse 替换为whatever SHIFT
  • GraphHopper 车辆=汽车可以工作,但步行或自行车不起作用

    我对 GraphHopper 路由引擎稳定版本 0 5 有疑问 我可以在使用时获取路线vehicle car 但这失败了bike and foot 这是一个例子在 GraphHopper 地图上步行大约 3 分钟 这会在地图上产生结果 非常
  • 如何重写祖先的嵌套 Material UI 组件的样式?

    我正在使用外部库中的组件 该组件不允许我更改其大部分样式 但我想更改作为材质 ui 按钮的按钮的样式 在检查元素时 它清楚地显示了类MuiButtonBase root MuiIconButton root MuiIconButton co
  • asp.net-mvc:js文件中的剃刀'@'符号

    我有一个 csHtml razor 文件 其中包含一个 javascript 函数 该函数使用 Url ContentAjax URL 内部的 C 函数 我想将该功能移至 js从我的观点引用的文件 问题是 javascript 不 知道 符
  • OpenCv StereoRectify 中矩阵的精确定义

    通常投影矩阵的定义P是 3x4 矩阵 它将点从世界坐标投影到图像 像素坐标 投影矩阵可以分解为 K 具有内在参数的 3x4 相机矩阵 K T 带有外部参数的 4x4 变换矩阵 那么投影矩阵就是P K T OpenCV 的stereoRect
  • 我可以使用 jquery post 来上传图片吗?

    我正在尝试使用 jquery 来提交我的表单 但它不会触发functions php 文件中的任何内容 我需要对 multipart form data 做一些特别的事情吗 我错过了什么吗 HTML
  • iPhone 动画基于输入值(触摸)而不是时间

    对于完全适合动画组方法的动画效果 如下所示布拉德 拉尔森的回答在这里 我需要动画根据输入进行 特别是触摸和检测到的触摸的位置 处理 TouchMoved 并为每次触摸设置元素的位置很容易 但它不像核心动画方法那样平滑 想象一下有凹槽的轨道上
  • Pandas 删除数据框中指定字符后的字符串部分

    我想要一种简单的方法来删除数据框中特定字符之后的字符串部分 这是一个简化的示例 df obs a b c d 0 1 1 23 12 1 2 3 1 2 12 23 13 4 5 5 2 3 21 23 14 4 5 5 我想删除第一个 符
  • 设置 Google Play 游戏服务

    我最近一直在尝试新的 Google Play 游戏服务 我花了一些时间来设置所有内容以使示例项目运行 主要是因为a犯了很多小错误 因此 我写了一个小清单 这样其他人就不必经历同样的结果 开发很有趣 配置则不然 谷歌对此有一个很好的快速入门
  • 如何管理 ASP.NET WebApi2 中的缓存?

    我已经使用 Web API 2 实现了 REST 服务 该服务的实现是为了管理由访问服务的不同客户端创建和加入的不同会话 会话包含有关应用程序功能访问的信息以及已加入同一会话的参与者的信息 每个客户端每秒从服务器获取会话信息和访问列表以进行
  • Spark 中优雅的 Json 扁平化 [重复]

    这个问题在这里已经有答案了 我在 Spark 中有以下数据框 val test sqlContext read json path path to jsonfiles test printSchema root properties str
  • 只写属性有实际应用吗?

    我不知道为什么我开始思考这个问题 但现在我似乎无法停止 在 C 中 可能还有很多其他语言 我记得 Delphi 也曾经让你这样做 编写以下语法是合法的 class WeirdClass private void Hello string n
  • 为什么password_verify返回false?

    我在用着password verify检查我的哈希密码 我有 PHP 5 5 get result row as an object result row result of login check gt fetch object usin
  • 如何将 LanguagePrimitives.GenericZero / get_Zero 添加到 System.String?

    注 我添加了很多Of interest评论在最后 这些并不意味着建议人们应该使用inline and static type parameters 无论如何 它们就在那里 这样人们就不必花费数小时搜索与此问题相关的大量 SO 问题来更好地理
  • Java:Cloneable 接口的基本原理

    为什么不是 clone 中指定的方法java lang Cloneable界面 基本上 这是一个损坏的接口 肯 阿诺德 Ken Arnold 和比尔 维纳斯 Bill Venners 在Java 设计问题 Arnold 如果我在这一点上是上
  • http_parse_headers 与 PECL_HTTP

    我想用http parse headers所以 我已经安装了依赖项pecl http 2 4 3 2 2 5 并打电话http parse headers功能没有成功 function exists 总是失败我在这里缺少什么吗 我在用着 C
  • React 和 Webpack:加载图像并将其显示为背景图像

    我正在创建一个类似横幅的组件 并将图像设置为组件的背景 但我无法让它工作 我尝试了网上发布的不同建议 但没有成功 目前我不确定我的错误是否在反应代码中 或者是 webpack 没有正确加载文件 这是我的文件结构 AppFolder clie
  • 如何计算PCKE的code_verifier?

    我正在经历Okta PKCE 流程演示为了更好地理解它是如何工作的 但我在重现同样的事情时遇到了困难code challenge生成的哈希值code verifier 这是演示的屏幕截图 Using Zg6klgrnixQJ629GsawR