اذهب الي المحتوي
أوفيسنا

الردود الموصى بها

قام بنشر

السلام عليكم ورحمة الله وبركاته ، أخواني وأساتذتي ومعلمينا ( دون استثناء )

قمت بتنفيذ فكرة تشفير السجلات في الجداول ، والذي تهدف إلى حماية البيانات من المتطفلين عند محاولتهم استيراد بيانات الجداول . والفكرة تم تطبيقها وإكمالها خلال طرح مشاركة معلمي الفاضل @ابوخليل في رده على أخونا @الحلبي في مشاركة في موضوع سابق . ولكني هنا اعتمدت على الجدول ( EncryptionStatus ) يحتوي حقل واحد ( Status ) من نوع Yes / No لمعرفة حالة التشفير عند تشغيل التطبيق ..


 البرنامج يهدف إلى تنفيذ عملية تشفير و فك تشفير على كافة جداول قاعدة البيانات باستخدام خوارزمية XOR . وتحتوي الأداة على عدة دوال و وظائف تم تقسيمها وتوزيعها بشكل منفصل لتسهيل فهم وصيانة وتعديل الكود حسب الرغبة والحاجة . وبشكل مختصر سأذكر بعض وظائف هذه الدوال تالياً ، ثم ننتقل الى الكود لاحقاً :-

  • الدالة EncryptDecrypt :- هذه الدالة الرئيسية التي تعمل على تشفير أو الغاء التشفير ؛ حيث تستخدم مفتاح التشفير ( المحدد في strKey ) لتطبيق عملية XOR بين البيانات والنص المشفر .
  • الدالة GetAllTables :- هذه الدالة تقوم بإرجاع قائمة بأسماء كل الجداول في قاعدة البيانات الحالية ( طبعاً باستثناء جداول النظام ) .
  • الدالة CheckEncryptionStatus :- هذه الدالة تتحقق من حالة التشفير ، عن طريق التحقق من قيمة الحقل Status في جدول EncryptionStatus . بحيث إذا كانت قيمة الحقل = True ، فإن قاعدة البيانات تكون مشفرة .
  • الدالة EncryptAllTablesIndependently : - تم إضافتها لاستدعائها عند الخلل ( إجراء إحترازي ) .... والعديد من الدوال .

 

كود المديول :-

Option Compare Database
Public Const EnCodeKey As String = "Officna2024"

Public Function EncryptDecrypt(strData As String, strKey As String) As String
    Dim i As Integer
    Dim strResult As String
    Dim keyLen As Integer
    Dim keyValue As Integer
    strResult = ""
    If Len(strKey) = 0 Then
        MsgBox "مفتاح التشفير غير صحيح", vbCritical, ""
        Exit Function
    End If
    keyLen = Len(strKey)
    For i = 1 To Len(strData)
        keyValue = Asc(Mid(strKey, ((i - 1) Mod keyLen) + 1))
        strResult = strResult & Chr(Asc(Mid(strData, i, 1)) Xor keyValue)
    Next i
    EncryptDecrypt = strResult
End Function

Public Function GetAllTables() As Collection
    Dim db As DAO.Database
    Dim tblDef As DAO.TableDef
    Dim tblNames As New Collection
    Set db = CurrentDb
    For Each tblDef In db.TableDefs
        If Left(tblDef.Name, 4) <> "MSys" Then
            tblNames.Add tblDef.Name
        End If
    Next tblDef
    Set GetAllTables = tblNames
End Function

Public Function CheckEncryptionStatus() As Boolean
    On Error GoTo ErrorHandler
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim status As Boolean
    Set db = CurrentDb
    Set rs = db.OpenRecordset("EncryptionStatus", dbOpenDynaset)
    If Not (rs.EOF And rs.BOF) Then
        rs.MoveFirst
        status = rs!status
    Else
        status = False
    End If
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    CheckEncryptionStatus = status
    Exit Function

ErrorHandler:
    MsgBox "لا يمكنك استخدام هذا المشروع في الوقت الحالي", vbCritical, ""
    EncryptAllTablesIndependently EnCodeKey
    DoCmd.Quit
    Exit Function
End Function

