PDA

View Full Version : سوال: رمز گذاري اطلاعات



ali_ahr7
چهارشنبه 28 بهمن 1388, 12:34 عصر
و بازهم سوال:
سلام به همگي.من درباره اين موضوع توي تالار گشتم ولي چيزي پيدا نكردم.
سواال من اينه چطوري ميشه پسوردي رو كه كاربر براي ورود به برنامه انتخاب ميكنه رو كد گذاري و سپس در بانك ذخيره كرد؟
آيا بايد از الگوريتم خاصي استفاده كرد؟

karim orooji
چهارشنبه 28 بهمن 1388, 16:13 عصر
با سلام به دوست گرامی

آيا بايد از الگوريتم خاصي استفاده كرد؟
نه
میتونی با دستور where با خوندن اطلاعات در تکس که اگه کلمه تایپ در تکی در بانک موجود باشه بیاد اون کار مورد نظر رو برای شما انجام بده

اگه خواستی یک نمونه مثال برای شما بزارم


موفق باشی

ali_ahr7
چهارشنبه 28 بهمن 1388, 17:55 عصر
متشكر ميشم اگه يه نمونه بذاريد.

saeid.memfis
چهارشنبه 28 بهمن 1388, 18:15 عصر
این کاملا مشخصه دوست عزیز
هنگام ذخیره پسورد .اونو با یه الگوریتم کد کن و وقتی می خوای صحت پسورد بررسی کنی اونو از بانک می خونی و با اون الگوریتم(برعکسش)به پسورد کاربر نبدیلش می کنی که میشه همون چیزی که کاربر تو تکس وارد کرده

pirmard
چهارشنبه 28 بهمن 1388, 18:21 عصر
این کاملا مشخصه دوست عزیز
هنگام ذخیره پسورد .اونو با یه الگوریتم کد کن و وقتی می خوای صحت پسورد بررسی کنی اونو از بانک می خونی و با اون الگوریتم(برعکسش)به پسورد کاربر نبدیلش می کنی که میشه همون چیزی که کاربر تو تکس وارد کرده


الگوریتمی ک برگشت پذیر باشه برای این موارد به درد نمی خوره ! یعنی امنیت پایینی داره .

saeid.memfis
چهارشنبه 28 بهمن 1388, 18:23 عصر
الگوریتمی ک برگشت پذیر باشه برای این موارد به درد نمی خوره ! یعنی امنیت پایینی داره .
مگه برای code و decode راه دیگه های هم هست؟

saeid.memfis
چهارشنبه 28 بهمن 1388, 18:27 عصر
الان که فکر کردم دیدم میشه پسورد داخل تکس رو با همون الگوریتمی که کد کردی دوباره کد کنی و با پسورد ذخیره شده مقایسه کنی...این میشه همون الگوریتم برگشت ناپذیر به قول دوستموون

ali_ahr7
چهارشنبه 28 بهمن 1388, 21:59 عصر
دوستان ميشه يه نمونه الگوريتم ساده رو براي كد گذاري بذاريد؟(فقط براي نمونه)

karim orooji
چهارشنبه 28 بهمن 1388, 22:31 عصر
با سلام به دوست گرامی
ببخشید که یکم دیر شد
یوزر =karim
پسورد =123
بانکش هم اکسسه
و قابلیت تغییر پسور رو هم داره
موفق باشی

pirmard
چهارشنبه 28 بهمن 1388, 23:17 عصر
الان که فکر کردم دیدم میشه پسورد داخل تکس رو با همون الگوریتمی که کد کردی دوباره کد کنی و با پسورد ذخیره شده مقایسه کنی...این میشه همون الگوریتم برگشت ناپذیر به قول دوستموون

دقیقا" همین سناریو مدنظر بود . فقط با این توضیخ که دیگه در این حالت به اون عمل کد کردن نمی گن (کد کردن همیشه برگشت پذیره) بهش هشینگ می گن .



دوستان ميشه يه نمونه الگوريتم ساده رو براي كد گذاري بذاريد؟(فقط براي نمونه)

برای روش هیشنگ با متد md5 می تونین از این کد استفاده کنین .


Imports System.Text
Imports System.Security.Cryptography

Public Class Form1


Private Function GenerateHash(ByVal SourceText As String) As String

Dim Ue As New UnicodeEncoding()
'Retrieve a byte array based on the source text
Dim ByteSourceText() As Byte = Ue.GetBytes(SourceText)
'Instantiate an MD5 Provider object
Dim Md5 As New MD5CryptoServiceProvider()
'Compute the hash value from the source
Dim ByteHash() As Byte = Md5.ComputeHash(ByteSourceText)
'And convert it to String format for return
Return Convert.ToBase64String(ByteHash)
End Function





Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox(GenerateHash(TextBox1.Text))
End Sub
End Class

