كلمة مرورك ليست مجرد سلسلة نصية: لماذا تتطلب المصادقة في C# نهجًا خاصًا
\n\nتخيل: لقد كتبت تطبيق C# مثاليًا - بواجهة جميلة، واستعلامات سريعة، وهندسة نظيفة. ولكن إذا كانت المصادقة فيه ضعيفة، فكل العمل يذهب سدى. لا يخترق القراصنة الأبواب - بل يلتقطون المفاتيح. وفي العالم الحديث، المصادقة الآمنة في C# ليست خيارًا، بل هي النظافة الأساسية للكود.
\n\nفي هذه المقالة، سنناقش ليس فقط النظرية، بل طرق الحماية الفعلية: من التجزئة الصحيحة لكلمات المرور إلى تطبيق JWT و OAuth. ستتعرف على لماذا SHA256 بدون ملح هو شر، وكيف لا تقع في فخ هجمات التخمين، وماذا تفعل إذا كان مشروعك قد تجاوز طرق المصادقة "الأولية". هيا بنا!
\n\nأركان الأمان الثلاثة: التجزئة، الملح، والخوارزميات البطيئة
\n\nأكثر نمط معادي شيوعًا للمبتدئين هو تخزين كلمات المرور بنص واضح أو استخدام MD5 العادي. حتى لو كان لديك "مجرد مشروع تعليمي"، فإن العادة تترسخ. المصادقة الآمنة في C# تبدأ بثلاث قواعد:
\n\n- \n
- لا تخزن كلمات المرور بنص واضح أبدًا. حتى في قاعدة البيانات المحلية. \n
- استخدم الملح (salt) - سلسلة عشوائية لكل مستخدم. \n
- اختر خوارزميات بطيئة - BCrypt، PBKDF2، Argon2. \n
لماذا "بطيئة"؟ لأن المخترق يحتاج إلى تجربة مليارات التركيبات في الثانية. إذا استغرقت التجزئة 0.1 ثانية، يصبح الهجوم غير مربح اقتصاديًا.
\n\nالتجزئة الصحيحة لكلمات المرور في C# باستخدام BCrypt
\n\nBCrypt هو المعيار الذهبي لمطوري .NET. هو يولد الملح بنفسه ويضمنه في التجزئة. لست بحاجة لتخزين الملح بشكل منفصل.
\n\nقم بتثبيت الحزمة عبر NuGet:
\nInstall-Package BCrypt.Net-Next\n\nالآن مثال لتسجيل المستخدم:
\n\nusing BCrypt.Net;\n\npublic class AuthService\n{\n public string HashPassword(string plainPassword)\n {\n // Work factor = 12 — التوازن الأمثل بين السرعة والأمان\n return BCrypt.HashPassword(plainPassword, workFactor: 12);\n }\n\n public bool VerifyPassword(string plainPassword, string hashedPassword)\n {\n return BCrypt.Verify(plainPassword, hashedPassword);\n }\n}\n\n// الاستخدام:\nvar auth = new AuthService();\nstring hash = auth.HashPassword("MyS3cur3P@ss!");\nbool isValid = auth.VerifyPassword("MyS3cur3P@ss!", hash); // true\n\nلاحظ: workFactor (عامل التكلفة) يحدد عدد مرات تكرار التجزئة التي سيتم تنفيذها. 12 قيمة جيدة لعام 2024. إذا كان خادمك قويًا، يمكن رفعه إلى 13-14.
PBKDF2 — أداة .NET المدمجة
\n\nإذا كنت لا تريد مكتبات خارجية، استخدم Rfc2898DeriveBytes - وهو تطبيق PBKDF2 المدمج في .NET. مثال:
using System.Security.Cryptography;\n\npublic static string HashWithPBKDF2(string password, byte[] salt, int iterations = 100_000)\n{\n using var deriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.SHA256);\n byte[] hash = deriveBytes.GetBytes(32); // 32 بايت = 256 بت\n return Convert.ToBase64String(salt) + ":" + Convert.ToBase64String(hash);\n}\n\n// توليد الملح (16 بايت)\nbyte[] salt = RandomNumberGenerator.GetBytes(16);\nstring result = HashWithPBKDF2("userPassword", salt);\n\nهام: لا تستخدم أقل من 100,000 تكرار. وحدات معالجة الرسوميات الحديثة يمكنها تجربة ملايين التجزئات في الثانية.
\n\nJWT — المصادقة الحديثة بدون جلسات
\n\nعندما ينمو تطبيق C# الخاص بك ليصبح خدمات مصغرة أو SPA (React، Vue)، يصبح تخزين الجلسات على الخادم غير مريح. هنا تأتي JSON Web Tokens (JWT) - رموز وصول مدمجة ومكتفية ذاتيًا.
\n\nالمصادقة الآمنة في C# مع JWT تُبنى على ثلاثة مبادئ:
\n- \n
- ت