Menu
CoddyTech

השוואת בתי המפתח

חלק מהיחידה אימות ואבטחה במסלול ה-Node.js של Coddy. שיעור 5 מתוך 24.

שני אובייקטים שונים מסוג Buffer יכולים להכיל את אותם בתים. השוואה ביניהם באמצעות === בודקת אם מדובר באותו אובייקט, ולא אם תוכן הבתים זהה. עבור מפתחות סודיים, השתמשו ב-timingSafeEqual. השוואה בית אחר בית שנעצרת באי-ההתאמה הראשונה עלולה לדלוף מידע דרך התזמון שלה. הפונקציה הזאת משתמשת בהשוואת בתים בזמן קבוע; גם שאר קוד הכניסה חייב להימנע מדליפות תזמון.

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

בדיקת האורך חשובה, משום ש-timingSafeEqual זורקת שגיאה כשהאורכים שונים. הביטוי && מדלג על ההשוואה כשהאורכים אינם זהים. קוד ההתחלה מפענח עבורכם את מחרוזות ההקסדצימליות שסופקו והופך אותן ל-Buffers. התמקדו בהחזרת תוצאה בוליאנית. בתהליך כניסה מלא באמצעות סיסמה, קודם גוזרים את המפתח שנוסה, ואז מבצעים את ההשוואה הזאת.

challenge icon

אתגר

קל

זהו פרויקט תרגול קטן. ההגדרות שלו מסופקות; יש לערוך רק את exercise.js.

יש להחזיר {"same":true} כאשר given ו-expected מכילים בתים זהים, ואחרת להחזיר false. שליחת {"given":"abcd","expected":"abcd"} אל /result באמצעות POST מחזירה true. שינוי given ל-abce או ל-ab מחזיר false בלי לזרוק שגיאה. הקלטים הם ערכי hex תקינים.

יש להשתמש בתוצאה של 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 אונליין