【问题标题】:Different hashing results in Dart vs PHP codeDart 与 PHP 代码中不同的哈希结果
【发布时间】:2020-02-28 16:59:32
【问题描述】:

我正试图让它在颤动中工作,但我无法得到相同的结果。 我的 php 代码打印一个不同的哈希然后我的颤振代码。是否可以在 Flutter 应用中执行此操作?

我试图通过运行这个颤振代码来实现这一点。但在阅读了 5 个小时后,我放弃并创建了一个堆栈溢出帐户。

import 'package:crypto/crypto.dart';
import 'dart:convert'; // for the utf8.encode method
import 'package:http/http.dart' as http;


void main() {
  var api = 'https://app.repricer.nl';
  var endpoint = '/api/v1/channels/all.json';
  var method = 'GET';
  var public_key = '';
  var private_key = '';
  var data = '';


  var ms = (new DateTime.now()).millisecondsSinceEpoch;
  var timestamp = ms / 1000;

  var hash_string = public_key + '|' + method + '|' + endpoint + '|' + data + '|' + timestamp.toString();

  var key = utf8.encode(private_key);
  var bytes = utf8.encode(hash_string);

  var hmacSha256 = new Hmac(sha512, key); // HMAC-SHA256
  var digest = hmacSha256.convert(bytes);

  print(digest);
}

这是我要转换为颤振的 PHP 代码:

$api = 'https://app.repricer.nl';
$endpoint = '/api/v1/channels/all.json';
$method = 'GET';
$public_key = '';
$private_key = '';


// Generate the CURL headers to authenticate our request
$headers = generateHash($public_key, $private_key, $method, $endpoint, $data);


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$api.$endpoint);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
curl_close($ch);

print_r($result);

function generateHash($public_key, $private_key, $method, $endpoint, $data)
{
    $timestamp = date("U");
    $hash_string = array($public_key,$method,$endpoint,$data,$timestamp);
    $hash = hash_hmac('sha512',implode('|',$hash_string),$private_key);    
    print ($hash);
    return array('X-Auth: '.$public_key, 'X-Hash: '.$hash, 'X-Date: '.$timestamp);
}

我希望输出与时间戳相同。但我在同一秒内运行它,这是两个完全不同的结果。

【问题讨论】:

  • 给我们一些输入和输出的例子。
  • 德米安 - 请检查我的答案,让我们讨论一下你是否仍然得到不同的结果
  • 是的,你的权利,它是一样的。对此感到抱歉。
  • 我又检查了一遍。不同的输出是因为 php 给出了一个没有逗号的时间戳,而用逗号颤动。我在代码中添加了一个 .round,现在它已修复。
  • @DemianOttema 无需抱歉。问问题是完全正确的。这不是一个简单的问题,因为它展示了如何将代码从一种语言移植到另一种语言以及如何检查结果。

标签: php api flutter dart


【解决方案1】:

您的代码是正确的。

小修复只是替换:

ms / 1000   to   (ms / 1000).toInt()

我在您的代码中没有发现其他缺陷。

我在使用恒定时间戳参数进行测试运行后得出了这个答案:1572731120

PHP:

$timestamp = 1572731120; //date("U");
$hash_string = array($public_key,$method,$endpoint,$data,$timestamp);
$hash = hash_hmac('sha512',implode('|',$hash_string),$private_key); 

飞镖

  var ms = (new DateTime.now()).millisecondsSinceEpoch;
  var timestamp = 1572731120;//(ms / 1000).toInt(); 

  var hash_string = public_key + '|' + method + '|' + endpoint + '|' + data + '|' + timestamp.toString();

  var key = utf8.encode(private_key);
  var bytes = utf8.encode(hash_string);

  var hmacSha256 = new Hmac(sha512, key); // HMAC-SHA256
  var digest = hmacSha256.convert(bytes);

证明结果相等:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2017-02-15
    • 2018-09-05
    相关资源
    最近更新 更多