Comment puis-je générer une poignée de main websocket de Lua?
Question
Y at-il une fonction existante pour générer la clé de réponse du serveur dans Lua? Voici la solution en python: websocket problème handshake
J'ai les deux chiffres clés capturés, les espaces comptés, la troisième chaîne capturée et en espérant que les mensonges de repos dans une fonction existante ...
La solution
Si besoin la poignée de main plus (protocole 0), vous pouvez utiliser le code suivant pour obtenir la valeur de prise de contact des deux touches:
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
Ce produit la même valeur que l'exemple donné dans le projet de protocole . Cet exemple utilise la bibliothèque MD5 pour calculer la somme de contrôle et est disponible compilé dans LuaForWindows
La mise en œuvre pour la version du protocole WebSocket 6 est beaucoup plus simple:
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=
Cet exemple utilise le LuaCrypto somme SHA1 et MIME de luasocket.
Autres conseils
Jetez un oeil à la mise en œuvre lua-websockets . Voici le SHA1 choses .