首页 > 解决方案 > 将 c# 代码转换为 PHP 时出现问题,如下所示

问题描述

我正在运行此代码:

var timeStamp = DateTime.UtcNow;
var sharedSecret = "xx";
var saltedString = timeStamp.ToString("2021-01-07T16:42:33.619667Z") + sharedSecret;

//Encoding saltedString using Unicode little-endian byte order
byte[] encodedSaltedString = Encoding.Unicode.GetBytes(saltedString);

//Hashing Algorithm used is SHA512
HashAlgorithm hash = new SHA512Managed();

//Compute Hash of encodedSaltedString
byte[] hashedEncodedString = hash.ComputeHash(encodedSaltedString);

//Convert hashed array to base64-encoded string
string signature = Convert.ToBase64String(hashedEncodedString);

然后我在 C# 中得到这个结果:“gQhjrLnY6fo44EeaaWaUBE1PY/8oEIRsUcK3AMSCVUCYMM4vRfxvQEEggXaHTF0GQbw4w2HbWARX1k6NnkzJFg==”

我转换为如下代码,但我遇到了一个问题。我能得到一些帮助吗?

$timestamp = "2021-01-07T16:42:33.619667Z";
$sharedSecret = 'xx';
$saltedString = $timestamp.$sharedSecret;

$utf=mb_convert_encoding($saltedString, "UTF-16LE");

$signature = base64_encode(hash('sha512', $utf));

在 PHP 中,我得到了这个结果: ODEwODYzYWNiOWQ4ZTlmYTM4ZTA0NzlhNjk2Njk0MDQ0ZDRmNjNmZjI4MTA4NDZjNTFjMmI3MDBjNDgyNTU0MDk4MzBjZTJmNDVmYzZmNDA0MTIwODE3Njg3NGM1ZDA2NDFiYzM4YzM2MWRiNTgwYWQ3ZDY0ZThkOWU0Y2M5MTY=

但两者应该是一样的。c# 是正确的,我也希望在 php 代码中也一样。

标签: c#php

解决方案


来自PHP 文档hash

hash ( string $algo , string $data , bool $binary = false ) : string|false

binary
   当设置为 true 时,输出原始二进制数据。false 输出小写十六进制。

您没有为 传递值$binary,因此它返回一串十六进制字符。

HashAlgorithm.ComputeHash另一方面是二进制数据的 C#方法。

由于您对结果进行 base64 编码,因此您可能期望哈希函数返回二进制数据。因此,您需要true作为 的值传递$binary

$signature = base64_encode(hash('sha512', $utf, true));

推荐阅读