مقدمة:
اغلب التطبيقات بحاجة الى تخزين بيانات خاصة بها والحل هو تشفير البيانات(التشفير المتناظر مثلا) الذى يحمى البيانات باستخدام سلسلة عشوائية من البايتات تسمى المفتاح السرى، المشاكل تحدث عند فك تشفير البيانات المحمية حيث تحتاج لاستخدام نفس المفتاح السرى الذى استخدمته فى التشفير،ويوجد تعقيدات فى هذا الموضوع مثل ايجاد مكان امن لحفظ المفتاح السرى(وهذا صعب فى اغلب الاحوال) او اشتقاق المفتاح السرى من بيانات اخرى مثلا كلمة سر...الخ(وهى غير امنه ويمكن ان تضيع البيانات اذا نسى المستخدم كلمة السر)
ان الحل المثالى هو ان تدع نظام التشغيل ويندوز يشفر لك البيانات، ولتطبيق هذا ،انت بحاجة الى استخدام DPAPI (Data Protection API), الذى يشفر البيانات باستخدام المفتاح المتناظر بالاعتماد على مستخدم محدد او معلومات جهاز كمبيوتر محدد، بهذه الطريقة لا تقلق على مكان تخزين المفتاح السرى او التحقق من ان الشخص مخول لقراءة البيانات. لان البيانات المخزنة بواسطة مستخدم تصبح اتوماتيكيا غير ممكنة بالنسبة للمستخدمين الاخرين هذا لو تم حفظ البيانات بالنسبة لمستوى المستخدمين اما لو تم حفظ البيانات على نطاق الجهاز بالكامل فلا يمكن الوصول الى البيانات وفك تشفيرها على اى جهاز اخر
فى الاصدارات السابقة من .NET كان لا يوجد فئات مدارة لاستخدام DPAPI وهذا ما تم اضافته فى الاصدار الاخير .NET FRAMEWORK 2 متمثلا فى الفئة الجديدة ProtectedData الموجودة فى فضاء الاسماء System.Security.Cryptography namespace
التطبيق
الفئة ProtectedData تحتوى على طريقتان مشتركتان Shared Methods . ProtectData( ) هذه الطريقة تاخذ مصفوفة من البايتات byte array تمثل البيانات المصدر او البيانات المراد تشفيرها وحمايتها وتعيد مصفوفة من البايتات تمثل البيانات المشفرة
UnprotectData( ) تقوم هذه الطريقة بعكس ما تقوم به الطريقة الاولى اى تاخذ مصفوفة بايتات تمثل البيانات المشفرة وتعيد مصفوفة بايتات تمثل البيانات بدون تشفير
الصعوبة الوحيدة التى ستواجهها فى استخدام الطريقتين السابقتين هو انهما يقومان بتشفير وفك تشفير البيانات باستخدام مصفوفة من البايتات byte array ، فقط. هذا يعنى لو كنت تريد تشفير نصوص،ارقام، او اى شئ اخر لابد من تحويلة الى مصفوفة بايتات قبل تشفيره والقيام بالعكس عند فك التشفير
المثال التالى يبين كيفية تشفير نص وتخزينه فى ملف
Imports System.Security.Cryptography
Imports System.IO
Module ProctedData
Sub Main( )
' Get the data.
Console.WriteLine("Enter a secret message and press enter.")
Console.Write(">")
Dim Input As String = Console.ReadLine( )
Dim DataStream As MemoryStream
If Input <> "" Then
Dim Data( ), EncodedData( ) As Byte
' Write the data to a new MemoryStream.
DataStream = New MemoryStream( )
Dim Writer As New StreamWriter(DataStream)
Writer.Write(Input)
Writer.Close( )
' Convert the MemoryStream into a byte array,
' which is what you need to use the ProtectData( ) method.
Data = DataStream.ToArray( )
' Encrypt the byte array.
EncodedData = ProtectedData.Protect(Data, Nothing, _
DataProtectionScope.CurrentUser)
' Store the encrypted data in a file.
My.Computer.FileSystem.WriteAllBytes("c:\secret.bin",
EncodedData, False)
End If
End Sub
End Moduleيمكنك تنفيذ الكود السابق فى تطبيق Console
عند تنفيذ البرنامج سيطلب منك ادخال نص الذى سيقوم بتشفيره باستخدام معلومات حساب المستخدم الحالى وسيتم تخزينه فى الملف secret.bin وهذه البيانات لا يمكن الوصول اليها من اى حساب مستخدم اخر .
والكود التالى يوضح كيفية فك تشفير البيانات الموجودة فى الملف secret.bin
If My.Computer.FileSystem.FileExists("c:\secret.bin") Then
Dim Data( ), EncodedData( ) As Byte
EncodedData = My.Computer.FileSystem.ReadAllBytes("c:\secret.bin")
Data = ProtectedData.Unprotect(EncodedData, Nothing, _
DataProtectionScope.CurrentUser)
Dim DataStream As New MemoryStream(Data)
Dim Reader As New StreamReader(DataStream)
Console.WriteLine("Decoded data from file: " & Reader.ReadToEnd( ))
Reader.Close( )
End Ifتذكر، بما اننا استخدمنا حساب المستخدم الحالى فى تشفير البيانات يمكنك فك تشفيرها فى اى وقت ولكن الشرط الوحيد هو تسجيل الدخول بنفس الحساب الذى استخدمته فى التشفير جرب بحساب اخر وستفشل العملية
ولاحظ ايضا عند حماية البيانات يجب ان تختار احد قيم المرقم DataProtectionScope ويوجد به خياران :
LocalMachine
نظام التشغيل سيقوم بتشفير البيانات باستخدام بيانات الجهاز الذى تم عليه التشفير ولا يمكن الوصول اليها على اى جهاز اخر ولكن يمكن الوصول اليها من اى شخص يستخدم هذا الجهاز، وهذا الخيار جيد بالنسبة للبرامج التى تعمل باتجاه الخادم كخدمات ويندوز او خدمات الويب
CurrentUser
وهو ما قمنا بتطبيقة فى المثال السابق حيث لا يمكن الوصول الى البيانات من اى مستخدم غير المستخدم الذى قام بعملية التشفير
كما قمنا فى المثال السابق بحفظ البيانات بعد حمايتها فى ملف يمكن حفظها فى قاعدة البيانات داخل سجل كل ما تحتاجة هو حقل للبيانات الثنائية Binary
فى الجدول مع مساحة كافية لاستقبال البيانات القادمة
فى SQL Server استخدم varbinary
بالتوفيق

