Openssl gera código de segurança websocket inválido

1

Eu preciso escrever o servidor websocket no GAWK. E o servidor deve manipular o Sec-WebSocket-Key do usuário seguindo o algoritmo (do RFC):

  1. Chave de concatenação com 258EAFA5-E914-47DA-95CA-C5AB0DC85B11
  2. Tome sha-1 em formato binário (deve ter 20 símbolos)
  3. Tome base64 desse formulário binário

Estou tentando usar o openssl, mas o código resultante está incorreto:

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

Enquanto isso, o seguinte código PHP gera uma saída válida:

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

tswGtNOxrRhDmC04XQaDigMeaJA =

O que estou fazendo de errado?

    
por izoomko 19.12.2015 / 13:41

1 resposta

0

A construção da string aqui <<<… alimenta a string dada mais uma nova linha como entrada para o comando. Então, openssl sha1 -binary <<< 'a0+ZvgYqsMFHRerif0go8g==258EAFA5-E914-47DA-95CA-C5AB0DC85B11' é equivalente a

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

Mas sua especificação diz “Chave de concatenação com 258EAFA5-E914-47DA-95CA-C5AB0DC85B11”, não “Tecla de concatenação com 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 e uma nova linha”. Então você precisa de

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

e isso produz tswGtNOxrRhDmC04XQaDigMeaJA= .

echo -n … é equivalente a printf %s … , exceto que há shells que não suportam echo -n ou que expandem escape de barras invertidas em echo … , enquanto printf %s … tem um comportamento padrão (sempre imprime o argumento literalmente) .

    
por 20.12.2015 / 00:41