【问题标题】:Convert C# Hash Code to PHP for REST API Connection将 C# 哈希代码转换为 PHP 以进行 REST API 连接
【发布时间】: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 会尝试匹配签名。

创建授权令牌

按照以下步骤加密请求签名和代表公钥:

  1. 对 rep 私钥和请求签名应用 UTF8 编码,即 {HTTP Method}|{URI}|{Time Stamp}。
  2. 将签名字符串转换为小写。
  3. 使用 HMAC SHA-256 和代表的私钥加密签名字符串。
    • 示例: get|/api/accounts/1052932|2015 年 6 月 18 日星期四 07:25:43 格林威治标准时间
    • 变为: RVg3YCtybLImF68rEumuPLCCApLnPIyNvb0hfxH+ek4=
  4. 将 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 - 我认为发布有效的私钥将是一个糟糕的主意。 ;) 为了尽可能提供最完整的信息,我生成了这些作为示例。

标签: c# php rest


【解决方案1】:

已解决。第三步应该有第二步。您也必须对签名字符串进行 Base64 编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2015-10-13
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 2014-12-27
    相关资源
    最近更新 更多