PDA

View Full Version : آيا در VB.NET امكاني براي Encrypt كردن پسورد وجود دارد



saeednadery
شنبه 09 آذر 1387, 13:38 عصر
با سلام خدمت همه دوستان گرامي
من مي خواستم بر روي برنامه ام username و password تعريف كنم طبق كد زير اينكار را انجام داده ام
Imports System.Data.SqlClient
Public Class LoginForm1
Dim strcon As String = "Data Source=naderi;Initial Catalog=device;Integrated Security=True"
Dim strsql, strsql1 As String
Dim ds As New DataSet
Dim i As Integer
Dim v As Boolean
Dim da As SqlDataAdapter
Dim con As New SqlConnection(strcon)

Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
If TextBox1.Text = "" Or TextBox2.Text = "" Then
MsgBox("نام كاربري يا رمز عبور وارد نشده است")
Else
For i = 0 To Me.BindingContext(ds, "logins").Count - 1
' Label1.Text = ds.Tables("logins").Rows(i).Item("usern")
' Label2.Text = ds.Tables("logins").Rows(i).Item("password")
If TextBox1.Text = Trim(ds.Tables("logins").Rows(i).Item("usern")) And TextBox2.Text = Trim(ds.Tables("logins").Rows(i).Item("password")) Then
v = True
Form1.Show()
ElseIf i = Me.BindingContext(ds, "logins").Count - 1 And v = False Then
MsgBox("نام كاربري و يا كلمه عبور اشتباه مي باشد ")
End If
Next


End If

End Sub

Private Sub Cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel.Click
Me.Close()
End Sub

Private Sub LoginForm1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
con.Open()
v = False
strsql = "select usern , password from logins"
da = New SqlDataAdapter(strsql, con)
da.Fill(ds, "logins")
End Sub
End Class
حال مي خواستم بدانم آيا VB.NET امكاني براي Encrypt كردن پسورد دارد يا اينكه بايد خودمان يك الگوريتم براي آن بنويسيم

__H2__
یک شنبه 10 آذر 1387, 01:32 صبح
سلام
در این ضمینه امکانات بسیار زیاد و قوی وجود دارد.

برای Password معمولاً از الگوریتم های یکطرفه استفاده میکنند!
یعنی لغت رمز میشود ولی دیگر قابل بازگشت نیست!
در نگاه اول شاید به نظرتان برسد که این فایده ای ندارد، ولی این شیوه بسیار مطمئن و پرکاربرد است.

شما پسورد اولیه را گرفته و رمز میکنید و در دیتابیس میریزید.
بعد برای چک کردن صحت پسورد (مثلاً در زمان Login) باز پسورد ورودی را رمز میکنید و با مقدار رمز داخل دیتابیس مقایسه میکنید.

بدین ترتیب حتی اگر کسی به دیتابیس هم دسترسی پیدا کند نمیتواند رمز را متوجه شود.
حتی شما به عنوان مدیر و Admin هم نمیتوانید رمز را متوجه شوید ولی میتوانید رمز جدیدی اختصاص دهید.
(مثل خود ویندوز که حتی administrator نمیتواند رمز کاربران عادی را متوجه شود ولی هر زمان خواست میتواند انها را حذف و یا تغییر دهد.)

معروفترین الگوریتم های این روش sha و md5 است.
مثلاً


Dim strHashPassword As String = System.Convert.ToBase64String(System.Security.Cryp tography.SHA1.Create.ComputeHash(System.Text.Encod ing.UTF8.GetBytes(strPassword)))


در مثال فوق strPassword میتواند هر چیزی باشد، فارسیو انگلیسی و unicode ای ولی خروجی رمز شده همواره ascii خواهد بود و نتیجتاً فیلد varchar برای ان قابل استفاده است (نیازی به nvarchar نیست)

مثلاً


Mahdi1 -> "sGqGhY7ijfyjuOLNLzyFdtpevvs="
Mahdi2 -> "6M0SBIAyXj2bvkV5v73QTXp75tk="

حالا بگردرد ربطش را پیدا کنید!

=====

برای الگوریتم دو طرفه و کامل هم میتوانید لینک زیر را مطالعه کنید
http://www.persianscience.ir/showthread.php?p=5195#post5195

موفق باشید.

saeednadery
یک شنبه 10 آذر 1387, 08:20 صبح
با تشكر از كاربر H2
امتحان كردم خيلي عالي بود فقط به نظر من يك ايراد دارد و آن اينكه اگر يك فرد به ديتابيس دسترسي داشته باشد با توجه به پسورد هاي تكراري دقيقا خروجي رمز شده يكسان مي باشد . كافيست كه تنها يك پسورد لو برود در اين صورت مي توان به تمام اطلاعات دسترسي داشت . چون مي توان خروجي رمز شده اي اين پسورد را براي كاربران مختلف از طريق ديتابيس copy و paste كرد و با هر كاربري كه خواستي برنامه را اجرا كني . بنابراين عيب الگوريتم يكطرفه فكر مي كنم همين باشد . البته فكر مي كنم اگر ما ابتدا username و password را با هم تركيب كنيم وبعد معادل رمز شده اي آن را در ديتابيس قرار دهيم مطمئن تر باشد . لطفا در اين مورد نظر دهيد
با تشكر از همه دوستان

mostafaaa
یک شنبه 10 آذر 1387, 09:16 صبح
سلام دوستان
فکر میکنم توی این تاپیک به صورت کامل در این مورد بحث شده و لزومی نداره که دوباره یه بحث تکراری پیش کشیده بشه. هر چند در زمینه رمز نگاری همیشه حرفهای جدیدی برای گفتن هست.
سناریو 1 - ذخیره پسورد کاربران و اعتبارسنجی آن در نزم افزار اتوماسیون اداری (http://barnamenevis.org/forum/showthread.php?t=120547)

__H2__
دوشنبه 11 آذر 1387, 00:19 صبح
سلام

فقط به نظر من يك ايراد دارد و آن اينكه اگر يك فرد به ديتابيس دسترسي داشته باشد با توجه به پسورد هاي تكراري دقيقا خروجي رمز شده يكسان مي باشد . كافيست كه تنها يك پسورد لو برود در اين صورت مي توان به تمام اطلاعات دسترسي داشت . چون مي توان خروجي رمز شده اي اين پسورد را براي كاربران مختلف از طريق ديتابيس copy و paste كرد و با هر كاربري كه خواستي برنامه را اجرا كني

امنیت دیتابیس جای خود را دارد و باید تامین شود.
اگر کسی به محتویات جداول دیتابیس اصلی دسترسی داشته باشد، میتواند به خرابکاریهای بزرگتری فکر کند!


بنابراين عيب الگوريتم يكطرفه فكر مي كنم همين باشد . البته فكر مي كنم اگر ما ابتدا username و password را با هم تركيب كنيم وبعد معادل رمز شده اي آن را در ديتابيس قرار دهيم مطمئن تر باشد . لطفا در اين مورد نظر دهيد
بد فکری نیست ولی اگر قرار شد روزی (غیر محتمل) username عوض شود passoword هم باید عوض شود.

======

با تشکر از کاربرmostafaaa بابت معرفی تاپیک و جمیعاً موفق باشید.