PDA

View Full Version : Encode و Decode کردن Password در DB



atishatish
پنج شنبه 28 شهریور 1387, 18:32 عصر
سلام به تمامی اساتید . یه برنامه دارم که کلمه عبور رو در db ذخیره میکنه . منتهی میخوام کلمه عبور در db به صورت encode ذخیره بشه و بعد از خواندن از db دوباره اون رو decode کنه و با کلمه عبور وارد شده مقایسته کنه . حالا سوال اینکه چطور میشه این کارو کرد ، درواقع الگوریتم و توابع که برای انجام این کار باید ازش استفاده کرد چیه ؟ :متفکر:

Amir Oveisi
پنج شنبه 28 شهریور 1387, 19:52 عصر
از hashing‌استفاده کنید. اگه جستجو کنید تو سایت کلی در این موردی که گفتید بحث شده.

موفق باشید
jooje

jaza_sa
پنج شنبه 28 شهریور 1387, 20:17 عصر
+ جستجو کنید +
برای ذخیره:
پسورد رو بخونید
تبدیل به Hash کنیدش (GetHashCode)
اونو در دیتابیس ذخیره کنید

برای خواندن:
پسورد رو بخونید
تبدیل به Hash کنیدش (GetHashCode)
پسورد رو از دیتابیس بخونید
این دو رو با هم مقایسه کنید
در صورتی که یکی بودند اجازه عبور بدید

SMRAH1
پنج شنبه 28 شهریور 1387, 23:56 عصر
سلام
ایده استفاده از Hash خیلی خوبه ولی دوتا ایراد داره.اول اینکه ممکن است دو رشته دارای یک Hash یکسان باشند (به ندرت اتفاق می افتد ولی غیر ممکن نیست).دوم اینکه این فرایند یک طرفه است (از رشته به hash ) ونمی توان رشته اولیه را دیگر بازیابی کرد.
راه دیگر استفاده از قابلیت های دات نت است.با کد زیر می توانید هر رشته را به یک رشته ی کد شده، تبدیل کنید:

try
{
byte[] Byte = System.Text.Encoding.ASCII.GetBytes(YourStringPass word);
NewYourStringCreated = Convert.ToBase64String(Byte);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message, "", MessageBoxButtons.OK,
MessageBoxIcon.Stop);
}و با این کد می تواندی رشته اولیه را بازیابی کنید:


try
{
byte[] Byte = Convert.FromBase64String(NewYourStringCreated);
YourStringPassword = System.Text.Encoding.ASCII.GetString(Byte);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message, "", MessageBoxButtons.OK,
MessageBoxIcon.Stop);
}
که در هر دو رشته YourStringPassword ،رشته شما و NewYourStringCreated رشته کد شده است.با کمی جمع آوری اطلاعات در زمینه FromBase64String می توانید به نتایج جالبی برسید.

موفق باشید

jaza_sa
جمعه 29 شهریور 1387, 00:57 صبح
سلام
دوم اینکه این فرایند یک طرفه است (از رشته به hash ) ونمی توان رشته اولیه را دیگر بازیابی کرد.

به نظر من این روش برای ذخیره پسورد بهتره ،
چون با این روش به کاربر این اطمینان رو میدیم که پسوردش به هیچ طریقی قابل دسترس نیست

Amir Oveisi
جمعه 29 شهریور 1387, 01:09 صبح
ممکن است دو رشته دارای یک Hash یکسان باشند (به ندرت اتفاق می افتد ولی غیر ممکن نیست)
اینو ببینیند (به highlight توجه کنید)

http://i34.tinypic.com/f4eoat.jpg

الگوریتم SHA-1 و SHA-2 این چنین نیستند. (البته SHA-1 پس از 2 به توان 63 حمله ممکنه شکست بخوره ولی SHA-2‌ نه)

در ضمن روشی که شما اشاره کردیدبه هیچ وجه امن نیست.

موفق باشید
jooje

علیرضا مداح
جمعه 29 شهریور 1387, 08:09 صبح
سلام دوست عزیز،
مسلما" بهره گیری از تکنیک Hash از امنیت بیشتری برخوردار خواهد بود ،
جهت اطلاعات بیشتر ، مقاله زیر را مطالعه نمایید :
CodeProject: The Art & Science of Storing Passwords. (http://www.codeproject.com/KB/recipes/StoringPasswords.aspx)

مطلب مفید زیر از استاد نصیری را نیز مطالعه کنید :
برنامه نویس - Salted Hash (http://www.barnamenevis.org/forum/showthread.php?t=14191)

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

SMRAH1
جمعه 29 شهریور 1387, 14:17 عصر
سلام

از یاد آوری دوستان ممنون.با این حال روشی که اشاره کردم یک روش پایه ایست.من شخصا در برنامه هام به علاوه یک روش استاندارد (مثل اینی که ذکر کردم)،توسط یک الگوریتم دیگر هم داده ها را باز تغییر می دهم.این فرآند تا زمانی که کد در دسترس عموم نباشد کاملا کارا است.
در ضمن من قبلا به نمونه ای برخوردم که دو شی یکسان Hash مساوی تولید می کنند.(شاید ایراد در پیاده سازی شی بوده است ولی ..).

موفق باشید

علیرضا مداح
جمعه 29 شهریور 1387, 15:48 عصر
در ضمن من قبلا به نمونه ای برخوردم که دو شی یکسان Hash مساوی تولید می کنند.(شاید ایراد در پیاده سازی شی بوده است ولی ..).


برای جلوگیری از تولید Hash های مساوی برای مقادیر متفاوت ، باید از تکنیک Salted Hash استفاده نمایید که در لینکهای ذکر شده توضیح داده شده است ،/