Public Sub EncryptAllTablesIndependently(ByVal strKey As String)
    Dim db As DAO.Database
    Dim tblName As Variant
    Dim rs As DAO.Recordset
    Dim fld As DAO.Field
    Dim tblList As Collection
    If Len(strKey) = 0 Then
        MsgBox "مفتاح التشفير غير صحيح", vbCritical, ""
        Exit Sub
    End If
    Set db = CurrentDb
    Set tblList = GetAllTables()
    For Each tblName In tblList
        Set rs = db.OpenRecordset(tblName, dbOpenDynaset)
        If Not (rs.EOF And rs.BOF) Then
            rs.MoveFirst
            Do Until rs.EOF
                For Each fld In rs.Fields
                    If fld.Type = dbText Then
                        rs.Edit
                        rs(fld.Name).Value = EncryptDecrypt(Nz(rs(fld.Name), ""), strKey)
                        rs.Update
                    End If
                Next fld
                rs.MoveNext
            Loop
        End If
        rs.Close
    Next tblName
End Sub

Public Sub SetEncryptionStatus(status As Boolean)
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("EncryptionStatus", dbOpenDynaset)
    If Not (rs.EOF And rs.BOF) Then
        rs.MoveFirst
        rs.Edit
        rs!status = status
        rs.Update
    Else
        rs.AddNew
        rs!status = status
        rs.Update
    End If
    rs.Close
End Sub

Public Sub EncryptOrDecryptTables(ByVal strKey As String, ByVal isEncrypting As Boolean)
    Dim db As DAO.Database
    Dim tblName As Variant
    Dim rs As DAO.Recordset
    Dim fld As DAO.Field
    Dim tblList As Collection
    Dim action As String
    Set db = CurrentDb
    Set tblList = GetAllTables()
    action = IIf(isEncrypting, "تشفير", "فك التشفير")
    For Each tblName In tblList
        Set rs = db.OpenRecordset(tblName, dbOpenDynaset)
        If Not (rs.EOF And rs.BOF) Then
            rs.MoveFirst
            Do Until rs.EOF
                For Each fld In rs.Fields
                    If fld.Type = dbText Then
                        rs.Edit
                        rs(fld.Name).Value = EncryptDecrypt(Nz(rs(fld.Name), ""), strKey)
                        rs.Update
                    End If
                Next fld
                rs.MoveNext
            Loop
        End If
        rs.Close
    Next tblName
    MsgBox "تمت عملية " & action & " بنجاح", vbInformation, ""
End Sub

Public Sub HandleEncryptionOnFormOpen()
    If CheckEncryptionStatus() = True Then
        Call EncryptOrDecryptTables(EnCodeKey, False)
        SetEncryptionStatus False
    End If
End Sub

Public Sub HandleEncryptionOnFormClose()
    If CheckEncryptionStatus() = False Then
        Call EncryptOrDecryptTables(EnCodeKey, True)
        SetEncryptionStatus True
    End If
End Sub

Public Function GetTotalRecordCount() As Long
    Dim db As DAO.Database
    Dim tblDef As DAO.TableDef
    Dim totalCount As Long
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    totalCount = 0
    For Each tblDef In db.TableDefs
        If Left(tblDef.Name, 4) <> "MSys" Then
            Set rs = db.OpenRecordset(tblDef.Name, dbOpenSnapshot)
            If Not (rs.EOF And rs.BOF) Then
                rs.MoveLast
                totalCount = totalCount + rs.recordCount
            End If
            rs.Close
        End If
    Next tblDef
    Set db = Nothing
    GetTotalRecordCount = totalCount
End Function

 

   Dot1.png     تم تنفيذ الفكرة بطريقتين ، الأولى من خلال الإعتماد على النموذج الرئيسي الذي يفتح به المشروع ( في حدث عند التحميل يتم الغاء التشفير ) وعند زر إغلاق المشروع يوجد حدث لإعادة التشفير لجميع الجداول مرة واحدة وبسرعة مهما كان عدد السجلات .

والثانية من خلال نموذج آخر عند النقر على زر Start يبدأ شريط التحميل والذي يعتمد على عدد السجلات في جميع الجداول التي تم تشفيرها بالتقدم من 0 - 100% . وعند اغلاق النموذج يتم اعادة التشفير مرة أخرى .

✔ خطوات الحصول على النتيجة الصحيحة كالآتي :-

انسخ الجدول (EncryptionStatus ) والمديول ( Encryption ) إلى أي مشروع تريده .

