Menu
CoddyTech

Comparando bytes da chave

Parte da seção Autenticação e segurança do Journey de Node.js da Coddy. Lição 5 de 24.

Dois objetos Buffer diferentes podem conter os mesmos bytes. Compará-los com === verifica a identidade dos objetos, não se os bytes correspondem. Para chaves secretas, use timingSafeEqual. Uma comparação byte a byte que para na primeira divergência pode vazar informações por meio do tempo de execução. Essa função usa uma comparação de bytes em tempo constante; o restante do código de login também deve evitar vazamentos de tempo.

const same = token.length === savedToken.length
    && timingSafeEqual(token, savedToken);

A verificação do comprimento é importante porque timingSafeEqual gera um erro quando os comprimentos são diferentes. A expressão && ignora a comparação quando os comprimentos diferem. O código inicial decodifica as strings hexadecimais fornecidas em Buffers para você. Concentre-se em retornar um resultado booleano. Um login completo com senha primeiro deriva a chave tentada e, em seguida, realiza essa comparação.

challenge icon

Desafio

Fácil

Este é um pequeno projeto de prática. A configuração já está pronta; edite apenas exercise.js.

Retorne {"same":true} quando os bytes fornecidos e esperados forem iguais; caso contrário, retorne false. Enviar POST com {"given":"abcd","expected":"abcd"} para /result retorna true. Alterar given para abce ou ab retorna false sem gerar erro. As entradas são hexadecimais válidas.

Use o resultado de timingSafeEqual após verificar os comprimentos em bytes. Comparar strings codificadas ou identidades de Buffer não é a operação segura praticada aqui.

Experimente você mesmo

import { timingSafeEqual } from 'node:crypto';
export function exercise(input) {
    const given = Buffer.from(input.given, 'hex');
    const expected = Buffer.from(input.expected, 'hex');
    return { same: given === expected };
}

Todas as lições de Autenticação e segurança

Pratique por conta própria: Playground de Express