05-10-12, 01:42 AM
كاتب الموضوع : samerselo
لنفرض أنه لدينا فئة تحتفظ بمعلومات اسم مستخدم وكلمة مرور ما ونريد أن نقوم بتخزين هذه الفئة على القرص وسنفترض مبدئيا أن فئتنا على الشكلكود :
Public Class ProgramPass
' UserName & Password Fields
Private _UserName As String
Private _Password As String
' Encription/Decryption Function
' Simple XOR based Encryption
Private Function EncrDecr(ByVal Pass As String, _
Optional ByVal Cyp As Char = "Í") As String
Dim Temp(Pass.Length - 1) As Char
For i As Integer = 0 To Pass.Length - 1
Temp(i) = Chr(Asc(Pass(i)) Xor Asc(Cyp))
Next
Return Temp
End Function
' Return True if the UserName & Passward passed
' Matching ones that stored in the class
Public Function IsCredentialOK(ByVal User As String, _
ByVal pass As String) As Boolean
If EncrDecr(_UserName) = User AndAlso EncrDecr(_Password) = pass Then
Return True
Else
Return False
End If
End Function
' UserName Property
Public Property UserName() As String
Get
' Decrypt before Return
Return EncrDecr(_UserName)
End Get
Set(ByVal value As String)
' Encrypt Before Save
_UserName = EncrDecr(value)
End Set
End Property
' Password WriteOnly Property
Public WriteOnly Property Password() As String
Set(ByVal value As String)
' Encrypt Before Save
_Password = EncrDecr(value)
End Set
End Property
' Empty Constructor
Public Sub New()
End Sub
End Class
كما نرى الفئة بسيطة عبارة عن حقلين خاصين لاسم المستخدم وكلمة المرور يتم التحكم بهما عن طريق خاصيتين UserName و Password وتخزين القيم في هذه المتغيرات يكون عبر إجرائية تشفير بسيطة تقوم بتشفير البيانات الممرة لها ثم تخزنها في الحقول المرتبطة بهذه الخصائص. ولحفظ معلومات الفئة على القرص كي نستطيع استعادها عند الحاجة سنتخدم ما يسمسى بـ Custom Serialization وسنحتاج للاستيرادات التالية في مثالنا هذا
كود :
Imports System.Runtime.Serialization
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Soap
كود :
<Serializable()> _
Public Class ProgramPass
' The Class Must Implements ISerializable Interface
Implements ISerializable
كود :
' ISerializable Interface Procedure for Identifying Data
' to be serialized
Public Sub GetObjectData(ByVal info As
System.Runtime.Serialization.SerializationInfo, _
ByVal context As System.Runtime.Serialization.StreamingContext)
_
Implements
System.Runtime.Serialization.ISerializable.GetObjectData
' Adding Data that Will be Saved
info.AddValue("UserName", _UserName)
info.AddValue("Password", _Password)
End Sub
كود :
' Special Constructor for serialization
' Called by formatter when object graph is being deseralized.
Private Sub New(ByVal si As SerializationInfo, ByVal ctx As
StreamingContext)
_UserName = si.GetString("UserName")
_Password = si.GetString("Password")
End Sub
كود :
<Serializable()> _
Public Class ProgramPass
' The Class Must Implements ISerializable Interface
Implements ISerializable
' UserName & Password Fields
Private _UserName As String
Private _Password As String
' Encription/Decryption Function
' Simple XOR based Encryption
Private Function EncrDecr(ByVal Pass As String, _
Optional ByVal Cyp As Char = "Í") As String
Dim Temp(Pass.Length - 1) As Char
For i As Integer = 0 To Pass.Length - 1
Temp(i) = Chr(Asc(Pass(i)) Xor Asc(Cyp))
Next
Return Temp
End Function
' Return True if the UserName & Passward passed
' Matching ones that stored in the class
Public Function IsCredentialOK(ByVal User As String, _
ByVal pass As String) As Boolean
If EncrDecr(_UserName) = User AndAlso EncrDecr(_Password) = pass Then
Return True
Else
Return False
End If
End Function
' UserName Property
Public Property UserName() As String
Get
' Decrypt before Return
Return EncrDecr(_UserName)
End Get
Set(ByVal value As String)
' Encrypt Before Save
_UserName = EncrDecr(value)
End Set
End Property
' Password WriteOnly Property
Public WriteOnly Property Password() As String
Set(ByVal value As String)
' Encrypt Before Save
_Password = EncrDecr(value)
End Set
End Property
' ISerializable Interface Procedure for Identifying Data
' to be serialized
Public Sub GetObjectData(ByVal info As
System.Runtime.Serialization.SerializationInfo, _
ByVal context As System.Runtime.Serialization.StreamingContext)
_
Implements
System.Runtime.Serialization.ISerializable.GetObjectData
' Adding Data that Will be Saved
info.AddValue("UserName", _UserName)
info.AddValue("Password", _Password)
End Sub
' Empty Constructor
Public Sub New()
End Sub
' Special Constructor for serialization
' Called by formatter when object graph is being deseralized.
Private Sub New(ByVal si As SerializationInfo, ByVal ctx As
StreamingContext)
_UserName = si.GetString("UserName")
_Password = si.GetString("Password")
End Sub
End Class
في البداية نقوم بتعريف متغير من نوع الفئة ProgramPass ونضبط قيم الخاصيتين UserName و Password ثم نقوم بعملية التخزين الفعلي لهذه الفئة على القرص حيث سنستخدم متغير من
النوع SoapFormatter الذي سيقوم بعملية التشكيل المناسب للفئة وتخزينها على القرص باستخدام الطريقة Serialize ممررين لها متغير من النوع FileStream ويكون البارمتر الثاني المتغير السابق الذي عرفناه الفئة ProgramPass الذي خزنا فيه اسم المستخدم وكلمة المرور كما في الكود
كود :
Private Sf As New SoapFormatter
Private PassFileName As String = "d:\Security.xml"
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim p As New ProgramPass()
p.UserName = Me.TextBox1.Text
p.Password = Me.TextBox2.Text
Using St As New FileStream(PassFileName, FileMode.Create, FileAccess.Write)
Sf.Serialize(St, p)
End Using
End Sub
كود :
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
' Deserialize.
Dim p As New ProgramPass
Using St As New FileStream(PassFileName, FileMode.Open,
FileAccess.Read)
p = CType(Sf.Deserialize(St), ProgramPass)
End Using
If p.IsCredentialOK(Me.TextBox3.Text, Me.TextBox4.Text) Then
MsgBox("Access Granted")
Else
MsgBox("Access Denied")
End If
End Sub