0

Java で websocket サーバーを構築しようとしていますが、問題があります... websockets の仕様では、key1 と key2 の数字を連結してから、余分な 8 バイトのデータを '... 128 ビットの文字列を形成し、その MD5 サムは、サーバーがハンドシェイクを読み取ったことを証明するために使用されます。

key1 の例は 155712099 です key2 の例は 173347027 です 8 バイトの余分なデータの例は Tm[K T2u

'155712099173347027Tm[K T2u' は 26 バイトであり、本来あるべき 16 バイト (128 ビット) ではありません! ここで何が欠けていますか?

Websocket に関するすべてを「取得」できますが、この小さな部分はここにあります。

4

2 に答える 2

1

key1とkey2が32ビット整数の場合、文字列表現ではなく、それぞれの表現をそれぞれ4バイトとして連結する必要があります。

于 2010-11-17T03:17:23.837 に答える
1

key1とkey2を、32ビットの数値ではなく数字の文字列として使用しています。

たとえば、16進数の32ビット数としての155712099は、0x63、0xfa、0x47、0x09(0x947fa63)です。それはあなたが望むものです。key1およびkey2文字列を符号なし整数に変換してから、それらの4バイトをターゲットバイト配列の位置0(key1の場合)および位置4(key2の場合)にパックする必要があります。

155712099を数字の文字列として使用すると、16進値が0x31、0x35、0x35、0x37、0x31、0x32、0x30、0x39、0x39の9バイトの文字列になります。一方、位置8から始まるターゲットバイト配列に余分なバイトを直接パックする必要があります。これにより、16バイト長のターゲットバイト配列が得られます。

ハンドシェイクは、WebSocketサーバーに対するさまざまなタイプの攻撃を阻止するために、さまざまなデータ要素をさまざまなデータタイプとして意図的に操作していることに注意してください。

于 2010-11-17T05:06:14.687 に答える