Definizione esatta di Sec-Websocket-Key nel protocollo Websocket

1

Mi chiedo quale sia la definizione esatta del campo di intestazione Sec-Websocket-Key .

Il campo viene utilizzato per le connessioni Websocket. Il client chiede al server di aggiornare da HTML a Websocket. La richiesta può essere simile a questa:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

Il campo Sec-WebSocket-Key è definito come segue [RFC6455] :

The |Sec-WebSocket-Key| header field is used in the WebSocket opening handshake. It is sent from the client to the server to provide part
of the information used by the server to prove that it received a
valid WebSocket opening handshake. This helps ensure that the server does not accept connections from non-WebSocket clients (e.g., HTTP
clients) that are being abused to send data to unsuspecting WebSocket servers.

The |Sec-WebSocket-Key| header field MUST NOT appear more than once in an HTTP request.

E anche in [RFC6455] :

For this header field, the server has to take the value (as present
in the header field, e.g., the base64-encoded [RFC4648] version minus any leading and trailing whitespace) and concatenate this with the
Globally Unique Identifier (GUID, [RFC4122]) "258EAFA5-E914-47DA-
95CA-C5AB0DC85B11" in string form, which is unlikely to be used by
network endpoints that do not understand the WebSocket Protocol. A
SHA-1 hash (160 bits) [FIPS.180-3], base64-encoded (see Section 4 of
[RFC4648]), of this concatenation is then returned in the server's
handshake. Concretely, if as in the example above, the |Sec-WebSocket-Key| header field had the value "dGhlIHNhbXBsZSBub25jZQ==", the server would concatenate the string "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" to form the string "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA- C5AB0DC85B11". The server would then take the SHA-1 hash of this, giving the value 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea. This value is then base64-encoded (see Section 4 of [RFC4648]), to give the value
"s3pPLMBiTxaQ9kYGzzhZRbK+xOo=". This value would then be echoed in the |Sec-WebSocket-Accept| header field.

Ho compreso perfettamente lo scopo di questo campo. Tuttavia, non riesco a trovare alcuna informazione su come esattamente viene generato .

Probabilmente non è solo una stringa casuale con lunghezza casuale e un set di caratteri casuale.

    
posta thesys 28.12.2015 - 15:15
fonte

1 risposta

1

Sec-WebSocket-Key è una stringa completamente casuale con una lunghezza di 16 byte e ha un intervallo consentito di valori ASCII da 32 a 127.

Si inizia con una stringa vuota. Quindi, finché si genera un carattere compreso nell'intervallo ASCII da 32 a 127, si aggiunge a questa stringa.

Una volta raggiunti 16 caratteri ASCII, interrompi e base64 codifica la stringa risultante.

    
risposta data 04.03.2018 - 06:31
fonte

Leggi altre domande sui tag