
04-08-2007, 04:13 PM
|
| المنتدى :
منتدى لغات البرمجة
التشفير فى vb.net المقدمة
يعتبرالأمان شئُ رئيسيُ للعديد مِنْ التطبيقاتِ. عملية التحقُّقِ والتفويضِ للمستخدمين فى التطبيقات جزء من الأمنِ العامِّ.
ولكن ماذا عن البيانات المستخدمة والتى يتم ارسالها من والى التطبيقِ؟ فهى فى هذه الحالة تكون معرضة للتجسس وسرقة.
فهنا تبرز اهمية تشفير البيانات, علم التشفير موضوع ضخم لوحده. وفى هذا الدرس سنقوم فقط بشرح كيفية التشفير فى .NET FrameWork
لماذا نستخدم التشفير؟
فى اغلب التطبيقات يتوفر فيها الامان عن طريق شاشات الدخول واعطاء الصلاحيات لكل مستخدم . على أية حال، ماذا لو أنّ شخص ما إعترضَ البياناتَ المرسلة عبر الشبكة؟(بواسطه اى اداة لمراقبة الشبكة او برامج sniffer) ماذا لو أنّ شخص ما تلاعب بالبياناتِ التي تُرسَلُ على الشبكةِ؟ ماذا لو أنّ شخص ما فَتحَ قاعدةَ بيانات sql server التي تَخْزنُ كلماتَ السر؟
الحل هو تشفير البيانات
.NETFramWork يعطيك فئات عن طريقها تُشفّرَ encryptالبياناتَ التي ترسل في نظامِكِ أَو شبكتِكِ وبعد ذلك تفك التشفير decrypt فقط للمستخدم المخول بالتعديل او القراءة. باختصار التشفير يزودنا بالميزّاتَ تاليةَ:
حماية البياناتَ المرسلة مِنْ القراءة من طرف ليس مخول
حماية البياناتَ المرسلة مِنْ أيّ تعديل
التأكّدْ بأنّ البياناتِ تَصِلُ مِنْ المكان الصحيحِ
أنواع فئات التشفير:
وهى تصنف الى اربع انواع
1-الفئات التي تَتعاملُ مع المفتاح السرى (يسمى التشفير المتناظر Symmetric Cryptography)
2-الفئات التي تَتعاملُ مع المفتاح العامِّ ( يسمى التشفير الغير متناظرAsymmetric Cryptography)
3-الفئات التي تَتعاملُ مع التواقيعِ الرقميةِ (cryptographic signatures)
4-الفئات التي تَتعاملُ مع الارقام المختلطة المشفّرةِcryptographic hashes
كل هذه الفئات تجدها فى فضاء الاسماء التالى:
System.Security.Cryptography
اولا
التشفير المتناظر
في التشفير المتناظر(المفتاح السرى)، البيانات المحمية تكون مشفرة باستخدام مفتاح سري وحيد. هذا المفتاح معروف فقط للمرسل والمستلم. يشفّر المرسل البيانات باستعمال المفتاح السري. المستلم يفك تشفير البيانات باستخدام نفس المفتاح السري. ومن الهم جدا اخفاء المفتاح السرى لان اى شخص يحصل عليه يصبح قادر على فك التشفير
اطار العمل يوفر الفئات التالية للتعامل مع التشفير المتناظر:
DESCryptoServiceProvider
RC2CryptoServiceProvider
RijndaelManaged
TripleDESCryptoServiceProvider
وفى هذا المثال سنشرح كيفية التشفير المتناظر باسخدام Triple-DES algorithm
System.Security.Cryptography namespace يحتوي على الفئة TripleDESCryptoServiceProvider الذي يوفر امكانية تشفير البيانات بخوارزميةTriple-DES.
يحتاج التشفير المتناظر لتشفير البيانات:
1- مفتاح سري A secret key
2-موجه تهيئةAn initialization vector
تستخدم خوارزميات التشفير سلسلة من التقنيات لتشفير البيانات. في هذه التقنية، كامل البيانات الّتي ستشفّر تقسم الى كتل صغيرة. الكتلة المشفّرة سابقا من البيانات تستعمل لتشفير الكتلة الحالية وتتكررالعملية.
The Initialization Vector (IV) يستعمل لتشفير ووفك تشفير الكتلة الأولى للبايتات. بهذا يضمن عدم تكرار الكتل المشفرة
لإستعمال TripleDESCryptoServiceProvider، مفتاح التشفير يجب أن يكون من حجم24 بايت وموجه التهيئة يجب أن يكون من 8 بايت.
مثال لاستخدام الفئةTripleDESCryptoServiceProvider
هذا هو الكود
كودImports System.Security.Cryptography
Imports System.IO
Imports System.****
Public Class SecurityHelper
Public Key() As Byte
Public IV() As Byte
Public Function Encrypt(ByVal strData As String) As Byte()
Dim data() As Byte = ASCIIEncoding.ASCII.GetBytes(strData)
Dim tdes As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider
If Key Is Nothing Then
tdes.GenerateKey()
tdes.GenerateIV()
Key = tdes.Key
IV = tdes.IV
Else
tdes.Key = Key
tdes.IV = IV
End If
Dim encryptor As ICryptoTransform = tdes.CreateEncryptor()
Dim ms As New MemoryStream
Dim cs As CryptoStream = New CryptoStream(ms, encryptor, CryptoStreamMode.Write)
cs.Write(data, 0, data.Length)
cs.FlushFinalBlock()
ms.Position = 0
Dim result(ms.Length - 1) As Byte
ms.Read(result, 0, ms.Length)
cs.Close()
Return result
End Function
Public Function Decrypt(ByVal data() As Byte) As String
Dim tdes As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider
tdes.Key = Key
tdes.IV = IV
Dim decryptor As ICryptoTransform = tdes.CreateDecryptor()
Dim ms As New MemoryStream
Dim cs As CryptoStream = New CryptoStream(ms, decryptor, CryptoStreamMode.Write)
cs.Write(data, 0, data.Length)
cs.FlushFinalBlock()
ms.Position = 0
Dim result(ms.Length - 1) As Byte
ms.Read(result, 0, ms.Length)
cs.Close()
Return ASCIIEncoding.ASCII.GetString(result)
End Function
end class
شرح الكود:
قمنا بانشاء فئة واسميناها SecurityHelper وهى تحتوى على متعيرين عامين من النوع byte array والذين يمثلان المفتاح السرى والموجه وكذلك يوجد به دالتين الاولى لتشفير البيانات والثانية لفك التشفير
داله التشفير تستقبل نص لتشفيره وتعود بقيمة من النوع byte array تمثل النص المشفر
وفى هذه الداله قمنا اولا بتعريف متغير من نوع byte array ووضعنا به النص المراد تشفيره بعد تحويله الى bytes باستخدام الطريقة GetBytes()
ثم انشئنا كائن من الفئة TripleDESCryptoServiceProvider
وبعدين نختبر اذا كان المستخدم اعطى قيمة للمفتاح والموجه فاذا لم يفعل نقوم بتوليدها عن طريق الفئة TripleDESCryptoServiceProvider
عرفنا متغير من الواجهه ICryptoTransform وهى تعرف العمليات الاساسية للتشفير واسندنا لها القيمة الناتجة من الطريقة CreateEncryptor()
عرفنا كائن من النوع MemoryStream حيث سنقوم بكتابة البيانات المشفرة اليه ويمنك استخدام FileStream لتخزين البيانات على الهارد
ا عرفنا كائن من النوع CryptoStream ومررنا له MemoryStreamو ICryptoTransformالسابق انشائه ونمطه وهو هنا write
ثم قمنا بكتابة البيانات لتشفيرها بالكائن CryptoStream الذى يحتفظ بهذه البيانات فى الذاكرة بواسطةالكائن MemoryStream
اخيرا قمنا بقراءة البيانات المشفرة من الmemorystream ووضعها فى متغير من byte array وهى القيمة
التى تعود بها الدالة
الان اصبح بامكانك تطوير هذه الفئة واستخدامها فى تطبيقاتك لتشفير كلمات السر والبيانات المهمه
ساقوم بشرح الطرق الاخرى للتشفير فى وقت لاحق باذن الله تعالى.
كما ارجو تنبيهى على اى اخطاء وما توفيقى الا بالله
| | توقيع MaZeN |

| | |