طرق التشفير في قواعد البيانات MySQL

السلام عليكم ورحمة الله وبركاته

إستكمالاً لما بدأت به حول التعامل مع قواعد البيانات MySQL اليوم أريد أن أوضح كيفية حفظ البيانات مشفرة بداخل القواعد MySQL … أي كيف نقوم مثلاً بعمل جدول خاص بالمستخدمين وكل مستخدم تكون الكلمة السرية له مشفرة …

هناك ثلاث طرق أو بالأحرى موضوعي يركز على الثلاث طرق والتي هي:
الأولى بإستعمال التشفير (أو Hash) المعروفة MD5
الثانية بإستعمال التشفير (أو Hash) المعروفة SHA1
الثالثة بإستعمال التشفير AES، حيث يستعمل 128 بت.

ملاحظة: هناك طرق أخرى ولكن موضوعي يشرح الثلاث طرق أعلاه فقط …

الآن لنرى كيف نقوم بعمل ذلك … سنبدأ مع طريقة MD5 … قم بالبداية بإنشاء جدول على أن يكون حجم حقل الكلمة السرية بـ 32 حرف/رمز/رقم، كما يلي:

CREATE TABLE user_md5 (username VARCHAR(16), password VARCHAR(32));

قمنا بعمل جدول يتكون من حقلين، حقل يخص اسم المستخدم وحقل يخص الكلمة السرية له …
الآن لنقوم بإضافة بيانات تجريبية له، مثلاً أسم مستخدم binary وكلمة سرية له ولتكن binary أيضاً … نقوم بذلك كالآتي:

mysql> INSERT INTO user_md5 VALUES ('binary',MD5('binary') );
Query OK, 1 row affected (0.03 sec)

كما تلاحظون أستعملنا الدالة MD5 عند إدخالنا للكلمة السرية، وذلك لكي يتم تشفيرها بواسطة MD5

الآن لنقوم بعرض المدخلات وهل تم تشفيرها أم لا، نفذ الأمر التالي:

mysql> SELECT * FROM user_md5 where username = 'binary' AND password=MD5('binary');
+-----------+----------------------------------+
| username | password                         |
+-----------+----------------------------------+
| binary    | 9d7183f16acce70658f686ae7f1a4d20 | 
+-----------+----------------------------------+
1 row in set (0.02 sec)

كما تلاحظون تمت عملية التشفير للكلمة السرية binary الى الرموز 9d7183f16acce70658f686ae7f1a4d20 حسب خوارزمية الـ MD5 التي أستعملناها …

الآن لنقوم بتجربة الـ SHA1 بنفس الطريقة … لنقم بإنشاء الجدول ولنسميه هذه المرة user_sha1 ويجب أن نحدد حجم حقل الكلمة السرية بـ 40 حرف/رمز/رقم، كما في الأمر:

mysql> CREATE TABLE user_sha1 (username VARCHAR(16), password VARCHAR(40));
Query OK, 0 rows affected (0.00 sec)

الآن لنقوم بإضافة المستخدم binary والكلمة السرية binary أيضاً كما يلي:

mysql> INSERT INTO user_sha1 VALUES ('binary',SHA1('binary') );
Query OK, 1 row affected (0.00 sec)

كما تلاحظون هذه المرة حين قمنا بإدخال الكلمة السرية، أستعملنا الدالة SHA1، وذلك لكي يتم تشفيرها بواسطة SHA1

الآن لنقوم بعرض المدخلات وهل تم تشفيرها أم لا، نفذ الأمر التالي:

mysql> SELECT * FROM user_sha1 where username = 'binary' AND password=SHA1('binary');
+----------+------------------------------------------+
| username | password                                 |
+----------+------------------------------------------+
| binary   | 7e57cfe843145135aee1f4d0d63ceb7842093712 | 
+----------+------------------------------------------+
1 row in set (0.00 sec)

الآن لنقوم بتجربة الـ AES بنفس الطريقة … لنقم بإنشاء الجدول ولنسميه هذه المرة user_aes ويجب أن نحدد هذه المرة نوع الحقل على إنه من نوع BLOB، كما في الأمر:

mysql> create table user_aes (username VARCHAR(16), password BLOB);
Query OK, 0 rows affected (0.00 sec)

