So sánh các byte của khóa
Thuộc phần Xác thực và bảo mật trong hành trình Node.js của Coddy. Bài học 5 trên 24.
Hai đối tượng Buffer khác nhau có thể chứa cùng các byte. So sánh chúng bằng === sẽ kiểm tra danh tính đối tượng, chứ không kiểm tra nội dung byte có khớp nhau hay không. Với khóa bí mật, hãy dùng timingSafeEqual. Phép so sánh từng byte và dừng ở điểm khác biệt đầu tiên có thể làm lộ thông tin qua thời gian thực thi. Hàm này so sánh byte trong thời gian hằng định; phần còn lại của code đăng nhập cũng cần tránh rò rỉ thời gian.
const same = token.length === savedToken.length
&& timingSafeEqual(token, savedToken);Việc kiểm tra độ dài rất quan trọng vì timingSafeEqual sẽ phát sinh lỗi nếu hai độ dài khác nhau. Biểu thức && bỏ qua phép so sánh khi độ dài không khớp. Phần code khởi đầu sẽ giải mã các chuỗi hex được cung cấp thành Buffer cho bạn. Hãy tập trung vào việc trả về kết quả kiểu boolean. Khi đăng nhập bằng mật khẩu đầy đủ, trước tiên hệ thống sẽ tạo khóa từ mật khẩu được nhập, sau đó thực hiện phép so sánh này.
Thử thách
DễĐây là một dự án luyện tập nhỏ. Phần thiết lập đã có sẵn; chỉ chỉnh sửa exercise.js.
Trả về {"same":true} khi given và expected chứa các byte giống nhau, nếu không thì trả về false. Gửi {"given":"abcd","expected":"abcd"} bằng POST đến /result sẽ trả về true. Đổi given thành abce hoặc ab sẽ trả về false mà không gây lỗi. Đầu vào là các giá trị hex hợp lệ.
Dùng kết quả của timingSafeEqual sau khi kiểm tra độ dài byte. So sánh các chuỗi đã mã hóa hoặc danh tính của Buffer không phải là thao tác bảo mật đang được luyện tập.
Tự làm thử
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 };
}
Tất cả bài học trong Xác thực và bảo mật
1Mật khẩu
Byte và văn bản hexTạo khóa từ mật khẩuSalt mớiKhông bao giờ lưu mật khẩuSo sánh các byte của khóaKiểm tra mật khẩuQuy tắc đăng ký2Phiên làm việc và cookie
Ghi nhớ bằng cookieTra cứu phiênPhiên đăng nhậpĐịnh tuyến sau khi đăng nhậpTự luyện tập: Playground Express