✔ تأكد من أن جميع السجلات غير مشفرة .

✔ تأكد من أن حالة الحقل Status هي No .

 

 

Dot.png قمت بكتابة الموضوع على عجالة ، وتركت الباب مفتوح للنقاش :rol: .

 

File.png

 

Tashfeer 2024.accdb

  • Like 1
قام بنشر
منذ ساعه, Foksh said:

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

والله يااخى العزيز ماذا اقول لك ـ عبقرى فعلا

شوف ياصاحبى انا استخدمت الطريقة الاولى وهى الاعتماد على النموذج الرئيسى وهو هنا شاشة ادخال عادية مثل اى شاشة

ان اضفت ما يلزم الى برنامجى كما اشرت حضرتك والمشكلة التى قابلتنى ان البرنامج  مشفر طول الوقت 

وهذا مثال مصغر مرفق من برنامجى كيف يمكن التطبيق عليه واذا تم التطبيق يمكن لى ان انا اطبق على برنامجى

جزاك الله كل خير

مشتريات ومبيعات.accdb

  • Thanks 1
قام بنشر (معدل)
12 دقائق مضت, الحلبي said:

والله يااخى العزيز ماذا اقول لك ـ عبقرى فعلا

شوف ياصاحبى انا استخدمت الطريقة الاولى وهى الاعتماد على النموذج الرئيسى وهو هنا شاشة ادخال عادية مثل اى شاشة

ان اضفت ما يلزم الى برنامجى كما اشرت حضرتك والمشكلة التى قابلتنى ان البرنامج  مشفر طول الوقت 

وهذا مثال مصغر مرفق من برنامجى كيف يمكن التطبيق عليه واذا تم التطبيق يمكن لى ان انا اطبق على برنامجى

جزاك الله كل خير

مشتريات ومبيعات.accdb 1.22 \u0645\u064a\u062c\u0627 \u0628\u0627\u064a\u062a · 2 downloads

هنا كانت مشكلتك

تأكد من أن حالة الحقل Status هي No .

 

هذا ملفك بعد التطبيق

 

مشتريات ومبيعات.accdb

تم تعديل بواسطه Foksh
قام بنشر
3 ساعات مضت, Foksh said:

 

✔ تأكد من أن حالة الحقل Status هي No .

 

جميل جدا .. مع ان الحقل status ثغرة يمكن التلاعب بها

فتنعكس العملية .

هل الاعلان عن متغير رقمي  عند الفتح وعندما يتم فك التشفير تتغير قيمته من اجل شرط التشفير  يقوم بالمهمة بدلا من الحقل ؟

والافضل عند تغير قيمة المتغير ان تتغير الى : صفر ويكون هو الشرط

لماذا ؟ ... خشية ان يحدث خطأ .. فاي error عند العمل على البرنامج مهما كان صغيرا يسبب مسح للذاكرة

هنا لو تم مسح الذاكرة سيبقى المتغير على قيمته الافتراضية صفر

 

  • Like 1
قام بنشر

ما شاء الله تبارك الرحمن .. 😊🌼
 

سباق محتدم في الإبداعات والابتكارات هذه الفترة .. شكله موسم الإبداعات 😁👌

سلمت يمناك عم الحاج مستر @Foksh .. شغل معلمين 👍🙂 ..

لكن سؤالي هو : هل هذه الحركة سوف تتوافق مع قواعد البيانات المشتركة لأكثر من مستخدم ؟

ألن يحصل تضارب بين المستخدمين عند التشفير وفكه وخصوصا وقت إدخال البيانات ؟ 

فرص حصول الأخطاء كبيرة .. وخصوصا لو نسينا تغيير حالة ال status قبل عملية إدخال البيانات ..

هي مجرد أفكار ولعلها من وحي الخيال وضرب من ضروب الفكر فقط 🙂🖐

  • Like 1
قام بنشر (معدل)
12 ساعات مضت, Foksh said:

تأكد من أن حالة الحقل Status هي No .

بارك الله فيك وفى صحتك وعافيتك كلام جميل جدا وسحر فى الاكواد ـ الله يبارك لك فى علمك وفى اسرتك ـ امين

صاحبى / فادى

هل تقصد بان status هى no انها غير نشطة يعنى اتاكد اولا ان علامة الصح غير موجودة عليها ام العكس

