c# - 将 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 代码中也一样。
解决方案
来自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));
推荐阅读
- css - 当父级绝对定位时,在 Firefox 中浮动左错误?
- javascript - 从 SELECT 流式传输结果以同时运行多个 UPDATES
- ansible - 如何在下一个要执行的任务中检查 uri 状态
- r - 如何在 R 中加速 excel 的 write.xlsx 进程
- python - Python如何在迭代字典时通过键访问返回元组
- python - 日期时间模块的问题
- python - 函数调用中的正式函数参数后跟 **kwargs
- vba - VBA ms 访问删除表单过滤器
- reactjs - async/await 在 Chrome 中不可调试
- visual-studio - Visual Studio:刷新“查找所有引用”结果