الآن عند إضافة حقل الى الجدول الخاص بـ AES سنقوم بإستعمال كلمة سرية ومفتاح سري لكي نستعمله بعملية التشفير … أذن لنقوم بإضافة المستخدم binary والكلمة سرية له binary والمفتاح الخاص به my_string_key، من خلال الأمر التالي:

mysql> INSERT INTO user_aes VALUES ('binary',AES_ENCRYPT('binary','my_string_key') );
Query OK, 1 row affected (0.00 sec)

كما تلاحظون هذه المرة حين قمنا بإدخال الكلمة السرية، أستعملنا الدالة AES_ENCRYPT، وذلك لكي يتم تشفيرها بواسطة AES

الآن لنقوم بعرض المدخلات وهل تم تشفيرها أم لا، نفذ الأمر التالي:

mysql> SELECT * FROM user_aes WHERE username='binary' AND password=AES_ENCRYPT('binary','my_string_key');
+-----------+------------------+
| username | password         |
+-----------+------------------+
| binary    | N�lu-�/�T��p�o�> | 
+-----------+------------------+
1 row in set (0.00 sec)

ملاحظات:
– يوجد دالة AES_DECRYPT قوموا بتجربتها لإستعادة الكلمة السرية المشفرة …
– إذا كانت MySQL تم إعدادها للعمل مع SSL فإنه يمكننا إستعمال الخوارزمية DES لتشفير الكلمة السرية بواسطة مفتاح الـ SSL … جاري العمل عليها وربما أكتب عنها في المستقبل …

المراجع: الأول، الثاني

نراكب في تجارب أخرى
هذا ما لدي ودمتم بود

6 thoughts on “طرق التشفير في قواعد البيانات MySQL

  1. أعتقد أنه لا يمكن استعادة البيانات المشفرة بكل من (MD5, SHA1), لذا تسمى تلكما الطرقتان بعثرة البيانات (data hashing).
    إلا أنه لا يزال بإمكانك مقارنة البيانات بهما, مثل مقارنة كلمة السر المدخلة بتلك المخزنة في قاعدة البيانات باستعمال استعلام من هذا القبيل:
    select … from … where password_stored=MD5(password_entered)

    select … from … where password_stored=SHA1(password_entered)

  2. أهلا أخوي لؤي فرج الله …
    نعم كلامك سليم و 100% … أنا ذكرت بإنه الـ MD5 هي فعلياً Hash ولكن يبدو الأخرى سقطت سهواً ::18

    سيتم التعديل والإضافة …

    مشكور يا لؤي على المرور والإضافة … ولا تحرمنا من طلاتك هذي ::20

  3. السلام عليكم أبو محمد تسلم أخوي على الشرح

    بالنسبه لأخي لؤي فرج الله :: حبيت أضيف شي أخي الحبيب

    صحيح إن كلامك مظبوط بس زمان
    الهاش أو ما اخترعوه كان يسمى One Way Function لكن الأن بسبب سرعه المعالجة و تقدم البرمجه أصبح الهاش يكسر بطريقه الماقارنة (أي مقارنة النواتج) فكما ذكرت هو يستخدم لكي نقارن هاش كلمة السر الجديده بكلمه السر الصحيحه فأيضا يستخدمون في كسره نفس الطريقه

    شكرا لإضافتك أخوي لؤي و سلمت يا يداك يا دكتورنا

  4. وعليكم السلام ورحمة الله وبركاته
    حياك الله أخوي صبري وشكراً لمرورك وإضافتك الجميلة …
    دمت بود ::20

  5. وعليكم السلام ورحمة الله وبركاتة،

    لماذا استخدمت حقل من نوع BLOB عند التشفير باستخدام AES؟ وأيضاً ما مدى إمكانية فك (بدون معرفة المفتاح) تشفيرة AES 128bit؟

    جزاك الله خيراً والإخوه على الإضافات..

  6. ويجزيك الخير أهلا أخي ShockShadow …
    أرجع أخي الى المرجع الأول الذي وضعته يوجد في أسفل جدول الدوال ملاحظات أقراهم … هم السبب في إستعمال BLOB … أما مدى إمكانية كسر هذه الطريقة فلا استطيع أن أعطيك جواب دقيق 100% ولكن هي قابلة للكسر ولكن تعتمد على الأجهزة التي ستستعملها والى آخره …
    لا يوجد خوارزمية تشفير لا يمكن كسرها يا طيب …
    دمت بود …

Comments are closed.