وانا اريد ان تلغى الرسالة التى تقول : "تم عملية فك التشفير بنجاح " والرسالة التى تقول "تم علمية التشفير بنجاح" انا قمت بالغاء الرسالة ولكن اريد ان يختصر الكود بقدر الامكان

وسؤال تانى ارى انه سؤال ليس وقته وهو : هل ممكن نجعل التشفير للحقول الرقمية ايضا وليس للحقول النصية فقط

لو كان بايدى لجعلتك ليس خبيرا فقط وليس من فريق المنتدى ولكن يتوج اسمك بعنوان كبير فى المنتدى ـ مع احترامى لكل فريق الموقع وخبراء المنتدى ـ ان كان تخيلى فى مكانه

ولا انسى فضل ومساعدة سيخنا الجليل / ابو خليل فهو صاحب الفكرة واول من قام بمساعدتى زادك الله صحة وعافيه ـ واطال الله عمرك معلمنا الجليل

جزاك الله كل خير

 

تم تعديل بواسطه الحلبي
  • Like 1
قام بنشر
في 17‏/11‏/2024 at 01:00, ابوخليل said:

جميل جدا .. مع ان الحقل status ثغرة يمكن التلاعب بها

 

معلمنا يسعدني الحديث حول هذه النقطة ..
فكرتي كانت كالآتي ، الآن عند حفظ وتشفير قاعدة البيانات الى ACCDE كمثال ، فلا اعتقد انه من السهل التلاعب بالجدول هذا تحديداً ، إذا كان المبرمج قد قام بإلغاء مفتاح الشيفت !! لذا كان همه ليس بالكبير للقلق حوله .

في 17‏/11‏/2024 at 01:00, ابوخليل said:

هل الاعلان عن متغير رقمي  عند الفتح وعندما يتم فك التشفير تتغير قيمته من اجل شرط التشفير  يقوم بالمهمة بدلا من الحقل ؟

والافضل عند تغير قيمة المتغير ان تتغير الى : صفر ويكون هو الشرط

هذا كلام جميل ، ولم يخطر لي ( يبدو أنني كنت جداً على عجالة من أمري :blink: ) ، وأكيد نعم، يمكن استخدام متغير رقمي بدلاً من الاعتماد على حقل في جدول كما تم الأمر زهز اقتراح جميل .

 

 

في 17‏/11‏/2024 at 08:05, Moosak said:

لكن سؤالي هو : هل هذه الحركة سوف تتوافق مع قواعد البيانات المشتركة لأكثر من مستخدم ؟

 

اهلا مهندسنا الغالي ، بارك الله بك :wub:

فعلاً في فكرتي لم أتم التوسع بها لهذا الغرض ، ولكنه قد يكون ممكناً في تطويرات وتحديثات قادمة :excl:

قام بنشر
في 17‏/11‏/2024 at 11:43, الحلبي said:

هل تقصد بان status هى no انها غير نشطة يعنى اتاكد اولا ان علامة الصح غير موجودة عليها ام العكس

 

هي فقط أول مرة يجب ان تتأكد منها في هذا الإصدار ، ولكن بناءً على الأفكار الرائعة من قبل معلمينا ومهندسينا فأعتقد أنها قابلة للتطوير والتوسيع ان شاء الله .

 

في 17‏/11‏/2024 at 11:43, الحلبي said:

وانا اريد ان تلغى الرسالة التى تقول : "تم عملية فك التشفير بنجاح " والرسالة التى تقول "تم علمية التشفير بنجاح" انا قمت بالغاء الرسالة ولكن اريد ان يختصر الكود بقدر الامكان

 

هذه الرسالة تستطيع الغاء ظهورها من داخل المديول . وموضوع اختصار الكود ، تستطيع استخدام كود معلمنا وشيخنا الجليل ابو خليل وجعلهم في حدث عند الفتح والإغلاق لنموذج محدد .

مع العلم أن الكود قابل للتوسع وقد يكون أكبر من هذا الحالي :jump:

 

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

زائر
اضف رد علي هذا الموضوع....

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • تصفح هذا الموضوع مؤخراً   0 اعضاء متواجدين الان

    • لايوجد اعضاء مسجلون يتصفحون هذه الصفحه
×
×
  • اضف...

Important Information