مقارنة بايتات المفتاح
جزء من قسم المصادقة والأمان في رحلة Node.js على Coddy. الدرس 5 من 24.
يمكن لكائني Buffer مختلفين أن يحتويا على البايتات نفسها. إن مقارنتهما باستخدام === تتحقق من هوية الكائن، لا من تطابق محتوى البايتات. بالنسبة إلى المفاتيح السرية، استخدم timingSafeEqual. قد تؤدي المقارنة بايتًا بايتًا التي تتوقف عند أول اختلاف إلى تسريب معلومات عبر توقيتها. تستخدم هذه الدالة مقارنة للبايتات بزمن ثابت؛ ويجب أن يتجنب باقي كود تسجيل الدخول تسريبات التوقيت أيضًا.
const same = token.length === savedToken.length
&& timingSafeEqual(token, savedToken);يهم فحص الطول لأن timingSafeEqual تطلق خطأً عند اختلاف الطولين. يتجاوز تعبير && المقارنة عندما يختلف الطولان. يحوّل لك الكود الابتدائي السلاسل السداسية العشرية المقدمة إلى كائنات Buffer. ركّز على إرجاع نتيجة منطقية. في تسجيل دخول كامل بكلمة مرور، تُشتق أولًا قيمة المفتاح المُحاوَل، ثم تُجرى هذه المقارنة.
التحدي
سهلهذا مشروع تدريبي صغير. إعداد المشروع مُجهّز؛ عدّل exercise.js فقط.
أعِد {"same":true} عندما يحتوي كلٌّ من given وexpected على بايتات متساوية، وإلا فأعِد false. إرسال {"given":"abcd","expected":"abcd"} باستخدام POST إلى /result يعيد true. تغيير given إلى abce أو ab يعيد false دون حدوث استثناء. المدخلات قيم سداسية عشرية صالحة.
استخدم نتيجة 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 };
}
جميع دروس المصادقة والأمان
1كلمات المرور
البايتات والنص الست عشرياشتقاق مفتاح كلمة المرورقيمة Salt جديدةلا تخزّن كلمات المرور أبدًامقارنة بايتات المفتاحالتحقق من كلمة المرورقواعد التسجيلتدرّب بنفسك: Playground لـ Express