ali_ahr7
پنج شنبه 29 بهمن 1388, 00:07 صبح
دوست عزيز karim orooji (http://barnamenevis.org/forum/member.php?u=91577) اولا كه ممنون از توجهتون.سوال من اين بود كه چطور ميشه پسورد برنامه رو طوري در بانك ذخيره كرد كه اگر كسي به بانك دسترسي پيدا كرد نتونه از پسورد استفاده كنه.
و اما دوست عزيز pirmard (http://barnamenevis.org/forum/member.php?u=86212) كدتون عالي بود ولي چندتا سوال:
1- اگر من با اين كد پسورد رو در بانك ذخيره كنم آيا اطلاعات كد شده توسط كس ديگه اي قابل بازيابي نخواهد بود؟
2- چطور ميشه برعكس اين عمل رو انجام داد؟ يعني من چطور ميتونم اطلاعات كد شده رو بازيابي كنم؟
بازم از دوستان خوبم متشكرم و اميدوارم كه بتونم جبران كنم.

pirmard
پنج شنبه 29 بهمن 1388, 00:51 صبح
و اما دوست عزيز pirmard (http://barnamenevis.org/forum/member.php?u=86212) كدتون عالي بود ولي چندتا سوال:
1- اگر من با اين كد پسورد رو در بانك ذخيره كنم آيا اطلاعات كد شده توسط كس ديگه اي قابل بازيابي نخواهد بود؟
2- چطور ميشه برعكس اين عمل رو انجام داد؟ يعني من چطور ميتونم اطلاعات كد شده رو بازيابي كنم؟
بازم از دوستان خوبم متشكرم و اميدوارم كه بتونم جبران كنم.

1- خیر !
2- نمیشه !

یعنی کلن در این حالت شما اگه دیتابیس و سورس برنامه و هر چیزی که ممکنه رو هم در اختیار داشته باشین نمی تونین پسورد اولیه رو بدست بیارین.
این اطلاعات که به این روش هش میشن درواقع کد نشده اند (کدینگ با هشینگ تفاوت داره) و قابل بازگشت نیستن در هیچ حالتی . حتی شما اگر الگوریتم md5 رو هم داشته باشین (الگوریتمش روی اینترنت موجوده) باز هم نمی تونین به رشته ی اولیه برسین و این قوت هشینگه .
در واقع شما پسورد رو از کاربر می گیرید و به این روش هش می کنید . سپس اونو در دیتابیس ذخیره می کنید . دفعات آینده که کاربر پسورد رو وارد کرد اون پسورد رو دوباره به همین شکل هش می کنید و با پسورد هش شده ی داخل دیتابیس مقایسه می کنید.

ali_ahr7
پنج شنبه 29 بهمن 1388, 01:09 صبح
ممنون از پاسخ روشنتون.و فقط يه سوال ديگه اينكه خود هش شدن يعني چي؟

pirmard
پنج شنبه 29 بهمن 1388, 03:18 صبح
ممنون از پاسخ روشنتون.و فقط يه سوال ديگه اينكه خود هش شدن يعني چي؟

اول از همه این دو صفحه رو مطالعه کنین :
http://en.wikipedia.org/wiki/Cryptographic_hash_function
http://en.wikipedia.org/wiki/MD5

تمام و کمال توضیح داده شده .
////

اما به زبان خودمونی تر چون اکثرا اونو با کدینگ اشتباه می گیرن یه سری توضیح می دم .
یه تفاوت عمده بین کدینگ و هشینگ اینه که در هشینگ طول رشته ی تولید شده به رشته ی ورودی وابسته نیست. اما در کدینگ این وابستگی وجود داره . یعنی شما چه یه حرف الفبا و چه یک کتاب را با الگوریتم مثلا MD5 هش کنین طول رشته ی خروجی مقداری ثابت خواهد بود !
/////
بزارین فرض کنیم که می خایم یه عدد رو کد کنیم .
یه الگوریتم کد کردن در نظر می گیریم . مثلا می گیم هر عددی که در ورودی اومد ما اونو با 1 جمع می کنیم ! و برای دیکد کردن 1 رو از عدد حاصله کم می کنیم و به عدد اولیه می رسیم .
خوب مثلا اگه عدد 250 رو کد کنیم به 251 می رسیم ! پس شما هر وقت هر عدد کد شده ای رو دیدید می تونین 1 رو از اون کم کنین و به عدد اصلی برسین .

اما حالا می خوایم یه عدد رو هش کنیم به شیوه ی خودمون . می گیم هر عددی که در ورودی دریافت شد ما باقی مونده ی تقسیم صحیح اون عدد بر 10 رو به عنوان خروجی در نظر می گیریم .
پس اگه ما عدد 22 رو بخایم به این شیوه هش کنیم به عدد 2 می رسیم . همینطور عدد 1092 هم اگه هش کنیم به عدد 2 می رسیم . اینطوریه که شما اگه خروجی هش رو در اختیار داشته باشید (مثلا عدد 2 ) و همینطور الگوریتم رو هم در اختیار داشته باشین نمی تونین به عدد اولیه برسین (مثلا 22 یا 1092 یا 78545462 )
خوب این مثال رو برای هشینگ زدم که روشن کنم این الگوریتم برگشت پذیر نیست. از طرفی اینجا دیدیدم (و از ریاضیات می دونیم که) الگوریتمی که برگشت پذیر نباشه یک به یک نیست . این یعنی چی ؟ یعنی اینکه ممکنه چند ورودی مختلف خروجی های همسان رو تولید کنند (طبعا از روی طول ثابت خروجی هم می شد این موضوع رو حدس زد)پس ممکنه توهم ! و یا ترس این ایجاد بشه که ممکنه افرادی با کلمه ی رمزی غیر درست بتونن عبور کنن ! اما در واقع اینطور نیست!(یعنی اون احتمال اونقدر کمه که حتی بروت فورس هم جوابگو نیست) در واقع اینجاست که اهمیت الگوریتم های کریپتوگرافی مشخص میشه که هر کدوم چه اطمینانی دارن.
جدول پایین این صفحه الگوریتمهای مختلف رو از نظر کارایی بررسی کرده :
http://en.wikipedia.org/wiki/Cryptographic_hash_function

majid325
پنج شنبه 29 بهمن 1388, 05:58 صبح
سناریو 1 - ذخیره پسورد کاربران و اعتبارسنجی آن در نرم افزار اتوماسیون اداری (http://barnamenevis.org/forum/showthread.php?t=120547)