Если хеш .net sha1 ожидает байтовый массив, а php sha1 () хочет строку, могу ли я сопоставить результаты? - PullRequest
2 голосов
/ 05 марта 2009

У меня есть набор байтов, к которым я хочу применить хэш sha1. Один хеш будет в .net, другой в PHP. Затем я проверю, совпадают ли они.

В .net вы можете создать байтовый массив и использовать sha.ComputeHash ().

byte[] data = new byte[DATA_SIZE];
byte[] result; 

SHA1 sha = new SHA1CryptoServiceProvider(); 
// This is one implementation of the abstract class SHA1.
result = sha.ComputeHash(data);

В PHP вы вызываете sha1 ($ string).

Я ничего не могу поделать со стороной .net кода, но как мне получить тот же хеш из PHP, который генерирует .net?

Обратите внимание: я могу работать ТОЛЬКО на стороне PHP. Материал .net исправлен и не может быть изменен. Спасибо!

Ответы [ 3 ]

5 голосов
/ 05 марта 2009

Поскольку SHA1 является распространенным стандартным алгоритмом, он реализован в PHP так же, как и в .NET. Единственная отличающаяся часть - это то, как вы вызываете две функции.

Технически, SHA1 определяется на байтах, а не на строках, но (поправьте меня, если я ошибаюсь) строки PHP работают с однобайтовыми символами, поэтому байты и символы должны быть взаимозаменяемыми с точки зрения алгоритма SHA1. *

Вы должны будете убедиться, что значение вашей строки в двоичном формате совпадает с байтовым массивом .NET, в том же порядке. Я не парень по PHP, поэтому вам придется получить ответ другого человека, как это сделать.

1 голос
/ 05 марта 2009

Похоже, что функция sha1 принимает байтовый массив в шестнадцатеричном формате. Таким образом, если бы у вас было два байта, FA и A1, ваша строка была бы "FAA1".

Затем вы должны проанализировать строку результата обратно в байты и сравнить с выводом .NET.

Обратите внимание, что вы можете легко создать эту строку в .NET с тем же форматом (используйте формат "x2" при вызове ToString для каждого байта и добавляйте все вместе).

0 голосов
/ 24 ноября 2009

Это работает для меня:

string str = user.Salt + pepper + password;
SHA1 sha1 = new SHA1CryptoServiceProvider();
ASCIIEncoding encoder = new ASCIIEncoding();
byte[] input = encoder.GetBytes(str);
byte[] hash = sha1.ComputeHash(input);
string hashStr = "";
for (int i = 0; i < hash.Length; i++)
     hashStr += hash[i].ToString("X").ToLower();
if (hashStr != user.Hash)
     return false;
...