PDA

View Full Version : حرفه ای: الگوریتم های غیر قابل بازگشت



A.Yousefi
یک شنبه 08 آبان 1390, 23:25 عصر
سلام
در حال حاضر شما از چه الگوریتمی برای رمز کردن پسوردها و اطلاعات حیاتی مثه کلمه عبور حساب بانکی استفاده میکنید؟
Md5 دیگه قدیمی شده و بجای اون معمولا از SHA1 استفاده میشه،میخوام بدونم آیا الان روش دیگه ای هم وجود داره که شما ازش استفاده کنید؟
ممنون

mehdi.mousavi
یک شنبه 08 آبان 1390, 23:52 عصر
سلام در حال حاضر شما از چه الگوریتمی برای رمز کردن پسوردها و اطلاعات حیاتی مثه کلمه عبور حساب بانکی استفاده میکنید؟ Md5 دیگه قدیمی شده و بجای اون معمولا از SHA1 استفاده میشه،میخوام بدونم آیا الان روش دیگه ای هم وجود داره که شما ازش استفاده کنید؟ ممنون

سلام.
امروزه استفاده از MD4 و MD5 بدلیل سهولت ایجاد Collision مردوده. استفاده از SHA-1 نیز توسط SDL سالها پیش مردود اعلام شد (http://blogs.msdn.com/b/sdl/archive/2009/07/16/banned-crypto-and-the-sdl.aspx).
بنابراین، از یکی از الگوریتمهای SHA256، SHA384 یا SHA512 استفاده کنید. برای اینکار نیز می تونید از یکی از کلاس های زیر استفاده کنید:


System.Security.Cryptography.SHA256 (http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256.aspx)
System.Security.Cryptography.SHA384 (http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha384.aspx)
System.Security.Cryptography.SHA512 (http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha512.aspx)


موفق باشید.

A.Yousefi
دوشنبه 09 آبان 1390, 18:45 عصر
سلام
آقای موسوی خدا میدونه چقد خوشحال شدم وقتی دیدم شما تو این تاپیک پست دادین.
من اکثر پست های شما در این مورد رو خوندم،برام خیلی جالب بود که یه مطلب رو تو پستای مختلف و هر بار با صبر و حوصله توضیح دادین،واقعا که ی کاش وقت میکردم میشستم همه پستاتونو میخوندم.
توی این (http://barnamenevis.org/showthread.php?84283-اینکریپت-کردن-کلمه-عبور&p=419288&viewfull=1#post419288) پست در این مورد فوق العاده توضیح دادین و منو باید ببخشین که خوب سرچ نکرده بودم و تاپیک زدم البته مثه اینکه اون موقع هنوز SHA1 منقضی نشده بود.
اگه لطف کنید و یه زحمت بکشین در مورد اینکه این سه روش با هم چه فرقی دارن یه توضیح بدین ممنون میشم فک کنم تعداد بیتهاشون فرق کنه درسته؟
در ضمن تو msdn که سرچ کردم فهمیدم نحوه استفاده از SHA512 اینجوریه:


byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA512 shaM = new SHA512Managed();
result = shaM.ComputeHash(data);


ولی خیلی خوب متوجه نشدم که دلیل تعریف کردن اون آرایه ها چیه؟
راه ساده تری برای استفاده کردن ازش وجود نداره؟
منظورم اینه نمیشه پسورد رو همینجوری به عنوان یه رشته بهش داد کد رو تحویل گرفت؟
یه خواهش دیگه هم که ازتون داشتم اینه که اگه براتون مقدوره و وقت میکنید یه نمونه از نحوه ترکیب Password با Salt Value بذارین لطفا چون پستای با این موضوع رو که میخوندم همه جا اکثرا به این نتیجه رسیدن که بهترین راه ترکیب PWD با Salt Value اما هیچ نمونه کدی در این مورد نبود که چجوری باید اینکارو انجام داد،واقعا ممنون میشم اگه اینکارو انجام بدین.
با آرزوی موفقیت برای شما

A.Yousefi
دوشنبه 09 آبان 1390, 19:40 عصر
برای استفاده از SHA512 نمیشه از یه راه ساده تر مثه استفاده از SHA1 استفاده کرد،ایجوری:


Response.Write(FormsAuthentication.HashPasswordFor StoringInConfigFile("Mahsa", "SHA1"));

A.Yousefi
دوشنبه 09 آبان 1390, 20:26 عصر
ببخشید آقای موسوی،شما فرمودید:
"باید یک رشته تصادفی از کاراکتر ها رو به کلمه عبور اضافه کنید، بعد اونو hash کنید. به این ترتیب هیچوقت دو hash تولید شده در صورت تکراری بودن کلمه عبور دو کاربر متفاوت، تکراری نخواهد بود. "
خب من الان برام یه سوال پیش اومده،به فرض ما اینکارو کردیم و یه رشته تصادفی به انتهای رمز کاربر اضافه کردیم و بعد اونو هش کردیم و گذاشتیم تو دیتابیس.
حالا کاربر رمزشو وارد میکنه و میخواد وارد سایت شه ما میام رمزشو هش میکنیم و با اون قبلیه مقایسه میکنیم؟
خب اینا که اینجوری برابر نیست اون قبلیرو قبل از اینکه هش کنیم یه رشته تصادفی تهش اضافه کردیم.اینجوری هشا با هم متفاوت میشه.
شرمنده میشه یه کوچولو در مورد brute force بیشتر توضیح بدین؟
دیتا بیس ما میفته دست کرکرها و مثلا هش 100 تا کاربر به گفته شما یکسانه،خب اونا چجوری میخوان به پسورد برسن؟
میان یکی یکی کلمه های مختلف رو چک میکنن؟
اینجوری که هزار سال طول میکشه.

A.Yousefi
سه شنبه 10 آبان 1390, 19:48 عصر
آقای موسوی حالا که میخواین لطف کنین و به این تاپیک پاسخ بدین من با اجازتون یه سوال دیگه بپرسم که تاپیک کاملی بشه.
تو جاهایی که نیاز داریم بعد از رمزنگاری به ورودی اولیه برسیم شما چه روشیو پیشنهاد میکنین؟
منظورم اینه که از نظر شما بهترین الگوریتم قابل بازگشت و نحوه استفاده از اون چیه؟

A.Yousefi
شنبه 14 آبان 1390, 18:23 عصر
سلام
جناب موسوی من پیغام شمارو دیدم ولی شرمنده جواب ندادم آخه نمیدونم چرا من اصلا نمیتونم پخ ارسال کنم،در هر حال من همچنان بی صبرانه منتظر پاسخ شما هستم،هر موقع که وقتتون آزاد شد ممنون میشم با صبر و حوصله به این تاپیک پاسخ بدین،چون فک میکنم با این کار خیلی از سوالای سایر بچه های سایت در این زمینه حل شه.
یه دنیا تشکر

mehdi.mousavi
یک شنبه 15 آبان 1390, 12:46 عصر
سلام.
ما برای Hash کردن داده ها، می تونیم از الگوریتم های مختلفی که برای این منظور وجود داره استفاده کنیم (اینکه چرا نباید از الگوریتم های من در آوردی استفاده کنیم، بحث مفصلی است که توضیح اون در این مقوله نمی گنجه). به این الگوریتم ها، Cryptography Hash Function می گن که SHA یکی از اونهاست و نسخه اول اون (که بهش SHA0 میگن) توسط NIST (موسسه ملی معیارها و تکنولوژی های آمریکا) در سال 93 عرضه شد. این الگوریتم 160 بیتی، اونقدر شکننده بود که با نسخه SHA-1 عوض شد. SHA-1 توسط NSA (آژانس امنیت ملی آمریکا) عرضه شد و نسخه بسط یافته MD4/MD5 هستش که در سال 2005 بدلیل یافتن رخنه های امنیتی متفاوت در اون، منقضی شد. NSA در سال 2001، مجموعه توابع Hashing جدیدی رو تحت قالب SHA-2 (که متشکل بود از SHA-224، SHA-256، SHA-384، SHA-215) عرضه کرد که تنها Block Size اونها متفاوت بود. فرضا SHA-256 حاوی Block Size ای بطول 32 بایت (یا همون 256 بیت) هستش. یعنی چی؟

هر تابعی که یک بلاک داده رو بگیره و رشته ای بطول ثابت ایجاد کنه به نوعی که با تغییر داده ورودی، خروجی به شکل قابل توجهی نیز تغییر کنه و همچنین خروجی بر اساس ورودی یکسان، همون خروجی قبلی رو تولید کنه رو بهش تابع Hash میگیم. وقتی میگیم SHA-256 منظورمون اینه که داده ای (با هر حجمی) به این تابع میدیم و خروجی این تابع، همواره آرایه ای از 32 بایت یا 256 بیت هستش.

بطور نمونه، کد زیر رو در نظر بگیرید:


string str = "Yet another test!";
byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(str);

SHA256Managed sha = new SHA256Managed();
byte[] hashValue = sha.ComputeHash(data);

در این کد، ورودی ما رشته Yet another test! هستش. وقتی اونو به تابع SHA-256 میدیم، hashValue دریافتی از تابع مزبور حتما 32 بایت خواهد بود (خودتون کد فوق رو در Visual Studio بررسی کنید). حالا یکی از Character های اون رشته رو تغییر بدید و نتیجه رو مجددا بررسی کنید. خواهید دید که hashValue تغییر کرده... در توابع Hash به داده ای که قصد Hash کردنش رو داریم message گفته میشه و خروجی تابع رو با نام digest میشناسیم. هر تابع hash باید حداقل 3 ویژگی داشته باشه که قبلا در اینجا (http://mehdi.biz/blog/2007/06/10/gethashcode-does-it-return-unique-values-for-different-inputs/) به اون اشاره کرده ام.

اما در مورد Salt Value... ابتدا بگم برای تولید Salt Value میتونید بدین شکل عمل کنید:


byte[] buffer = new byte[SaltSizeInBytes];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(buffer);

و هرگز سعی نکنید از کلاس Random برای اینکار استفاده کنید (قبلا در این مورد توضیح داده ام؛ لطفا جستجو کنید). وقتی Salt Value ایجاد شد، میتونید اونو به Byte های مربوط به داده ورودی بچسبونید (در ساده ترین حالت) و سپس بایت های بدست آمده جدید (حاوی داده اصلی و Salt که پشت سرهم در یک Byte Array قرار گرفته اند) رو Hash کنید. فقط دقت کنید که Salt Value رو نیز باید در جایی نگهداری کنید تا بعدا بتونید با استفاده از اون ورودی مورد نظر رو Hash کنید. برای مشاهده یک نمونه کد، لطفا به این آدرس (http://stackoverflow.com/questions/2138429/hash-and-salt-passwords-in-c-sharp) رجوع کنید.

موفق باشید.

پاورقی: به سوالات دیگه شما در این تاپیک در اولین فرصت پاسخ خواهم داد.

programer-ir
یک شنبه 15 آبان 1390, 15:04 عصر
اما خروجی این کلاس که 44 بایت.............

mehdi.mousavi
یک شنبه 15 آبان 1390, 15:30 عصر
اما خروجی این کلاس که 44 بایت.............

خروجی کدوم تابع (نه کلاس) 44 بایته؟
من خروجی متود ComputeHash از کلاس SHA256Managed رو عرض کردم که 32 بایته...

A.Yousefi
یک شنبه 15 آبان 1390, 19:34 عصر
ممنون آقای موسوی،شما واقعا کارت درسته.
من برای ذخیره این hash ایجاد شده باید جنس فیلد تیبلمو binary تعریف کنم؟
اگه بخوام به صورت آزمایشی اونو تو یه لیبل نمایش بدم ببینم کد ایجاد شدرو باید چیکار کنم؟

Himalaya
دوشنبه 16 آبان 1390, 20:09 عصر
سلام

من برای ذخیره این hash ایجاد شده باید جنس فیلد تیبلمو binary تعریف کنم؟بستگی به خودتون داره. فرض کنید یه تابع واسه این کار نوشتید که تو ورودی یه مقدار String میگیره.
تابع زیر رو در نظر بگیرید

private static string GetSHA256(string text)
{
var message = System.Text.Encoding.Default.GetBytes(text);
var hashString = new SHA256Managed();
var hashValue = hashString.ComputeHash(message);
return hashValue.Aggregate(string.Empty, (current, x) => current + String.Format("{0:X}", x));
}

میتونید ورودی String بدید و خروجی String بگیرید و از این خروجی هر جا که خواستید استفاده کنید. (همونطوری که آقای موسوی گفتن، متغیر hashvalue اینجا 32 بایت هستش که تو خط آخر، هر بایت به صورت هگز، تو دنباله هم قرار میگیرن. برای مثال اگه فرض کنیم 2 بایت داریم و بایت اول برابر 130 و بایت دوم برابر 216 باشه، مقدار 82D8 تو خروجی قرار میگیره)
یا اینکه خط آخر تابع بالا رو در نظر نگیرید و خروجی تابع رو از نوع آرایه بایت در نظر بگیرید و hashvalue رو Return کنید


اگه بخوام به صورت آزمایشی اونو تو یه لیبل نمایش بدم ببینم کد ایجاد شدرو باید چیکار کنم؟از تابع بالا با خروجی String (و فرمت مورد نظر) استفاده کن

programer-ir
دوشنبه 16 آبان 1390, 21:02 عصر
میشه خط آخر برنامه رو توضیح بدید

Himalaya
دوشنبه 16 آبان 1390, 21:10 عصر
میشه خط آخر برنامه رو توضیح بدیدمعادل LINQ-expression کد پایین هستش


var result = string.Empty;
foreach (var b in hashValue)
result = result + String.Format("{0:X}", b);
return result;
البته اینم بگم که خط آخر پست 12 یا کدای همین پست (که معادل هم هستن) کار خاصی انجام نمیدن و فقط بایت جاری تو آرایه hashvalue رو از حالت دسیمال (مبنای 10) به هگز (مبنای 16) تبدیل میکنه و همه بایت ها رو به همین صورت، پشت سر هم قرار میده.

A.Yousefi
دوشنبه 16 آبان 1390, 22:06 عصر
معادل LINQ-expression کد پایین هستش


var result = string.Empty;
foreach (var b in hashValue)
result = result + String.Format("{0:X}", b);
return result;
البته اینم بگم که خط آخر پست 12 یا کدای همین پست (که معادل هم هستن) کار خاصی انجام نمیدن و فقط بایت جاری تو آرایه hashvalue رو از حالت دسیمال (مبنای 10) به هگز (مبنای 16) تبدیل میکنه و همه بایت ها رو به همین صورت، پشت سر هم قرار میده.
ممنون جناب karaji333
به ذهنم رسیده بود که باید از foreach استفاده کنم ولی گفتم شاید کار درستی نباشه،حالا که شما نوشتی مطمئن شدم راهش همینه.
خروجی روش SHA512 به صورت 64 بایتیه؟ این روش ها از لحاظ امنیت هش تولید شده با هم تفاوت ندارن؟ یعنی منظورم اینه که نمیگن مثلا SHA512 از SHA256 امن تره؟!

programer-ir
دوشنبه 16 آبان 1390, 22:23 عصر
هر دو این الگوریتم ها خروجیش 32 بایتی

Himalaya
دوشنبه 16 آبان 1390, 22:43 عصر
سلام

خروجی روش SHA512 به صورت 64 بایتیهبله. عدد آخر تعداد بیتها رو نشون میده. 512bit/8=64byte

این روش ها از لحاظ امنیت هش تولید شده با هم تفاوت ندارن؟ آقای موسوی جواب دادن

NSA در سال 2001، مجموعه توابع Hashing جدیدی رو تحت قالب SHA-2 (که متشکل بود از SHA-224، SHA-256، SHA-384، SHA-215) عرضه کرد که تنها Block Size اونها متفاوت بود. فرضا SHA-256 حاوی Block Size ای بطول 32 بایت (یا همون 256 بیت) هستش.
وقتی میگیم SHA-256 منظورمون اینه که داده ای (با هر حجمی) به این تابع میدیم و خروجی این تابع، همواره آرایه ای از 32 بایت یا 256 بیت هستش.
یعنی منظورم اینه که نمیگن مثلا SHA512 از SHA256 امن تره؟!نمیدونم ولی به نظرم اگه فقط از نظر تعداد بایتها (و نه الگوریتم) با هم تفاوت داشته باشن، در این صورت کسی که بتونه مقدار اولیه رو از روی رشته هش شده (توسط الگوریتم مثلا SHA224) بدست بیاره، با همون روش بتونه مقدار اولیه رو از رو رشته هش شده توسط الگوریتم SHA512 هم بدست بیاره (فقط شاید کار طولانی تر باشه)

هر دو این الگوریتم ها خروجیش 32 بایتیتوضیح داده شد.

فرض کنید یه رشته رو توسط الگوریتم SHA512 که 64 بایتی هستش Hash میکنید. میدونیم که هر بایت نهایتا 255 دسیمال رو تو خودش ذخیره میکنه که بعد از تبدیل به هگز میشه FF. پس حداکثر 64*2 کاراکتر توسط تابع پست 12 باید تولید بشه (البته باید به جای SHA256Managed از کلاس SHA512Managed استفاده بشه). ولی بعضی وقتا ممکنه یه رشته رو بدید به تابع بالا و بعد که طول رشته بازگشتی رو بدست میارید مثلا بزنه 123. دلیلش اینه که اگه مثلا یکی از بایتها مقدار 5 دسیمال رو داشته باشه، در این صورت مقدار هگز اون هم برابر 5 هستش و اینجا 1 کاراکتر تولید میشه، نه 2 تا. اختلاف 128 با عدد به دست اومده به این خاطر هستش. برای اینکه در هر حالتی، حداکثر تعداد کاراکترها تولید بشه از فرمت زیر استفاده کنید

{0:X2}

fakhravari
سه شنبه 17 آبان 1390, 01:11 صبح
با سلام
دوستان در پایان این پست ممنون میشم سمپل نتیجه گیری بزارین
با سپاس

A.Yousefi
سه شنبه 17 آبان 1390, 16:51 عصر
با سلام
دوستان در پایان این پست ممنون میشم سمپل نتیجه گیری بزارین
با سپاس
راستش هنوز این تاپیک تموم نشده! من هنوز جواب چنتا از سوالام مونده که آقای موسوی قراره لطف کنن اونارو هم جواب بدن تا یه تاپیک پربار بشه این تاپیک،اما روش Hash&Salt رو که آقای موسوی لطف کردن و لینکشو (http://stackoverflow.com/questions/2138429/hash-and-salt-passwords-in-c-sharp) دادن ولی من هنوز درس حسابی نفهمیدم این Salt Value تولید شدرو چجوری باید ذخیره کنم که بعدا بفهمم مربوط به کدوم رشته Hash بوده؟

mmnoody2006
سه شنبه 17 آبان 1390, 17:30 عصر
بنابراین، از یکی از الگوریتمهای SHA256، SHA384 یا SHA512 استفاده کنید. برای اینکار نیز می تونید از یکی از کلاس های زیر استفاده کنید:

اگه آقای موسوی این پست رو میبینن لطفا یه توضیحی به من بدن ممنون می شم .

دوست عزیز همون طور که خودتون می دونید برای تولید هر کدوم از این الگوریتم ها سرور باید پروسس زیادی رو مصرف کنه بخصوص وقتی الگوریتم بزرگتر می شه حالا بر روی برنامه ای که استفاده از این الگوریتم ها زیاده بازدهی پایین نمیاد ؟ البته من پست های بقیه دوستان رو هنوز مطالعه نکردم

mehdi.mousavi
سه شنبه 17 آبان 1390, 19:08 عصر
سلام.


راستش هنوز این تاپیک تموم نشده! من هنوز جواب چنتا از سوالام مونده که آقای موسوی قراره لطف کنن اونارو هم جواب بدن تا یه تاپیک پربار بشه این تاپیک،اما روش Hash&Salt رو که آقای موسوی لطف کردن و لینکشو (http://stackoverflow.com/questions/2138429/hash-and-salt-passwords-in-c-sharp) دادن ولی من هنوز درس حسابی نفهمیدم این Salt Value تولید شدرو چجوری باید ذخیره کنم که بعدا بفهمم مربوط به کدوم رشته Hash بوده؟

ببینید. وقتی کاربر Account ای ایجاد میکنه (و طبیعتا کلمه عبوری برای خودش انتخاب کرده) شما میتونید Salt Value مورد نظر رو در کنار نام کاربری اون کاربر در بانک ذخیره کنید.
هر گاه کلمه عبور تغییر کرد (با امکان Reset Password)، اونوقت شما Salt Value ی جدیدی تولید می کنید و مقدار جدید رو در بانک برای همون کاربر نگه میدارید...


برای تولید هر کدوم از این الگوریتم ها سرور باید پروسس زیادی رو مصرف کنه بخصوص وقتی الگوریتم بزرگتر می شه حالا بر روی برنامه ای که استفاده از این الگوریتم ها زیاده بازدهی پایین نمیاد ؟ البته من پست های بقیه دوستان رو هنوز مطالعه نکردم

این بستگی داره که Hash چه داده ای رو بخواهیم بدست بیاریم. وقتی که کاربر کلمه عبور خودش رو تغییر میده، یا Account ای برای خودش ایجاد میکنه، کلمه عبور رو Hash میکنیم و در بانک نگهداری میکنیم. دیگه از اون پس فقط هنگام login هست که باید داده ورودی رو hash کنیم، با اطلاعات از قبل hash شده مقایسه کنیم و ... از اونجاییکه طول کلمات عبور محدود هستش، الگوریتم مزبور باری روی سرور نمیذاره. لطفا این مساله رو نیز مد نظر داشته باشید که SHA-512 برخلاف انتظار عموم، از Performance بالاتری برای تولید Digest ای به همون طول (توسط الگوریتم SHA با Block Size های کمتر) برخورداره... به بیان دیگه، برای تولید Hash Value ای به طول 64 بایت با SHA-512 به قبل، نیاز به پردازش و زمان بیشتری هستش (الان نام کتاب خاطرم نیست، اما در کتابی که نحوه پیاده سازی SHA-512 رو در سخت افزارها بصورت Embedded عنوان کرده بود، مقایسه بسیار دقیقی بین کارایی SHA-512 برای تولید Digest ای بطول 64 بایت، با الگوریتمهای دیگه برای تولید Digest ای با همون طول، انجام شده بود که این مساله رو به وضوح نشون میداد).

در هر حال، اگر دنبال اعداد و ارقام هستید، خوندن این Document (http://msdn.microsoft.com/en-us/library/ms978415.aspx) شما رو با کارایی الگوریتم های Hashing در .NET آشنا خواهد کرد.

موفق باشید.

A.Yousefi
سه شنبه 17 آبان 1390, 23:36 عصر
جناب موسوی ممنون از پاسخای جامعتون،میشه لطف کنید به سوال پست ششم هم جواب بدین:
"تو جاهایی که نیاز داریم بعد از رمزنگاری به ورودی اولیه برسیم شما چه روشیو پیشنهاد میکنین؟
منظورم اینه که از نظر شما بهترین الگوریتم قابل بازگشت و نحوه استفاده از اون چیه؟ "

mehdi.mousavi
چهارشنبه 18 آبان 1390, 09:49 صبح
"تو جاهایی که نیاز داریم بعد از رمزنگاری به ورودی اولیه برسیم شما چه روشیو پیشنهاد میکنین؟ منظورم اینه که از نظر شما بهترین الگوریتم قابل بازگشت و نحوه استفاده از اون چیه؟ "

سلام.
پاسخ به این سوال، بستگی به این داره که چه چیزی رو در چه حوزه ای میخواهیم Encrypt کنیم. اگر امکان Encrypt کردن داده مورد نظر تحت Context کاربر (یا ماشین) فعلی وجود داره و قرار نیست این داده ها روی ماشین های دیگه (یا توسط User های دیگه) باز بشه، بهترین گزینه DPAPI ها هستن. Data Protection API مجموعه توابعی هستن که امکان Encrypt و Decrypt کردن داده ها رو تحت Context کاربر یا ماشین فعلی فراهم میکنن. یعنی چی؟ فرض کنید که برنامه شما توسط کاربری با User Account ای تحت نام X که در حال حاضر به ویندوز Login کرده، اجرا میشه. شما میتونید داده مورد نظرتون رو توسط DPAPI ها و تحت Context کاربر X رمزگذاری کنید، اما باید دقت داشته باشید که فقط و فقط، همین کاربر X قادر خواهد بود تا داده رمزنگاری شده رو از حالت رمز در بیاره. به همین شکل، شما میتونید داده مورد نظر رو تحت Context ماشینی که X روی اون Login کرده رمزنگاری کنید. بدین ترتیب، Y هم قادر خواهد بود تا داده مورد نظر رو رمزگشایی کنه، اما داده مزبور روی ماشین دیگه ای رمزگشایی نخواهد شد.

یکی از موارد خوب استفاده از این تکنیک، Web App ها هستن. از اونجاییکه میشه داده ها رو Machine-Specific رمزنگاری کرد، در برنامه های ASP.NET میشه از این روش استفاده کرد. اما سوالی که ممکنه پیش بیاد اینه که آیا در Web Farm ها به مشکل برنخواهیم خورد؟ (Web Farm چیه؟ فرض کنید درخواست شما به دست ماشین 1 در Cloud میرسه، داده رمزنگاری میشه و در بانک ذخیره میشه. درخواست بعدی برای رمزگشایی همون داده به دست ماشین 2 میرسه. از اونجاییکه گفتیم داده ها روی ماشین دیگری رمزگشایی نخواهند شد، پس اینجا چیکار باید کرد؟) خوشبختانه ASP.NET ساز و کاری داره که میشه بر اساس اون کلید مورد نظر رو روی همه ماشین ها Set کرد و بدین ترتیب، داده رمزگذاری شده رو روی ماشین های دیگه نیز باز کرد...

لازم به ذکر هستش که DPAPI ها نیز از Triple DES استفاده میکنن، اما خوبیش اینه که تولید و محافظت از کلیدها رو خودشون به عهده گرفته اند. برای آشنایی با نحوه کار DPAPI ها، میتونید به این آدرس (http://www.obviex.com/samples/dpapi.aspx) رجوع کنید.

اما اگر به هر دلیلی، مایل به استفاده از DPAPI ها نیستیم، می تونیم از Triple DES بصورت مستقیم استفاده کنیم. برای آشنایی با نحوه انجام این کار، لطفا به این آدرس (http://msdn.microsoft.com/en-us/library/system.security.cryptography.tripledes.aspx) یا این آدرس (http://www.dijksterhuis.org/encrypting-decrypting-string/) رجوع کنید.

موفق باشید.

A.Yousefi
جمعه 27 آبان 1390, 22:12 عصر
سلام.


ببینید. وقتی کاربر Account ای ایجاد میکنه (و طبیعتا کلمه عبوری برای خودش انتخاب کرده) شما میتونید Salt Value مورد نظر رو در کنار نام کاربری اون کاربر در بانک ذخیره کنید.
هر گاه کلمه عبور تغییر کرد (با امکان Reset Password)، اونوقت شما Salt Value ی جدیدی تولید می کنید و مقدار جدید رو در بانک برای همون کاربر نگه میدارید...



موفق باشید.
سلام
آقای موسوی من دوباره یه سوال برام پیش اومده،ما با استفاده از SaltValue ها جلوی وارد شدن پسورد تکراری به دیتابیسو میگیریم در واقع پسوردای تکراریو از دید مهاجما پنهان میکنیم،اما هنوز جلوی حمله Btute Force رو نگرفتیم،درسته؟
بازم اگه بانک ما بیفته دست افراد Cracker میتونن با استفاده از این نوع حملات رشته های رمز شدرو رمزگشایی کنن دیگه درسته؟

A.Yousefi
شنبه 28 آبان 1390, 19:26 عصر
اصلا امکان حمله از نوع Brute Force به رشته های هش شده با SHA2 و تابع SHA256 اون وجود داره یا این خطر فقط رشته های هش شده با سایر روش ها مثه MD5 و SHA1 رو تهدید میکنه؟
مثلا تو این (http://www.md5decrypter.co.uk/sha1-decrypt.aspx) سایت و اکثر سایت های میشه رشته های هش شده با SHA1 و MD5 رو رمز گشایی کرد ولی سایت های زیادی برای رمزگشایی رشته های هش شده با SHA2 ندیدم،این (http://sha2decrypt.com/) سایت هست اما نمیدونم واقعا میتونن اینکار رو انجام بدن یا سر کاریه؟
در ضمن وقتی شما یه رشته هش شدرو میبینید از کجا میفهمین با چه روشی هش شده؟

A.Yousefi
شنبه 28 آبان 1390, 21:26 عصر
اما در مورد Salt Value... ابتدا بگم برای تولید Salt Value میتونید بدین شکل عمل کنید:


byte[] buffer = new byte[SaltSizeInBytes];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(buffer);

و هرگز سعی نکنید از کلاس Random برای اینکار استفاده کنید (قبلا در این مورد توضیح داده ام؛ لطفا جستجو کنید).
ببخشید سایز SaltValue چجوری تعیین میشه؟
من یه جا دیدم یه عدد رندم از 4 تا 8 به عنوان سایز در نظر میگرفت؟
مشکلی پیش نمیاد اگه سایزشو مثلا همیشه 10 در نظر بگیریم؟

mehdi.mousavi
چهارشنبه 02 آذر 1390, 10:08 صبح
ببخشید سایز SaltValue چجوری تعیین میشه؟ من یه جا دیدم یه عدد رندم از 4 تا 8 به عنوان سایز در نظر میگرفت؟ مشکلی پیش نمیاد اگه سایزشو مثلا همیشه 10 در نظر بگیریم؟

سلام.
نه مشکلی پیش نمیاد... سایزش رو هر چی بگیرید، در نهایت اونو باید به کلاس PasswordDriveBytes (http://msdn.microsoft.com/en-us/library/ms148133.aspx) بدید (بهمراه کلمه عبور مورد نظرتون) و یک Derived Key ازش بگیرید. سپس، از اون Derived Key در Encrypt کردن داده استفاده کنید.

موفق باشید.

پاورقی: الان سرم شلوغه، در اولین فرصت به اون سوال های قبلی پاسخ میدم.

A.Yousefi
پنج شنبه 03 آذر 1390, 09:01 صبح
سلام.
نه مشکلی پیش نمیاد... سایزش رو هر چی بگیرید، در نهایت اونو باید به کلاس PasswordDriveBytes (http://msdn.microsoft.com/en-us/library/ms148133.aspx) بدید (بهمراه کلمه عبور مورد نظرتون) و یک Derived Key ازش بگیرید. سپس، از اون Derived Key در Encrypt کردن داده استفاده کنید.

موفق باشید.

پاورقی: الان سرم شلوغه، در اولین فرصت به اون سوال های قبلی پاسخ میدم.
سلام آقای موسوی ، واقعا لطف کردین پاسخ دادین داشتم الان با خودم فک میکردم اگه هنوز جواب نداده باشن چی! حداقل الان خیالم راحت شد پستمو دیدین.
منظورتون از Derived Key چی بود؟من دو تا متود تعریف کردم تو یکیش Salt رو تولید میکنم تو اون یکی با concat,pwd میکنمش،البته هممونطور که گفتین Salt رو کنار pwd کاربر تو DB ذخیره میکنم،الان چیزی ذهنمو درگیر کرده مسئله BruteForce هست که تو پست 24 و 25 بهش اشاره کردم.

aserfg
یک شنبه 13 آذر 1390, 19:26 عصر
الان چیزی ذهنمو درگیر کرده مسئله BruteForce هست که تو پست 24 و 25 بهش اشاره کردم. ابتدا ببینیم حملات BruteForce به چه نوع کنشهایی گفته می شود .
تعریف : حملاتی که با تکرار زیاد کلمات عبور باعث شکستن آنها می شود .
راه حل : تعداد دفعاتی را که کاربر شما می تواند رمز عبور اشتباهی وارد کند محدودد نمایید، به عنوان مثال با سه دفعه ورود اشتباه پسورد ، دسترسی کاربر را برای مدت زمان مشخصی غیر ممکن نمایید .

در بحث امنیت ابتدا لازم است موارد استفاده هر کدام از روشها را بفهمیم بعد سراغ کدهای مربوطه برویم .

A.Yousefi
یک شنبه 13 آذر 1390, 20:38 عصر
ابتدا ببینیم حملات BruteForce به چه نوع کنشهایی گفته می شود .
تعریف : حملاتی که با تکرار زیاد کلمات عبور باعث شکستن آنها می شود .
راه حل : تعداد دفعاتی را که کاربر شما می تواند رمز عبور اشتباهی وارد کند محدودد نمایید، به عنوان مثال با سه دفعه ورود اشتباه پسورد ، دسترسی کاربر را برای مدت زمان مشخصی غیر ممکن نمایید .

لذا این نوع حملات چندان در ارتباط با مبحث کریپتوگرافی نیستند . در بحث امنیت ابتدا لازم است موارد استفاده هر کدام از روشها را بفهمیم بعد سراغ کدهای مربوطه برویم .
سلام
اول ممنون که پاسخ دادین.
مسئله محدود کردن تعداد دفعات وارد کردن پسورد نیست،من میگم اگه رشته هش شده کلمه عبور که با استفاده از روش SHA2 هش شده دست کسی بیفته اون فرد میتونه با استفاده از روش BruteForce کلمه عبور رو به دست بیاره؟،یعنی اونو رمزگشایی کنه؟
اگه با روشهایی مثه SHA1 و MD5 هش شده باشه که امکانش هست(همونطور که آقای موسوی گفتن)
اما آقای موسوی گفتن برین از SaltValue ها استفاده کنین،من اینو نفهمیدم که برای جلوگیری از وارد شدن پسورد تکراری به DB باید از Saltvalue ها استفاده کنیم یا برای جلوگیری از حملات BtuteForce?
چون از لحاظ منطقی اگه بشه رشته هش شدرو رمزگشایی کرد باید رشته ای که با Salt مخلوط شدرو هم بشه.

A.Yousefi
سه شنبه 22 آذر 1390, 23:05 عصر
سلام
من اینو نفهمیدم که برای جلوگیری از وارد شدن پسورد تکراری به DB باید از Saltvalue ها استفاده کنیم یا برای جلوگیری از حملات BtuteForce?
چون از لحاظ منطقی اگه بشه رشته هش شدرو رمزگشایی کرد باید رشته ای که با Salt مخلوط شدرو هم بشه.
من چند هفتس که منتظرم یکی به این پست من جواب بده،خواهشا اگه کسی میدونه دریغ نکنه،یا اگه براتون مقدوره چندتا لینک مفید معرفی کنین حداقل:ناراحت:

fakhravari
چهارشنبه 23 آذر 1390, 01:19 صبح
با سلام
دوستان نمونه کد زیر
رمز کننده را درست کنیم چگونه با رمز عبور کاربر مقایسه شود.
private static string CreatePasswordHash(string pwd, string salt)
{
string saltAndPwd = String.Concat(pwd, salt);
string hashedPwd = FormsAuthentication.HashPasswordForStoringInConfig File(saltAndPwd, "sha1");
return hashedPwd;

}

A.Yousefi
چهارشنبه 23 آذر 1390, 20:14 عصر
با سلام
دوستان نمونه کد زیر
رمز کننده را درست کنیم چگونه با رمز عبور کاربر مقایسه شود.
private static string CreatePasswordHash(string pwd, string salt)
{
string saltAndPwd = String.Concat(pwd, salt);
string hashedPwd = FormsAuthentication.HashPasswordForStoringInConfig File(saltAndPwd, "sha1");
return hashedPwd;

}
یعنی چی چجوری با رمز عبور مقایسه شه؟
خب رمز عبور کاربر رو دوباره با همین روش هش کن و با این مقداری که این متود برمیگردونه مقایسه کن دیگه.

rahmatr
چهارشنبه 23 آذر 1390, 21:45 عصر
من اینو نفهمیدم که برای جلوگیری از وارد شدن پسورد تکراری به DB باید از Saltvalue ها استفاده کنیم یا برای جلوگیری از حملات BtuteForce?
چون از لحاظ منطقی اگه بشه رشته هش شدرو رمزگشایی کرد باید رشته ای که با Salt مخلوط شدرو هم بشه.

ببینید در اصل هم برای جلوگیری از وارد شدن پسورد تکراری به DB از Saltvalue استفاده میشود و هم برای جلوگیری از حملات Bruteforce

زیرا Bruteforce (http://en.wikipedia.org/wiki/Brute-force_attack) رشته های مختلف را هش می کند و امتحان میکند تا به رشته هش شده مورد نظر برسد.
مثلا از "a" شروع می کند تا "z" بعد دو کاراکتریها و سه کاراکتریها و ... . بعد اعداد. بعد ترکیب اعداد و حروف.
بنابراین هر چه رشته اولیه بزرگتر باشد، دیرتر به آن می رسد.

من چند سال پیش برنامه ای نوشته بودم که با یوزر guest میشد پسورد admin ویندوز را پیدا کرد. پسوردهای زیر 5 کاراکتر کمتر از یک ساعت پیدا می شدند.

ممکن است کاربران شما پسوردهای حتی یک حرفی انتخاب کنند. با اضافه کردن مثلا salt ده حرفی، درحقیقت انگار کاربر پسورد 11 کاراکتری انتخاب کرده است. (البته در صورتی که هکر فقط رشته هش شده را دارد و Salt را ندارد و از روی هش می خواهد به پسورد برسد)

فرض کنید شما از salt استفاده نکرید و پسورد شما "123" است. در کمتر از 5 دقیقه، Bruteforce پسورد شما را پیدا می کند.
دقیقا به همین دلیل است که توصیه می کنند پسوردهای با طول بیشتر از 7 کاراکتر انتخاب کنید.

A.Yousefi
چهارشنبه 23 آذر 1390, 22:38 عصر
ب
B]بنابراین هر چه رشته اولیه بزرگتر باشد، دیرتر به آن می رسد.[/B]


ممنون از جوابتون،پس با وجود SaltValue ها هم اگه رشته هش شده دست کسی بیفته میتونه اونو رمزگشایی کنه اما به دردسر بیشتری میفته.
با این وجود هیچ روش هشی یه روش صد در صد مطمئن نیست!

aserfg
چهارشنبه 23 آذر 1390, 22:40 عصر
http://www.article.kiansoftware.com/article.aspx?id=118&idauthore=1

A.Yousefi
چهارشنبه 23 آذر 1390, 22:43 عصر
http://www.article.kiansoftware.com/article.aspx?id=118&idauthore=1
مرسی ولی من مشکلم با نحوه انجام این کار نبود،نحوه انجامشو آقای موسوی لطف کردن گفتن.

rahmatr
پنج شنبه 24 آذر 1390, 00:13 صبح
با این وجود هیچ روش هشی یه روش صد در صد مطمئن نیست!

دو تا صد در صد داریم. یکی فیزیکی و یکی ریاضی.
از لحاظ ریاضی بله، هیچ روش هشی یه روش صد در صد مطمئن نیست.
ولی از لحاظ فیزیکی نه. چون ممکن است 10 به توان 1000 سال طول بکشد! تا یک پسورد هش شده پیدا شود، و این یعنی 100 درصد پیدا نمی شود.

aserfg
پنج شنبه 24 آذر 1390, 08:43 صبح
ممنون از جوابتون،پس با وجود SaltValue ها هم اگه رشته هش شده دست کسی بیفته میتونه اونو رمزگشایی کنه اما به دردسر بیشتری میفته.
با این وجود هیچ روش هشی یه روش صد در صد مطمئن نیست!


مرسی ولی من مشکلم با نحوه انجام این کار نبود،نحوه انجامشو آقای موسوی لطف کردن گفتن.

دوست عزیز زیاد سخت نگیرید، حتی الگوریتمهایی که مردود اعلام شده در سایتهای بسیار معتبر و بزرگی همچون گوگل داره استفاده می شه ولی کاربرد روشها متفاوت است .
79220

mina_ghorbani
پنج شنبه 24 آذر 1390, 21:16 عصر
این که گفتید saltVaue رو در جایی نگه داریم یعنی برای ذخیره password کاربر این کار رو انجام بدم ؟:
pass+ salt که hash شده رو تو فیلد password بزارم و یه فیلد هم داشته باشم salt رو در اون نگه دارم یا نه راه دیگه ای داره ؟
اگر بخوام این کار رو با کوکی انجام بدم چه طور؟
اگر سوالم خیلی مبتدیه معذرت می خوام

A.Yousefi
جمعه 25 آذر 1390, 12:56 عصر
چون ممکن است 10 به توان 1000 سال طول بکشد! تا یک پسورد هش شده پیدا شود، و این یعنی 100 درصد پیدا نمی شود.
پس اون سایتهایی که معرفی کردم چجوری رشته های هش شدرو رمزگشایی میکنن؟
دم دست ترینش این سایته (http://md5crack.com/).

rahmatr
جمعه 25 آذر 1390, 23:59 عصر
پس اون سایتهایی که معرفی کردم چجوری رشته های هش شدرو رمزگشایی میکنن؟
.
من که چند تا تست کردم پیدا نکرد. حتی 4 حرفی هم تست کردم.

البته رشته md5 را خودتان محاسبه کنید و یا از سایت دیگری برای تولید md5 استفاده کنید. چون هر بار که رشته ای را با این سایت hash می کنید، رشته را به دیکشنری خودش اضافه می کند.

این سایت ها از یک دیکشنری شامل پسوردهایی که زیاد استفاده می شود، استفاده می کنند.

aserfg
شنبه 26 آذر 1390, 07:45 صبح
این که گفتید saltVaue رو در جایی نگه داریم یعنی برای ذخیره password کاربر این کار رو انجام بدم ؟

کاربر شما که از این مقدار اضافه شده به پسورد خودش خبر نداره ، برای همین باید این saltvalue رو در بانک ذخیره کنید و زمانی که کاربر پسورد خودش رو وارد کرد اون رو با saltvalue متناظر با نام کاربریش concat کنید و دو باره عملیات هش رو با تابعی که معرفی کردم انجام داده با پسورد هش شده مقایسه نمایید اگر درست بود کاربر شناسایی شده در غیر اینصورت پسورد وارد شده از سوی کاربر نادرست است .

اگر بخوام این کار رو با کوکی انجام بدم چه طور؟
ارتباطی با موضوع مورد بحث ندارد .

A.Yousefi
شنبه 26 آذر 1390, 17:43 عصر
من که چند تا تست کردم پیدا نکرد. حتی 4 حرفی هم تست کردم.

البته رشته md5 را خودتان محاسبه کنید و یا از سایت دیگری برای تولید md5 استفاده کنید. چون هر بار که رشته ای را با این سایت hash می کنید، رشته را به دیکشنری خودش اضافه می کند.

این سایت ها از یک دیکشنری شامل پسوردهایی که زیاد استفاده می شود، استفاده می کنند.
برای اینکه در سریع ترین زمان مممکن پیدا کنه باید عضو سایت بشین و البته یه حق عضویتی هم پرداخت کنید اما مطمئنا کار میکنه اون سایت فقط یه نمونه بود هزاران سایت هست که تو این زمینه فعالیت میکنه کافیه سرچ کنین.

البته رشته md5 را خودتان محاسبه کنید و یا از سایت دیگری برای تولید md5 استفاده کنید. چون هر بار که رشته ای را با این سایت hash می کنید، رشته را به دیکشنری خودش اضافه می کند.
این سایت ها از یک دیکشنری شامل پسوردهایی که زیاد استفاده می شود، استفاده می کنند.
من اینو متوجه نشدم یعنی چی که البته خودتان md5 را محاسبه کنید؟؟
این سایت ها با استفاده از روش BruteForce و البته استفاده از GPU در کنار CPU اینکار رو انجام میدن که یه کاربر معمولی با سیستم توی خونش نمیتونه انجام بده.

hobab-theme
پنج شنبه 18 اسفند 1390, 16:30 عصر
همون طور که rahmatr گفتن این سایتها از دیکشنری داخلی خودشون استفاده می کنن. اگه رشته هش شده شما تو دیکشنری موجود بود که جواب رو به شما نشون میده. در غیر اینصورت هش شما رو به عنوان یک رشته جدید وارد دیکشنری میکنه واسه استفاده های بعدی

hobab-theme
پنج شنبه 18 اسفند 1390, 16:59 عصر
دوست عزیز زیاد سخت نگیرید، حتی الگوریتمهایی که مردود اعلام شده در سایتهای بسیار معتبر و بزرگی همچون گوگل داره استفاده می شه ولی کاربرد روشها متفاوت است .
79220

دقیقا با پاسخ ایشون موافقم. شما مسئله رو زیادی سخت گرفتید.
اینکه بدنبال راه حل مطمئنی هستید خیلی خوبه ولی:
شما باید در نظر داشته باشید که اگر امنیت داده ها برای شما مهم هست، باید در دوره های زمانی خاصی الگوریتم هاتون رو عوض کنید. هیچ وقت نباید برای برقراری امنیت راکد بود. هکرها سایتهایی با الگوریتم های راکد رو بسیار دوست دارند. دقیقا مثل موتورهای جستجو، اگر کسی تونست بگه من الگوریتم مثلا گوگل رو پیدا کردم !! چون مدام در حال تغییر هستند.
مسلما هیچ برنامه ای 100% نیست ولی این برنامه نویس هست که با درایت خودش میتونه یک برنامه شبح ایجاد کنه که کسی نتونه از ماهیت اصلی اون سر در بیاره.
موفق باشید

sinanice206
چهارشنبه 19 شهریور 1393, 00:42 صبح
؟؟؟؟؟:قلب: