- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在编写我自己的 Open ID RP 实现(是的,我知道已经构建了很多,我这样做是为了“好玩”)。一切正常,直到我进入验证步骤并计算哈希并将其与我在肯定断言中从 OP 获得的信号进行比较。
我已经上下阅读了规范,但有几件事我不太清楚:
我是只在 openid 命名空间中包含键值对,还是在 openid.signed 中包含列表中的所有内容? 6.1听起来我应该只使用 openid。键,即使我在 openid.signed (ax) 中还有一些其他东西。
最后一个键值对是否应该跟一个换行符?
我假设这些值应该是 url 编码的(因为值中没有冒号)。如果是这样,我还假设十六进制值(例如 %3D)应该是大写的。我在 OAuth 1.0 实现中遇到了这个问题,因为 .NET 的内置 URL 编码使用小写十六进制字母。
我相当确定编码和算法没问题,但我的基本字符串已关闭。这是一个我无法开始工作的示例的完全未更改的版本:
Querystring 我从 OP 那里得到肯定的断言: openid.ns=http://specs.openid.net/auth/2.0&openid.mode=id_res&openid.op_endpoint=https://www.google.com/accounts/o8/ud&openid.response_nonce=2011-05- 13T08:18:42ZBHyiLFGyNT-SqQ&openid.return_to=http://mysite.com/Account/Login.aspx&openid.assoc_handle=AOQobUc4P9MWC3faGcMkfTb2U10KfGQ-6cm9L4pLDQmeoY2DE6XRGtN0&openid.signed=op_endpoint,claimed_id,identity,return_to,response_nonce,assoc_handle,ns.ext1,ext1.模式,ext1.type.firstname,ext1.value.firstname,ext1.type.email,ext1.value.email,ext1.type.lastname,ext1.value.lastname&openid.sig=KSXw+bv7sLlQyUIflA3Jzx5VoPk=&openid.identity=https://www.google.com/accounts/o8/id?id=AItOawkDYxJln6LwTAdl0kP8xdMT71SoRufUFA4&openid.claimed_id=https://www.google.com/accounts/o8/id?id=AItOawkDYxJln6LwTAdl0kP8xdMT71SoRufUFA4&openid.https.openid.1=://www.google.com/accounts/o8/id?id=AItOawkDYxJln6LwTAdl0kP8xdMT71SoRufUFA4&openid.ns.openid.1=://www.google.com/accounts/o8/id? net/srv/ax/1.0&openid.ext1.mode=fetch_response&openid.ext1.type.firstname=http://axschema.org/namePerson/first&openid.ext1.value.firstname=firstname&openid.ext1.type.email=http://schema.openid.net/contact/em ail&openid.ext1.value.email=testingopenid5132011@gmail.com&openid.ext1.type.lastname=http://axschema.org/namePerson/last&openid.ext1.value.lastname=lastname
我使用该查询字符串构建的基本字符串: op_endpoint:https://www.google.com/accounts/o8/ud\nclaimed_id:https://www.google.com/accounts/o8/id?id=AItOawkDYxJln6LwTAdl0kP8xdMT71SoRufUFA4\nidentity:https://www .google.com/accounts/o8/id?id=AItOawkDYxJln6LwTAdl0kP8xdMT71SoRufUFA4\nreturn_to:http://mysite.com/Account/Login.aspx\nresponse_nonce:2011-05-13T08:18:42ZBHyiLFGyNT-SqQ\nassoc_handle:AOQobUc4P9MWC3faGcMkfTb2U10KfGQ-6cm9L4pLDQmeoY2DE6XRGtN0\nns.ext1:http://openid.net/srv/ax/1.0\next1.mode:fetch_response\next1.type.firstname:http://axschema.org/namePerson/first\next1.value.firstname:firstname\next1.type.email:http://schema.openid.net/contact/email\next1.value.email:testingopenid5132011@gmail.com\next1.type.lastname:http://axschema.org/namePerson/last\next1.value.lastname:姓氏\n
关联请求返回的 mac key : U/1wUBAU2aYIR+2eIsugXyEOpmE=
将所有这些与 HMAC-SHA1 结合使用,我得到的哈希是: 9HMRL4je44Oz90s1f8pw5qpZ8HQ=
但是从openid.sig可以看出,应该是 KSXw+bv7sLlQyUIflA3Jzx5VoPk=
我是否错误地制定了基本字符串?我计算的哈希值错了吗?为什么这么“简单”的事情要花这么长时间才能正确实现?
最佳答案
我在生成匹配签名时也遇到了问题,最终找到了解决方案。
正如您已经怀疑的那样,您必须从 openid.ax
命名空间添加值,应用添加键/值对而不使用 openid 的相同规则。
前缀。如果没有 openid.ax
key ,则有问题。
是的,最后一个键/值对后跟一个换行符(注意:只有一个\n
)。这本可以在 OpenID 规范中更清楚地提及。
您对 URL 编码的看法是错误的,恰恰相反:值必须经过 URL 解码。这在规范中也没有明确说明。不要混淆冒号和分号,你不能有冒号,但只能在关键部分,所以这个没有问题。
因此,如果您尝试使用此字符串并添加缺少的键/值对,它应该可以工作:
ns:http://specs.openid.net/auth/2.0op_endpoint:https://www.google.com/accounts/o8/udclaimed_id:https://www.google.com/accounts/o8/id?id=AItOawlvj7acGYj-NH1kKKl3RswJlLCKpl9LIwkidentity:https://www.google.com/accounts/o8/id?id=AItOawlvj7acGYj-NH1kKKl3RswJlLCKpl9LIwkreturn_to:http://mysite.com/Account/Login.aspxresponse_nonce:2011-05-12T03:56:09ZoeDC9WFOgOBaAQassoc_handle:AOQobUdHugprvbsK2-8NCtS2uBomRDGJQGOKDmqEwxco8Rny47rdZlBpns.ext1:http://openid.net/srv/ax/1.0ext1.mode:fetch_responseext1.type.firstname:http://axschema.org/namePerson/firstext1.value.firstname:Firstext1.type.email:http://schema.openid.net/contact/emailext1.value.email:myemail@gmail.comext1.type.lastname:http://axschema.org/namePerson/lastext1.value.lastname:Name
This little console application re-generates the signature (using HMAC-SHA256), it needs two parameters:
Code:
using System;
public class OpenIdSignatureVerification {
public static void Main(string[] args) {
if (args.Length != 2) {
Console.Error.WriteLine("Usage: assertion_url mac_key");
Environment.Exit(1);
}
string url = args[0];
int pos = url.IndexOf('?');
if (pos == -1) {
Console.Error.WriteLine("No query string found");
Environment.Exit(1);
}
url = url.Substring(pos + 1);
Console.WriteLine(String.Format("Query string: {0}", url));
System.Collections.Generic.Dictionary<string, string> dict = new System.Collections.Generic.Dictionary<string, string>();
foreach (string part in url.Split('&')) {
string[] keyValue = part.Split('=');
if (keyValue.Length != 2) continue;
dict[keyValue[0]] = System.Web.HttpUtility.UrlDecode(keyValue[1]);
}
string hashInput = String.Empty;
string[] signed = dict["openid.signed"].Replace("%2C", ",").Split(',');
foreach (string key in signed) hashInput += key + ":" + dict["openid." + key] + "\n";
string macKey = args[1];
Console.WriteLine(String.Format("Hash input: {0}\n", hashInput));
Console.WriteLine(String.Format("MAC Key: {0}", macKey));
byte[] encodedHashInput = System.Text.Encoding.UTF8.GetBytes(hashInput);
System.Security.Cryptography.HMACSHA256 signer = new System.Security.Cryptography.HMACSHA256(Convert.FromBase64String(macKey));
string hashOutput = Convert.ToBase64String(signer.ComputeHash(encodedHashInput));
Console.WriteLine(String.Format("Signature hash (expected) : {0}", dict["openid.sig"]));
Console.WriteLine(String.Format("Signature hash (calculated): {0}", hashOutput));
}
}
关于OpenID - 生成签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5975514/
我得到了这个printHashKey函数,它运行良好。 fun printHashKey() { try { val info : PackageInfo = packageM
如何使用正确的签名 key 为我的 Android 应用包签名? 最佳答案 我尝试在此处和 this question 中使用多个答案, 但不知何故我收到了这个错误,因为我的 android/app/
我的 gradle 文件中有这个: android { signingConfigs { mySigningConfig { keyAlias 'the
请至少选择一个签名版本以在 Android Studio 2.3 中使用 现在在 Android Studio 中生成一个签名的 APK 时,它显示了两个选项(复选框),即 1. V1(Jar 签名)
我想表示一些标量值(例如整数或字符串)通过它的实际值或一些 NA 值,然后存储它们在集合中(例如列表)。目的是处理缺失值。 为此,我实现了一个签名 module type Scalar = sig
为什么这不完全有效? sum :: (Num a, Num b) => a -> b -> c sum a b = a + b 当然,错误消息与签名有关,但我仍然不明白原因。 Couldn't mat
谢谢帮助,我的问题是关于从下面的代码中收到的 ax 值? mov al,22h mov cl,0fdh imul cl 真机结果:ff9a 我的预期:00:9a(通过二进制相乘) 第一个数字是 22h
我有一个注释: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
我从对物体的思考中得出了一个术语。当我们扩展一个类时,扩展类将具有与父类相同的签名,因此术语 IS-A 来自...示例 class Foo{ } class Foo2 extends Foo{ } c
我需要在有符号整数和它们作为字节序列的内部表示之间进行转换。在 C 中,我使用的函数如下: unsigned char hibyte(unsigned short i) {return i>>8;}
我正在尝试使用给定的 RSA 参数对一些数据进行签名。 我给出了模数、指数、D、DP、DQ、P、Q 和 InverseQ。什么库或方法最容易使用来计算此签名。在 C# 中,一旦您提供参数,它们就会有一
这些签名之间有什么区别? T * f(T & identifier); T & f(T & identifier); T f(T & identifier); void f(T * identifie
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Where and why do I have to put the “template” and “typ
我有一个签名,我需要在签名旁边添加图片。但我不确定 css 的确切程度和内容。目前它显示在文字下方,我应该把图片放在哪里?在相同的 tr 或 td 中?
查看 LinkedHashMap 的 JDK 源代码,我注意到这个类被声明为: public class LinkedHashMap extends HashMap im
背景:我继承了一个基于 linux 的嵌入式系统,其中包含一个 SMTP 代理和一些我不得不忍受的古怪限制。它位于 SMTP 客户端和服务器之间。当 SMTP 客户端连接时,代理会打开与服务器的连接,
这是 C++17 形式的规则 ([basic.lval]/8),但它在其他标准中看起来很相似(在 C++98 中是“lvalue”而不是“glvalue”): 8 If a program attem
我有一个注释: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
我即将开展一个项目,希望使用电子签名板使用 C# 捕获客户的签名、在设备上显示文本等。 现在,在我开始做进一步的研究之前,我想向你们征求一些意见/建议,我应该使用哪些设备.. 我现在的要求非常笼统:我
呢喃自己在心中开始扩张地盘,仿佛制式地广播了三次。 漾起的涟绮,用谈不上精腻的手段。 拒绝天亮,却又贪恋着贪恋多情的日光。 川流不息的画面是他们,而我的落幕停在右脚,它渴望着下台,而我只剩自言
我是一名优秀的程序员,十分优秀!