ما هي scrypt؟

‏scrypt هي دالة لتجزئة كلمات المرور، أو دالة لاشتقاق المفاتيح، صمّمها Colin Percival عام 2009 ونُشرت ضمن RFC 7914. ومثل bcrypt وArgon2، فهي بطيئة عمدًا، بحيث تكلّف كل محاولة تخمين المهاجم وقتًا. كما أنها تتطلب قدرًا كبيرًا من الذاكرة: إذ تملأ كل عملية تجزئة كتلة كبيرة من الذاكرة ثم تقرؤها بترتيب غير متوقع، ما يجعل كسرها باستخدام وحدات معالجة الرسوميات والشرائح المخصصة أعلى تكلفة بكثير. تُستخدم scrypt لتخزين كلمات المرور في العديد من أُطر عمل الويب، وفي المكتبات القياسية لـ Node.js وPython وGo، وفي محافظ العملات المشفرة مثل مخازن مفاتيح Ethereum.

وصف الأداة

تُجزّئ هذه الأداة كلمة المرور باستخدام scrypt في متصفحك. تبدأ بقيمة salt عشوائية والإعدادات التي توصي بها OWASP لتخزين كلمات المرور، ويمكنك تغيير قيمة salt والتكلفة (N) وحجم الكتلة (r) والتوازي (p) وطول المفتاح. تكون قيمة التجزئة جاهزة بصيغة PHC لاستخدامها مع مكتبات كلمات المرور، وبصيغتي HEX وBase64 لاستخدامها في الشيفرات التي تخزّن قيمة salt والمعلمات بصورة مستقلة.

الميزات

  • تجزئة كلمة مرور باستخدام scrypt وفقًا لما هو محدد في RFC 7914
  • إنشاء قيمة salt عشوائية بطول 16 بايت، مع زر لإنشاء قيمة جديدة
  • استخدام قيمة salt من اختيارك لإعادة إنتاج تجزئة أُنشئت في مكان آخر
  • ضبط التكلفة (N) من 2⁴ إلى 2²⁰، وحجم الكتلة (r)، والتوازي (p)، وطول المفتاح
  • عرض قيمة التجزئة بصيغ PHC وHEX وBase64
  • عرض تقدم عمليات التجزئة البطيئة والتحذير عندما تتطلب الإعدادات أكثر من 1 GiB من الذاكرة
  • العمل في متصفحك، بحيث لا تغادر كلمة المرور جهازك أبدًا

المعلمات

المعلمة القيمة الافتراضية وظيفتها
التكلفة (N) 131072 (2¹⁷) عدد كتل الذاكرة. مضاعفتها تضاعف الوقت والذاكرة.
حجم الكتلة (r) 8 حجم كل كتلة، 128 × r بايت. ويؤثر أيضًا في الوقت والذاكرة.
التوازي (p) 1 عدد العمليات المستقلة. يضاعف الوقت، لا الذاكرة.
طول المفتاح 32 بايت طول قيمة التجزئة.

الذاكرة المطلوبة هي 128 × N × r بايت، أي 128 MiB باستخدام القيم الافتراضية.

تنسيقات الإخراج

تتضمن سلسلة PHC كل ما يلزم للتحقق من كلمة المرور لاحقًا: الخوارزمية والمعلمات وقيمة salt وقيمة التجزئة، وتكون قيمة salt وقيمة التجزئة بترميز Base64 دون حشو:

$scrypt$ln=17,r=8,p=1$<salt>$<hash>

‏ln هو لوغاريتم N للأساس 2، لذا فإن ln=17 تعني أن N = 131072. هذا هو التنسيق الذي تقرأه مكتبة passlib في Python وحزمة scrypt في Rust وحزمة @phc/scrypt في Node.js وتكتب فيه.

لا يحتوي حقلا HEX وBase64 إلا على قيمة التجزئة، كما تُرجعها crypto.scrypt في Node.js وhashlib.scrypt في Python وscrypt.Key في Go. خزّن قيمة salt والمعلمات إلى جانبها.

آلية العمل

تُقرأ قيمة salt كنص وتُرمّز باستخدام UTF-8، تمامًا كما يحدث عند تمرير قيمة salt نصية إلى crypto.scrypt في Node.js. تتكون قيمة salt العشوائية من 16 بايتًا عشوائيًا مكتوبة على هيئة 32 محرفًا سداسيًا عشريًا، وهذه المحارف الـ32 هي قيمة salt التي تُجرى عليها التجزئة. وتُرمّز كلمة المرور باستخدام UTF-8 أيضًا. تُحسب قيمة التجزئة في سلسلة مهام خلفية، كي تظل الصفحة سريعة الاستجابة، وتبدأ العملية من جديد عند تغيير أي مُدخل.

نصائح

  • استخدم قيمة salt عشوائية جديدة لكل كلمة مرور. فكلمة المرور نفسها مع قيمة salt نفسها تعطي دائمًا قيمة التجزئة نفسها.
  • توصي OWASP باستخدام قيم لا تقل عن N = 2¹⁷ وr = 8 وp = 1 لتخزين كلمات المرور. ارفع N إلى أعلى قيمة يستطيع خادمك تحمّلها لكل عملية تسجيل دخول.
  • يقيّد Node.js استخدام scrypt بذاكرة قدرها 32 MiB افتراضيًا. مرّر قيمة maxmem أعلى إلى crypto.scrypt عند استخدام N = 2¹⁷ أو أكثر مع r = 8.
  • للتحقق من قيمة تجزئة من نظام آخر، أدخل كلمة المرور نفسها وقيمة salt نفسها والمعلمات نفسها، ثم قارن النتائج.