キーのバイト列を比較する
CoddyのNode.jsジャーニー「認証とセキュリティ」セクションの一部。レッスン 5/24。
2 つの異なる Buffer オブジェクトが同じバイト列を保持している場合があります。これらを === で比較すると、一致するバイト列ではなくオブジェクトの同一性がチェックされます。秘密鍵には timingSafeEqual を使用してください。最初の不一致で停止するバイト単位の比較は、処理時間を通じて情報を漏らす可能性があります。この関数は一定時間でバイト比較を行いますが、ログインコードの残りの部分でもタイミング情報の漏えいを防ぐ必要があります。
const same = token.length === savedToken.length
&& timingSafeEqual(token, savedToken);長さのチェックが重要なのは、長さが異なると timingSafeEqual が例外をスローするためです。&& 式は、長さが異なる場合に比較をスキップします。スターターコードでは、渡された 16 進文字列を Buffer にデコードしてあります。真偽値の結果を返すことに集中してください。完全なパスワードログインでは、まず入力されたキーを導出してから、この比較を行います。
チャレンジ
簡単これは小規模な練習プロジェクトです。セットアップは用意されているので、編集するのは exercise.js だけです。
given と expected に同じバイト列が入っている場合は {"same":true} を返し、それ以外の場合は false を返してください。{"given":"abcd","expected":"abcd"} を /result に POST すると、true が返ります。given を abce または ab に変更した場合は、例外を発生させずに false が返ります。入力は有効な16進数です。
バイト長を確認した後に、インポートした timingSafeEqual の結果を使用してください。エンコードされた文字列や Buffer の同一性を比較することは、ここで練習する安全な操作ではありません。
自分で試してみよう
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 };
}
認証とセキュリティのすべてのレッスン
自分で練習してみよう: Expressプレイグラウンド