PHP в C# несколько строк

Aleksey575

Client
Регистрация
21.03.2020
Сообщения
30
Благодарностей
6
Баллы
8
Здравствуйте. Есть образец генерации токена на php, не знаю как реализовать это на c#
C#:
// Token generation
$timestamp = time();
$uri = "https://www.google.com";
$password = "hfgfy565764gfgfQ";

$security_token = sha1($timestamp.$uri.$password);
На выходе нужно получить две переменных: timestamp и security_token
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 761
Благодарностей
2 401
Баллы
113
Здравствуйте. Есть образец генерации токена на php, не знаю как реализовать это на c#
C#:
// Token generation
$timestamp = time();
$uri = "https://www.google.com";
$password = "hfgfy565764gfgfQ";

$security_token = sha1($timestamp.$uri.$password);
На выходе нужно получить две переменных: timestamp и security_token
C#:
string time = DateTime.UtcNow.ToString();
string uri = "https://www.google.com";
string password = "hfgfy565764gfgfQ";

string data = string.Join(string.Empty, new[]{ time, uri, password});
string security_token  = string.Empty;
using (var sha1 = new System.Security.Cryptography.HMACSHA1()) {
  var b = sha1.ComputeHash(Encoding.UTF8.GetBytes(data));
  security_token = BitConverter.ToString(b).Replace("-", "").ToLower();
}

project.SendInfoToLog(time);
project.SendInfoToLog(security_token);
return security_token;
Результат в логе такой:
Код:
    23:33:06     04.08.2021 20:33:06
    23:33:06     d04d3f2b5e3fb30a226fd29690c913cf2d9e5f2f
 
  • Спасибо
Реакции: Sanekk, doc и Ilshakin

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
631
Благодарностей
542
Баллы
93
C#:
var time = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds();
project.Variables["security_token"].Value = string.Join("", (new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(time + uri + password))).Select(x => x.ToString("X2")).ToArray()).ToLower();
 

Aleksey575

Client
Регистрация
21.03.2020
Сообщения
30
Благодарностей
6
Баллы
8
C#:
string time = DateTime.UtcNow.ToString();
string uri = "https://www.google.com";
string password = "hfgfy565764gfgfQ";

string data = string.Join(string.Empty, new[]{ time, uri, password});
string security_token  = string.Empty;
using (var sha1 = new System.Security.Cryptography.HMACSHA1()) {
  var b = sha1.ComputeHash(Encoding.UTF8.GetBytes(data));
  security_token = BitConverter.ToString(b).Replace("-", "").ToLower();
}

project.SendInfoToLog(time);
project.SendInfoToLog(security_token);
return security_token;
Результат в логе такой:
Код:
    23:33:06     04.08.2021 20:33:06
    23:33:06     d04d3f2b5e3fb30a226fd29690c913cf2d9e5f2f

