Zhivko Kabaivanov Ответов: 1

Php SHA256 отличается от C#


Я пытаюсь хэшировать массив байтов в PHP, но он отличается от функции C# ComputeHash

Входной байтовый массив:
10 241 161 2 121 5 228 157 20 19 2 7

Ожидаемый результат (от С#):
91 110 159 77 220 148 223 78 194 210 64 197 147 127 162 229 47 142 1 130 47 252 238 232 126 74 108 91 241 253 242 31
Hash value: 5B6E9F4DDC94DF4EC2D240C5937FA2E52F8E01822FFCEEE87E4A6C5BF1FDF21F

Результат от PHP:
398d3d7037eff6ed07ce7d39799a1c9abc240b59a07f79e64acfd36cbcfee422


Что я уже пробовал:

Код C# :
byte[] byteArray = new byte[] {10, 241, 161, 2, 121, 5, 228, 157, 20, 19, 2, 7};
byte[] hashedBytes = algorithm.ComputeHash(byteArray);

PHP-код:
$arr = array(10,241,161,2,121,5,228,157,20,19,2,7);
$original = implode("", $arr);
hash('sha256', $original);

1 Ответов

Рейтинг:
5

Wastedtalent

Это происходит потому, что вы не хэшируете одно и то же, в PHP вы превращаете его в строку с помощью implode. Например, если вы также превратите его в строку в c#, то получите тот же результат, что и в php:

using System;
using System.Security.Cryptography;	
using System.Text;

public class Program
{
	public static void Main()
	{
		 using (SHA256 sha256Hash = SHA256.Create())
        {
		string str = "1024116121215228157201927";
		byte[] hashedBytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(str));
			 
			 for (int i = 0; i < hashedBytes.Length; i++)
        {
            Console.Write(hashedBytes[i].ToString("x2"));
        }
		 }
	}
}


И

<?php

$arr = array(10,241,161,2,121,5,228,157,20,19,2,7);
$original = implode("", $arr);
echo(hash('sha256', $original));

?>


Как дать
6d615f5fd3e0a50c05520bccdb048f6fa4e2ae90788bda2379364d6cd1dcc707


CPallini

5.