Как сгенерировать рукопожатие веб-сокета из Lua?

Существует ли функция для генерации ключа ответа сервера в Lua? Вот решение в python: проблема рукопожатия websocket

У меня есть два захваченных ключевых числа, подсчитаны пробелы, захвачена третья строка, и я надеюсь, что все остальное лежит в существующей функции...


person Community    schedule 19.02.2012    source источник


Ответы (2)


Если вам нужно более старое рукопожатие (протокол 0), вы можете использовать следующий код, чтобы получить значение рукопожатия из двух ключей:

md5 = require 'md5'

function getnumbers(str)
    local num = ""
    str:gsub('%d', function(d) num = num .. d end)
    return tonumber(num)
end
function countspaces(str)
    return select(2, str:gsub(' ', ' '))
end
function to32bitint(i)
    return string.char(i/256^3 % 256, i/256^2 % 256, i/256 % 256, i % 256)
end
function websocketresponse(key1, key2, end8)
    local n1, s1 = getnumbers(key1), countspaces(key1)
    local n2, s2 = getnumbers(key2), countspaces(key2)
    local cat = to32bitint(n1/s1) .. to32bitint(n2/s2) .. ending8
    return md5.sum(cat)
end

websocket_key1 = "18x 6]8vM;54 *(5:  {   U1]8  z [  8"
websocket_key2 = "1_ tx7X d  <  nw  334J702) 7]o}` 0"
ending8 = "Tm[K T2u"
print(websocketresponse(websocket_key1, websocket_key2, ending8))
--> fQJ,fN/4F4!~K~MH

Это дает то же значение, что и в примере, приведенном в проекте протокола. В этом примере используется библиотека MD5 для вычисления контрольной суммы. ://code.google.com/p/luaforwindows/" rel="nofollow">LuaForWindows.

Реализация для протокола WebSocket версии 6 намного проще:

crypto = require 'crypto'
mime = require 'mime'

function websocketresponse6(key)
    local magic = key .. "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
    return (mime.b64(crypto.digest('sha1', magic, true)))
end 

key6 = "x3JJHMbDL1EzLkh9GBhXDw=="
print(websocketresponse6(key6))
--> HSmrc0sMlYUkAGmm5OPpG2HaGWk=

В этом примере используется LuaCrypto для суммы SHA1 и MIME из LuaSocket.

person Michal Kottman    schedule 19.02.2012
comment
Я использую Lua в приложении Windows. В дистрибутив не входит крипто (или математический оператор %, но math.mod работает так, что эта часть разрешается). Есть ли обходной путь, если у вас нет криптовалюты? Safari и Mobile Safari используют старый протокол 0. - person ; 19.02.2012
comment
Я не знаю, какой дистрибутив Lua вы используете, но думаю, что это Lua для Windows. Он содержит скомпилированную библиотеку MD5, я обновлю код для нее. - person Michal Kottman; 19.02.2012
comment
У меня тоже нет библиотеки md5. Я не уверен, как добавить его с интерпретатором, доступным только в приложении. (Я попросил разработчика добавить любую библиотеку.) Я могу исправить это (только потому, что понимаю эту часть), но ни str:gsub('%d', function(d) num = num .. d end) и select(2, str:gsub(' ', ' ')) будут выполняться внутри приложения... - person ; 19.02.2012
comment
Какую версию Lua вы используете? Это должно работать в Lua 5.1, который существует с начала 2006 года. А пока вы можете попробовать это: string.gsub(str, '%d', ...) и local _,n = string.gsub(str, ' ', ' '); return n - person Michal Kottman; 19.02.2012
comment
Затем используйте предоставленный мной код (я только что изменил str:gsub(... на string.gsub(str,... и заменил вызов select эквивалентным кодом Lua). Если у вас нет модуля для MD5 и вы не можете скомпилировать библиотеки, вы можете найти чистые реализации Lua MD5 в этот ответ. - person Michal Kottman; 19.02.2012
comment
давайте продолжим это обсуждение в чате - person ; 20.02.2012

Взгляните на реализацию lua-websockets. . Вот материал sha1.

person lipp    schedule 05.11.2013