web-dev-qa-db-ja.com

opensslは無効なWebSocketセキュリティコードを生成します

GAWKでWebSocketサーバーを作成する必要があります。また、サーバーは次のアルゴリズム(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
vladimirg

Here文字列構文<<<…は、コマンドへの入力として、指定された文字列および改行をフィードします。したがって、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 -nをサポートしないシェル、またはecho …でバックスラッシュエスケープを展開するシェルがある点が異なりますが、printf %s …の動作は標準です。 (常に引数を文字通りに出力します)。