Pergunta

I'm using the following keys to calculate the correct handshake response string:
Key1: 18x 6]8vM;54 *(5: { U1]8 z [ 8
Key2: 1_ tx7X d < nw 334J702) 7]o}` 0
Key3: 54:6d:5b:4b:20:54:32:75

I've calculated Key1 and Key2's values:
Key1: 0947fa63 (hex)
Key2: 0a5510d3

However I'm not sure on what to do next, from what I can gather, you concatenate them and MD5 it, but that doesn't seem to work out i.e. MD5 hashing: 0947fa630a5510d3546d5b4b20543275

Help!

Foi útil?

Solução

This is the python code for creating the response hash:

from hashlib import md5
import struct
....
hashed = md5(struct.pack('>II8s', num1, num2, key3)).digest()

In the example num1 and num2 are the numeric values of key1 and key2. key3 is the actual textual string (raw bytes) received.

The struct.pack() call is using big endian mode (for the numeric values) and packing them 4 bytes for each number followed by the 8 byte key3 string (bytes).

See the Documentation for the python struct module.

The C version would look more like this:

/* Pack it big-endian */
buf[0] = (num1 & 0xff000000) >> 24;
buf[1] = (num1 & 0xff0000) >> 16;
buf[2] = (num1 & 0xff00) >> 8;
buf[3] =  num1 & 0xff;

buf[4] = (num2 & 0xff000000) >> 24;
buf[5] = (num2 & 0xff0000) >> 16;
buf[6] = (num2 & 0xff00) >> 8;
buf[7] =  num2 & 0xff;

strncpy(buf+8, headers->key3, 8);
buf[16] = '\0';

md5_buffer(buf, 16, target);
target[16] = '\0';

md5_buffer is in glibc.

For further reference you can look at working implementations (where the above code came from) of websockify (disclaimer: I wrote websockify).

Outras dicas

Here's my version:

https://github.com/boothead/stargate/blob/master/stargate/handshake.py#L104

If you use stargate then all of that nasty stuff is done for you :-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top