【发布时间】:2017-10-11 19:33:31
【问题描述】:
以下是连接到 API 的文档摘录。我需要与 PHP 建立这种联系,但我做不到。公钥和私钥的示例如下:
- 公钥: 9cd52302-85cf-406d-98df-d3e19eea907c
- 私钥: 7cd0e56a-a62f-4f05-ab8c-e1a2255c9732
下面是带有 C# 示例的文档。根据我的阅读,我的问题似乎是 C# 和 PHP 中的散列操作之间的差异,但我似乎无法得到正确的组合。我所做的每一次尝试都会导致来自“无效用户名或密码”的 API 的响应。从 hash_hmac('sha256', $data, $privateKey) 返回的密钥是小写的,看起来与示例完全不同。我了解 UTF8 和 Base64 编码要求,但哈希让我很着迷。任何帮助是极大的赞赏。摘录如下:
授权令牌
授权令牌由 {Rep Public Key}:{Request Signature}(颜色编码以表示强调)组成。公钥标识发出请求的用户。请求签名是一个安全的、系统生成的字符串,类似于密码,由多条关于请求的信息组成,并使用 HMAC SHA-256 和代表的私钥进行加密。收到请求后,API 会尝试匹配签名。
创建授权令牌
按照以下步骤加密请求签名和代表公钥:
- 对 rep 私钥和请求签名应用 UTF8 编码,即 {HTTP Method}|{URI}|{Time Stamp}。
- 将签名字符串转换为小写。
- 使用 HMAC SHA-256 和代表的私钥加密签名字符串。
- 示例: get|/api/accounts/1052932|2015 年 6 月 18 日星期四 07:25:43 格林威治标准时间
- 变为: RVg3YCtybLImF68rEumuPLCCApLnPIyNvb0hfxH+ek4=
- 将 Base64 编码应用于 {Rep Public Key}:{Encrypted Request Signature} 字符串。
- 示例: 3383259B-9FBA-486E-97A8-E81893741F83:RVg3YCtybLImF68rEumuPLCCApLnPIyNvb 0hfxH+ek4=
- 变为: MzM4MzI1OUItOUZCQS00ODZFLTk3QTgtRTgxODkzNzQxRjgzOlJWZzNZQ3R5YkxJbU Y2OHJFdW11UExDQ0FwTG5QSXlOdmIwaGZ4SCtlazQ9
.NET C# 中的加密代码
var encoding = new System.Text.UTF8Encoding();
var keyByte = encoding.GetBytes(secret);
var messageBytes = encoding.GetBytes(message);
using (var hmacsha256 = new HMACSHA256(keyByte))
{
var hashmessage = hmacsha256.ComputeHash(messageBytes);
return Convert.ToBase64String(hashmessage);
}
【问题讨论】:
-
您认为在这里发布私钥是个好主意吗??
-
@RiggsFolly 再次阅读 mate.. "公钥和私钥的示例"
-
@dehood 唷,这是一种解脱
-
@RiggsFolly 我知道是对的
-
@RiggsFolly - 我认为发布有效的私钥将是一个糟糕的主意。 ;) 为了尽可能提供最完整的信息,我生成了这些作为示例。