#!/usr/bin/env perl
use strict;
use warnings;
use MIME::Base64;
use Digest::SHA qw(sha256);
my $data = "ya29.eQGmYe6H3fP_d65AY0pOMCFikA0f4hzVZGmTPPyv7k_l6HzlEIpFXnXGZjcMhkyyuqSMtN_RTGJ-xg";
my $digest = sha256($data);
my $first_16_bytes = substr($digest,0,16);
print encode_base64($first_16_bytes);
#!/usr/bin/env perl
use strict;
use warnings;
use MIME::Base64;
use Digest::SHA;
my $access_token = "SOMETHING";
my $digest = Digest::SHA::sha256( $access_token );
my $first_16_bytes = substr( $digest, 0, 16 );
print MIME::Base64::encode_base64url( $first_16_bytes );
5条答案
按热度按时间z9gpfhce1#
SHA256哈希计算器不是一个正确的工具吗?
它不起作用,因为你需要在其中一个步骤中使用二进制数据,几乎所有的Web工具都期望某种文本作为输入并生成文本作为输出。在线工具并不适合这一点。我会写一个工具,这样你就可以看到它是如何完成的。
如何从我的访问令牌获取id令牌中的Base64编码at_hash声明值?
这是我的第一次C#程序迭代2:)所以如果它很丑,那是因为我以前从来没有用过它。后面的解释将解释如何计算at_hash令牌,包括为什么我们需要
decode_base64
。字符串
这个程序的输出(格式化我的)
型
这是如何验证
at_hash
值。如果你想使用我使用过的数据,你可以跳过谷歌部分,但如果你想测试新的数据,你可以在谷歌获得它。从Google O2Auth Playground获取访问令牌
到这里去
型
不要选择任何东西,页面底部有一个输入框。键入
openid
并点击Authorize APIs
,单击要使用的id并选择allow
。选择Exchange authorization code for tokens
。如果成功,你会得到类似于以下的东西。型
id_token分为三个部分,使用句点
.
分开。前两部分是base64编码的。我忽略了id_token的第三部分。我们需要用base64解码这两个。注意,我使用Perl是为了避免必须填充base64字符串,即Perl为我们处理它。你已经知道的第一部分给出了我们需要使用的算法。
型
第二部分给出的是
at_hash
值。型
现在我们知道了
at_hash
的值是什么,我们可以使用access_token来验证它们是否相同。下面的Perl程序就是这样做的。型
这个程序可以如下运行
型
注意,我们得到了
at_hash
,但为什么它们不一样...,它们实际上是一样的,只是其中一个缺少了填充。添加=
符号,直到以下结果成立为止。型
在我们的情况下
型
所以我们得到了两个
==
添加到结果中:)。它们不在令牌中的原因是因为编写规范的人不相信通过网络传递不必要的字节是一个好主意,如果它们可以在另一端添加。bweufnob2#
它在规范中被描述确切地:
https://openid.net/specs/openid-connect-core-1_0.html
3.1.3.6. ID令牌
at_hash可选。访问令牌哈希值。它的值是access_token值的ASCII表示的八位字节散列的最左边一半的base64 url编码,其中使用的散列算法是ID令牌的JOSE头的alg头参数中使用的散列算法。例如,如果alg是RS 256,用SHA-256散列access_token值,然后取最左边的128位,base64 url对其进行编码。at_hash值是区分大小写的字符串。
mqkwyuun3#
我在生成客户机密时遇到了一个类似的问题。
查看IdentityServer使用的HashExtensions类很有帮助;在我的例子中,我没有得到UTF8编码的字节。我怀疑你链接的在线工具采用了不同的方法将字节数组编码为字符串。
1tuwyuhd4#
对于Perl,上面的代码需要像这样扩展:
字符串
那么,它实际上是符合标准的。
确保将MIME::Base64模块升级到最新版本。
ctehm74n5#
Golang溶液
字符串
这里使用不同的签名算法更完整的解决方案(参见
verifyHashClaim
):https://github.com/hashicorp/cap/blob/v0.3.1/oidc/id_token.go#L95