Opensslは無効なWebソケットセキュリティコードを生成します。

Opensslは無効なWebソケットセキュリティコードを生成します。

GAWKにWebソケットサーバーを作成する必要があります。サーバーは、RFCの次のアルゴリズムを介してユーザーのSec-WebSocket-Keyを処理する必要があります。

  1. キーを次に関連付けます。258EAFA5-E914-47DA-95CA-C5AB0DC85B11
  2. sha-1のバイナリ形式を使用します(20個の記号が必要です)。
  3. バイナリ形式からbase64を取得する

opensslを使用しようとしたときに生成されたコードが正しくありません。

$ openssl sha1 -binary <<< 'a0+ZvgYqsMFHRerif0go8g==258EAFA5-E914-47DA-95CA-C5AB0DC85B11' | openssl base64
mYryklMdRrrLwrMQDeKEzOVMMWk=

一方、次のPHPコードは有効な出力を生成します。

$key = "a0+ZvgYqsMFHRerif0go8g==";
$hash = $key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; 
$hash = sha1($hash,true);
$hash = base64_encode($hash); 
echo($hash);

tswGtNOxrRhDmC04XQaDigMeaJA=

私は何が間違っていましたか?

答え1

ここで、文字列コンストラクタは与えられた<<<…文字列を提供します。改行文字を追加コマンドへの入力として。だからそれopenssl sha1 -binary <<< 'a0+ZvgYqsMFHRerif0go8g==258EAFA5-E914-47DA-95CA-C5AB0DC85B11'

printf '%s\n' 'a0+ZvgYqsMFHRerif0go8g==258EAFA5-E914-47DA-95CA-C5AB0DC85B11' | openssl sha1 -binary

ただし、お客様の仕様には「258EAFA5-E914-47DA-95CA-C5AB0DC85B11と改行とキーの接続」ではなく、「258EAFA5-E914-47DA-95CA-C5AB0DC85B11とのキー接続」と記載されています。だからあなたは必要です

printf '%s' 'a0+ZvgYqsMFHRerif0go8g==258EAFA5-E914-47DA-95CA-C5AB0DC85B11' | openssl sha1 -binary

これが起こりましたtswGtNOxrRhDmC04XQaDigMeaJA=

echo -n …一部のシェルがバックスラッシュエスケープや拡張をprintf %s …サポートしておらず、代わりに標準の動作(常に引数を文字通り印刷)を持つことを除いて同じです。echo -necho …printf %s …

関連情報