У меня есть следующий код PHP:
$stringToHash = "10123456789"."2014:11:25-15:42:00"."20.00"."826"."sharedsecret";
echo($stringToHash);
// outputs:
// 101234567892014:11:25-15:42:0020.00826sharedsecret
$ascii = bin2hex($stringToHash);
echo($ascii);
// outputs:
// 3130313233343536373839323031343a31313a32352d31353a34323a303032302e3030383236736861726564736563726574
$sha = sha1($ascii);
echo($sha);
// outputs:
// 847aa9da32c54ed8bb9183007336f5762a62ef20
Вот эквивалентный код C #:
var stringToHash = "10123456789" + "2014:11:25-15:42:00" + "20.00" + "826" + "sharedsecret";
Console.WriteLine(stringToHash);
// outputs:
// 101234567892014:11:25-15:42:0020.00826sharedsecret
var bytes = Encoding.ASCII.GetBytes(stringToHash);
var hexString = BitConverter.ToString(bytes).Replace("-", string.Empty);
Console.WriteLine(hexString);
// outputs:
// 3130313233343536373839323031343A31313A32352D31353A34323A303032302E3030383236736861726564736563726574
SHA1 sha = new SHA1CryptoServiceProvider();
var password = sha.ComputeHash(bytes);
var result = BitConverter.ToString(password).ToLower().Replace("-", string.Empty);
Console.WriteLine(result);
// outputs:
// c8069048623d6b98a08454e43e1a02a42cf7d61d
var hexStringBytes = Encoding.ASCII.GetBytes(hexString);
var hexStringPassword = sha.ComputeHash(hexStringBytes);
var hexStringResult = BitConverter.ToString(hexStringPassword).ToLower().Replace("-", string.Empty);
Console.WriteLine(hexStringResult);
// outputs:
// bd857ca08446001f7182fbbbd41e747abe302a87
Первые два выхода одинаковы. Исходные строки идентичны, как и шестнадцатеричные массивы ASCII после преобразования, но sha1 () в PHP дает мне другой результат .NET SHA1CryptoServiceProvider. Если я преобразую этот вывод в строку и снова хеширую, результат также будет другим.
В .net объект должен быть в форме байтового массива, прежде чем вы сможете создать из него хеш SHA, и я не понимаю, что мне нужно преобразовать в байтовый массив для получения того же вывода, что и код PHP ,
Это проблематично, так как сторонний сервис, который я публикую, использует версию PHP для проверки объекта на их конце, а моя программа написана на .net. Я мог бы написать посредника на PHP и передать через него, но я действительно не хочу этого делать.
Любое понимание того, почему эти два дают разные результаты? Спасибо
Это сделает это. Вдохновленный этим сообщение и вопрос, на который я наткнулся 2 дня назад и не могу найти.
public string HashItThePHPWay(string hashMe)
{
var sha = new SHA1CryptoServiceProvider();
string b64 = ByteArrayToString(Encoding.ASCII.GetBytes(hashMe));
var b64Bytes = Encoding.ASCII.GetBytes(b64);
var result = sha.ComputeHash(b64Bytes);
return BitConverter.ToString(result).Replace("-", "").ToLower();
}
public static string ByteArrayToString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
{
hex.AppendFormat("{0:x2}", b);
}
return hex.ToString().ToLower();
}
Других решений пока нет …