我一直在努力,试图获得一个C#相当于一个PHP API,我得到的错误消息是无效的哈希值,所以我决定拆分代码并检查PHP和C#的单独部分的输出。 下面是我的了:如何从C#中获得相同的PHP哈希值
代码和出把PHP参考的:
$ref = time().mt_rand(0,9999999);
----Out put as at the time it was tested----
14909496966594256
在对裁判我的C#代码如下:
string refl = (DateTime.UtcNow .Subtract(new DateTime(1970, 1, 1, 0, 0, 0, 0))).TotalSeconds + rnd.Next(0, 9999999).ToString();
----Out put as at the time it was tested----
1490602845.686821282389
PHP的散列出同放以下变量如下:
$task = 'pay';
$merchant_email_on_voguepay = '[email protected]';
$ref = '14909496966594256';
$command_api_token = '9ufkS6FJffGplu9t7uq6XPPVQXBpHbaN';
$hash = hash('sha512',$command_api_token.$task.$merchant_email_on_voguepay.$ref);
----Out put ----
1cee97da4c0b742b6d5cdc463914fe07c04c6aff8d999fb7ce7aaa05076ea17577752ecf8947e5b98e7305ef09e0de2fed73e4817d906d6b123e54c1f9b15e74
然后C#输出使用相同的变量iables和相同的PHP裁判出来把
const string task = "Pay";
const string command_api_token = "9ufkS6FJffGplu9t7uq6XPPVQXBpHbaN";
const string merchant_email_on_voguepay = "[email protected]";
Random rnd = new Random();
string refl = "14909496966594256";
string hash_target = (command_api_token + task + merchant_email_on_voguepay + refl);
SHA512 sha512 = new System.Security.Cryptography.SHA512Managed();
var bytes = UTF8Encoding.UTF8.GetBytes(hash_target);
string cryString = BitConverter.ToString(sha512.ComputeHash(bytes));
string hashD = (cryString).Replace("-", string.Empty).ToLower();
----Out put ----
551b057b64f49fc6bd7d428a8e3c36ddaab5e468fd5f9042ad5d4a4fa50349e5312ad2097b4e46d1e74a5a3f4e843848352edb0ea7073dd1cd53b1c4c14ab286
在这里,我发现了就把我的C#是从PHP的不同。所以我的代码可能会出现什么问题,我想用相同的变量来获得与php相同的结果。
任何解决此问题的好主意都是值得欢迎的。
您不能在两个不同的地方同时生成相同的随机数。 –
以及php:'mt_rand'(一个mersenne twister类型生成器)和Microsoft.NET'Random',一个基于Knuth-subtractive的例程并不完全相同。这意味着即使使用相同的种子,它们也不会创建相同的序列。两者都不推荐用于密码学,因为它们太可预测。 – dlatikay