Openssl이 잘못된 웹소켓 보안 코드를 생성합니다.

Openssl이 잘못된 웹소켓 보안 코드를 생성합니다.

GAWK에 웹소켓 서버를 작성해야 합니다. 서버는 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 …

관련 정보