27-01-22, 11:22 AM
(26-01-22, 12:38 PM)عبدالله الدوسري كتب : بما انك تستخدم SQL DATABASE 2019شكرا اخي الكريم
استخدم الطريقة :
HashAlgorithm.ComputeHash
أولاً تقوم بتحويل النص العادي (والتي هي كلمة المرور) : تحويلها من نص ( String ) إلى مصفوفة بايتات ( ()Byte )
كود :
Dim PasswordData As Byte() = System.Text.Encoding.UTF8.GetBytes(Me.PasswordTextBox.Text)
ثانياُ : تنشاء متغير باسم ( SHA512 ) من نوع ( System.Security.Cryptography.SHA512Managed )
وذلك لإستخدام خوارزمية HashAlgorithm ( لتشفير البيانات في إتجاه واحد فقط غير قابل لفك التشفير )
كود :
Dim SHA512 As New System.Security.Cryptography.SHA512Managed
ثالثاً : نستخدم المتغير SHA512 لتشفير البيانات الموجودة في المصفوفة ( PasswordData ) وحفظها في متغير جديد باسم ( PasswordHash )
كود :
Dim PasswordHash As Byte() = SHA512.ComputeHash(PasswordData)
إذا كان صندوق النص ( Me.PasswordTextBox.Text ) يحمل القيمة ( vb4arb.com )
أي ان كلمة المرور = vb4arb.com
بعد عملية التشفير بواسطة الطريقة ComputeHash
النتيجة ستكون كالتالي : وذلك بعد التشفير
لاحظ ان النص الموجود بالأسفل يعبر عن شكل البيانات الموجودة في المصفوفة المشفرة
ولكن المصفوفة المشفرة أساساً ليسة بهذا الشكل ( قمت بتحويلها إلى نص وذلك حتى تتمكن من أخذ فكرة عن شكل الناتج )
كود :
45b6deacb27a617b889f1396da586270a131082c5ad83a9cd916aa72b07c296a43f33290aa9548f9d1b7fbbf169092ca8a25251ea461e688985451d5f8d77d39
******************************************************************************
الطريقة المستخدمة لعرض شكل المصفوفة بشكل نصي : ( هذا النص البرمجي فقط لشرح شكل المصفوفة وغير مطلوب ,, تم إستخدامة فقط لعرض القيمة الموجودة بالأعلى)
كود :
Dim txt As String = BitConverter.ToString(PasswordHash).Replace("-", "")
******************************************************************************
الآن قم بحفظ قيمة المتغير ( PasswordHash ) والذي يحمل مصفوفة البيانات بعد التشفير
قم بحفظ القيمة في حقل قاعدة البيانات الخاص بكلمة المرور
ويكون نوع الحقل في قاعدة البيانات من نوع ( varbinary ) حصراً
الآن انت تمتلك كلمة مرور محفوظة في قاعدة البيانات ومشفرة ولا يمكن أبداً فك تشفيرها ( لأنها مشفرة بطريقة تشفير بإتجاه واحد )
إتجاه واحد يعني تشفير فقط ولا يمكن فك التشفير
بإتجاهين يعني تشفير ويمكن فك التشفير بالعكس
ماذا يمكنك الآن ان تفعل بهذا الحقل ؟؟؟؟
فقط يمكنك إستخدامة للمقارنة فقط
أي بمعنى :
إذا أردت ان تتحقق من صحة كلمة المرور الذي أدخلها المستخدم ( وذلك لعملية تسجيل الدخول للبرنامج مثلاً )
الخطوات كالتالي :
كلمة المرور الصحيحة محفوظة في قاعدة البيانات بشكل مشفر ( تمام )
الآن يحاول المستخدم تسجيل الدخول للبرنامج :
بعد أن يقوم المستخدم بإدخال كلمة المرور
1 - تقوم بإعادة كل الخطوات المذكورة بالأعلى مع كلمة المرور الذي قام المستخدم بإدخالها
إذا كانت نتيجة الإستعلام صفر ( لم يتم إرجاع اي سجل Row )كود :
Dim PasswordData As Byte() = System.Text.Encoding.UTF8.GetBytes(Me.PasswordTextBox.Text)
Dim SHA512 As New System.Security.Cryptography.SHA512Managed
Dim PasswordHash As Byte() = SHA512.ComputeHash(PasswordData)
هذا يعني ( الرسالة المشهورة ) :
" اسم المستخدم أو كلمة المرور غير صحيحة "
الآن انت تمتلك كلمة مرور مشفرة ( التي يحاول المستخدم الآن إستخدامها لتسجيل الدخول )
لعملية التحقق من صحة كلمة المرور المدخلة
تقوم بإرسال اسم المستخدم مع ( كلمة المرور المشفرة ) إلى قاعدة البيانات في إجراء مخزن مثلاً وعمل إستعلام عادي
إذا قام الإستعلام بإرجاع نتيجة لك ( هذا يعني أنه وجد اسم المستخدم وكلمة المرور متطابقة ) والنتيجة عبارة عن سجل واحد ( Row ) ناتج من عملية الإستعلام
كود :
SELECT Username FROM [dbo].[UsersTable]
WHERE [Username] = @UserName AND [Password] = @Password
تتم المقارنة بين كلمات المرور وهي في حالت التشفير
إذا تطابقت ( كلمة المرور المشفرة المدخلة ) مع ( كلمة المرور المشفرة الموجودة في قاعدة البيانات )
إذا دخلت على ( SQL Server 2019 ) وعند عرضك للجدول في قاعدة البيانات
في الإستعلامات سيظهر الحقل بهذا الشكل
في وضح التحرير سيظهر الحقل بهذا الشكل ( لأنه لا يمكنك تحرير حقل من نوع مصفوفة بشكل يدوي )
هذة الطريقة الأأمن والأقوى المستخدمة في أغلب المواقع على شبكة الانترنت لحفظ كلمات المرور
أتمنى الفكرة تكون واضحة
الطريقة التي ابحث عنها سهلة جدا وهيا تشغيل كود في sql فقط
Query
كود لتشفير كلمة السر
وكود للعكس لاظهار كلمة السر
هذا الكود يشتغل علي كافة المستخدمين بالجدول