php генерирует время в таком формате: 1628111108
Я подправил первую строку, но почему то токен не подходит, не пойму в чём может быть причина.
C#:
string time = Convert.ToString((int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds);
string uri = "https://www.google.com";
string password = "hfgfy565764gfgfQ";

string data = string.Join(string.Empty, new[]{time,uri,password});
string security_token  = string.Empty;
using (var sha1 = new System.Security.Cryptography.HMACSHA1()) {
  var b = sha1.ComputeHash(Encoding.UTF8.GetBytes(data));
  security_token = BitConverter.ToString(b).Replace("-", "").ToLower();
}

project.SendInfoToLog(time);
project.SendInfoToLog(security_token);


project.Variables["time"].Value = time;
project.Variables["token"].Value = security_token;
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 761
Благодарностей
2 401
Баллы
113
php генерирует время в таком формате: 1628111108
Я подправил первую строку, но почему то токен не подходит, не пойму в чём может быть причина.
C#:
string time = Convert.ToString((int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds);
string uri = "https://www.google.com";
string password = "hfgfy565764gfgfQ";

string data = string.Join(string.Empty, new[]{time,uri,password});
string security_token  = string.Empty;
using (var sha1 = new System.Security.Cryptography.HMACSHA1()) {
  var b = sha1.ComputeHash(Encoding.UTF8.GetBytes(data));
  security_token = BitConverter.ToString(b).Replace("-", "").ToLower();
}

project.SendInfoToLog(time);
project.SendInfoToLog(security_token);


project.Variables["time"].Value = time;
project.Variables["token"].Value = security_token;
Может там обычное время, а не UtcNow. По идее должно работать.
Или предоставьте данные, которые подаете в php, укажите что приходит на выходе - посмотрим.
 
Последнее редактирование:

Aleksey575

Client
Регистрация
21.03.2020
Сообщения
30
Благодарностей
6
Баллы
8
Может там обычное время, а не UtcNow. По идее должно работать.
Или предоставьте данные, которые подаете в php, укажите что приходит на выходе - посмотрим.
Проверял какое время генерирует php, там именно такой формат 1628111108
У меня php этот на сервере, и с помощью get запроса включаю его и забираю эти два параметра, подставляю их в пост запрос, для следующих запросов к сайту и все работает.
Хотелось бы избавится от этого лишнего действия и генерировать токен в зенке, естественно при тестировании вашего кода я подставляю нужный пароль и url, визуально c# генерирует похожий security_token,
но при post запросе, сайт возвращает ошибку: не верный security_token
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
есть разные алгоритмы. значит там не HMACSHA1 используется
попробуй SHA1CryptoServiceProvider

C#:
// y1 = "2jmj7l5rSw0yVb/vlWAYkK/YBwk=" (seems correct)
var f1 = new SHA1CryptoServiceProvider();
string y1 = Convert.ToBase64String(f1.ComputeHash(new byte[] { }));

// y2 = "+9sdGxiqbAgyS31ktx+3Y3BpDh0=" (seems wrong)
HMAC f2 = HMACSHA1.Create();
f2.Key = new byte[]{};
string y2 = Convert.ToBase64String(f2.ComputeHash(new byte[] { }));
 
  • Спасибо
Реакции: Aleksey575 и BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 761
Благодарностей
2 401
Баллы
113
есть разные алгоритмы. значит там не HMACSHA1 используется
попробуй SHA1CryptoServiceProvider

C#:
// y1 = "2jmj7l5rSw0yVb/vlWAYkK/YBwk=" (seems correct)
var f1 = new SHA1CryptoServiceProvider();
string y1 = Convert.ToBase64String(f1.ComputeHash(new byte[] { }));

// y2 = "+9sdGxiqbAgyS31ktx+3Y3BpDh0=" (seems wrong)
HMAC f2 = HMACSHA1.Create();
f2.Key = new byte[]{};
string y2 = Convert.ToBase64String(f2.ComputeHash(new byte[] { }));
Надо, чтобы в php подали данные например 1 2 3 - получили токен.
Предоставили нам значения 1 - 2 - 3 и полученный результат и только в этом случае мы сможем понять правильный ли мы код пишем - иначе как нам узнать, смогли мы угадать с алгоритмом или нет? Нужен пример валидных входящих данных и пример реальных исходящих данных.
 
  • Спасибо
Реакции: Aleksey575

Aleksey575

Client
Регистрация
21.03.2020
Сообщения
30
Благодарностей
6
Баллы
8
Надо, чтобы в php подали данные например 1 2 3 - получили токен.
Предоставили нам значения 1 - 2 - 3 и полученный результат и только в этом случае мы сможем понять правильный ли мы код пишем - иначе как нам узнать, смогли мы угадать с алгоритмом или нет? Нужен пример валидных входящих данных и пример реальных исходящих данных.
Хорошо, сделал статичное время. Вот как генерирует токен php:
PHP:
// Token generation
$timestamp = "1628168527";
$uri = "https://www.google.com";
$password = "hfgfy565764gfgfQ";

$security_token = sha1($timestamp.$uri.$password);

var_dump($security_token);
Ответ: 66a62f09c4d53c64d007db3c3f69c2fdf77b89c4


Вот то что генерирует C# с теми же входными данными:
C#:
string time = "1628168527";
string uri = "https://www.google.com";
string password = "hfgfy565764gfgfQ";

string data = string.Join(string.Empty, new[]{time,uri,password});
project.SendInfoToLog(data);
string security_token  = string.Empty;
using (var sha1 = new System.Security.Cryptography.HMACSHA1()) {
  var b = sha1.ComputeHash(Encoding.UTF8.GetBytes(data));
  security_token = BitConverter.ToString(b).Replace("-", "").ToLower();
}

project.SendInfoToLog(time);
project.SendInfoToLog(security_token);
Ответ: f814d6277e38754abce9ece1b52eb12f0e640549
Причём C# при повторном перезапуске постоянно генерирует разные токены, при тех же входных параметрах.
 

Aleksey575

Client
Регистрация
21.03.2020
Сообщения
30
Благодарностей
6
Баллы
8
есть разные алгоритмы. значит там не HMACSHA1 используется
попробуй SHA1CryptoServiceProvider

C#:
// y1 = "2jmj7l5rSw0yVb/vlWAYkK/YBwk=" (seems correct)
var f1 = new SHA1CryptoServiceProvider();
string y1 = Convert.ToBase64String(f1.ComputeHash(new byte[] { }));

// y2 = "+9sdGxiqbAgyS31ktx+3Y3BpDh0=" (seems wrong)
HMAC f2 = HMACSHA1.Create();
f2.Key = new byte[]{};
string y2 = Convert.ToBase64String(f2.ComputeHash(new byte[] { }));
Тут я к сожалению не могу разобраться, мне бы полностью готовый код.
 

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
631
Благодарностей
542
Баллы
93

Aleksey575

Client
Регистрация
21.03.2020
Сообщения
30
Благодарностей
6
Баллы
8
Последнее редактирование:

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
631
Благодарностей
542
Баллы
93

Aleksey575

Client
Регистрация
21.03.2020
Сообщения
30
Благодарностей
6
Баллы
8
Спасибо! Всё работает :-)
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)