[SOLVED] Текст на 20 символов после base64 декодирования, как? Помогите пожалуйста

Protey

Client
Регистрация
09.01.2016
Сообщения
208
Благодарностей
29
Баллы
28
Доброго время суток, помогите пожалуйста получить текст на 20 символов
Надо получить текст именно на 20 символов, из 258EAFA5-E914-47DA-95CA-C5AB0DC85B11
На habrahabr написано цитирую:
  1. Конкатенация ключа клиента и предустановленного GUID. По документации GUID является следующей строкой: «258EAFA5-E914-47DA-95CA-C5AB0DC85B11». Предположим, что ключ клиента мы уже извлекли и храним в переменной $key (не забудьте убрать лидирующие и конечные пробелы, если они каким-то образом попали в переменную)
    $hash = $key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
  2. Вычисление sha1 от полученной строки, причем результат должен быть в виде двоичной строки из 20 символов.
    $hash = sha1($hash,true);
  3. И последнее — кодирование хеша методом base64
    $hash = base64_encode($hash);
А как это сделать, я не знаю.
 
Последнее редактирование:

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113
В Директивы using дописать
C#:
using System.Security.Cryptography;
Потом в экшн "Свой C#", добавляем след. код:
C#:
string result = String.Empty;

using (SHA1Managed sha1 = new SHA1Managed())
{
  string value = project.Variables["key"].Value + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
  byte[] b_key = Encoding.UTF8.GetBytes(value);
   
  var hash = sha1.ComputeHash(b_key);
  result = Convert.ToBase64String(hash);
}

return result;
До того как вызвать этот код в проекте должна быть объявлена переменная key, в которой должны быть данные (какие точно я не могу сказать, т.к. не сильно вникал в суть проблемы).

20-ти символьная строка получается на втором этапе, после конвертации в Base64 длина может отличаться.

P.S. ЗП под рукой нет, поэтому код не тестировал.
 
Последнее редактирование:
  • Спасибо
Реакции: Protey

Protey

Client
Регистрация
09.01.2016
Сообщения
208
Благодарностей
29
Баллы
28
До того как вызвать этот код в проекте должна быть объявлена переменная key, в которой должны быть данные (какие точно я не могу сказать, т.к. не сильно вникал в суть проблемы).
По идее, исходя из логики, в переменной должно быть это значение «258EAFA5-E914-47DA-95CA-C5AB0DC85B11», НО, результат получается на 28 символов, а надо на 20
 

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 820
Баллы
113
В предыдущем своем посте сделал несколько ошибок, сейчас его подправил.
Почему именно 20? Откуда эта цифра?

в переменной должно быть это значение «258EAFA5-E914-47DA-95CA-C5AB0DC85B11»
Нет. Я в предыдущем сообщении допустил ошибку и не дописал важную часть логики (сейчас уже исправил это). Так вот, в переменной key должно быть значение, которое клиент (браузер) передаёт серверу в заголовке Sec-WebSocket-Key. WikiPidea говорит, что
client sends a Sec-WebSocket-Key header containing base64-encoded random bytes
т.е. клиент отправляет случайные байты, закодированные в base64. Далее, сервер складывает строку, которую отправил клиент и строку - «258EAFA5-E914-47DA-95CA-C5AB0DC85B11». На основе этой новой строки вычисляется SHA1 хэш (бинарный (двоичный) хэш, который как раз и состоит из 20 символов). Потом данный хэш кодируется с помощью base64 и результат отправляется назад клиенту в заголовке Sec-WebSocket-Accept.

Для чего всё это делается? Может, если я буду видеть конечную цель, мне будет легче помочь. Код, который я привёл в предыдущем сообщении, делает именно то, что описывает алгоритм с хабра в стартпосте.
 

Protey

Client
Регистрация
09.01.2016
Сообщения
208
Благодарностей
29
Баллы
28
Для чего всё это делается?
В общем проблема в том что я не знаю(не могу, не понимаю) как получить заголовки от websocket через стандартный экшен GET, через браузер все нормально вижу в Network что и где, а через зенку кукиш...
урл с параметрами гет запроса выглядит так https://site.ru:2096/socket.io/?{-Variable.userid_nodePassword-}&EIO=3&transport=websocket&sid= Тут, как я понимаю значение от Sec-WebSocket-Accept, а раз оно берется из «258EAFA5-E914-47DA-95CA-C5AB0DC85B11», и должен быть, как в цитате из первого поста, на 20 символов.
Тут я создавал тему http://zennolab.com/discussion/threads/est-li-raznica-mezhdu-get-post-zaprosami-na-c-i-ehkshenom.44839/, там писал, что в скайпе, в чате зеннолаб мне ответили что надо использовать xNet, а как....это для меня уже сверх возможное

в переменной key должно быть значение, которое клиент (браузер) передаёт серверу в заголовке Sec-WebSocket-Key
еще бы понять где взять это значение которое клиент (браузер) передает серверу в заголовке Sec-WebSocket-Key, не в самом браузере то понятно как это значение получить, а вот как получить в зенке через экшен запроса вот тут не понятно, т.к. экшен запроса зенки его не дает))
 
Последнее редактирование:

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