ورود

View Full Version : سوال: secure string



arash_vb
جمعه 19 مهر 1387, 09:20 صبح
از دوستان سوالی دارم...آیا کسی هست که در مورد امنیت متغیرهای نوع secure string در دات نت اطلاعات داشته باشد؟ آیا اطلاعاتی که در این نوع متغیرها رد و بدل میشوند مثل رشته های عادی به راحتی قابل شناسایی هستند برای کرکر ها؟به عبارت دیگر استفاده از این نوع رشته ها میتواند اثر خوبی در امنیت داشته باشد؟
لطفا راهنمایی کنید

Mehdi Asgari
جمعه 19 مهر 1387, 11:31 صبح
محتویات کلاس SecureString ، مثل رشته های معمولی ، plain نیست و encrypt میشه. در ضمن این کلاس مثل رشته های معمولی immutable نیست و محتوای اون قابل تغییره (مگر این که از متد MakeReadOnly استفاده کنید)
رشته های معمولی جای خوبی برای نگهداری اطلاعات مهم (مثل رمز عبور) نیستن. در ضمن نمیشه زمان دقیق پاک شدنشون از حافظه رو تعیین کرد (این که کی GC اون ها رو حذف خواهد کرد) اما هر وقت که به یک شی از نوع SecureString نیاز نداشتید ، میتونید پاکش کنید از حافظه.
(دقت هم کنید متدهایی مثل Compare نداره که بشه ازشون سواستفاده کرد. و ورودی رو فقط به صورت Char یا اشاره گر به Char قبول می کنه ، نه String)
وقتی داده هاتون رو توی یک SecureString می ریزید ، هم encrypt شده است و هم pinned-down (یعنی GC اون ها رو جابجا نمی کنه تو حافظه و همچنین مطمئن هستید که چند تا کپی از اون تو حافظه وجود نداره)
برای دریافت اطلاعات از یک SecureString از متد Marshal.SecureStringToBSTR استفاده می کنید.
این یک مثال خیلی ساده:

SecureString ss = new SecureString();
ss.AppendChar('M');
ss.AppendChar('e');
ss.AppendChar('h');
ss.AppendChar('d');
ss.AppendChar('i');
ss.MakeReadOnly();
IntPtr ip = Marshal.SecureStringToBSTR(ss);
Console.WriteLine(Marshal.PtrToStringAuto(ip));
Marshal.FreeBSTR(ip);
ss.Clear();

این هم یک منبع خوب (البته خیلی مطلب دربارۀ SecureString هست. یه سرچ بزنید)
http://blogs.msdn.com/shawnfa/archive/2004/05/27/143254.aspx

arash_vb
جمعه 19 مهر 1387, 12:21 عصر
با تشکر از شما این موارد رو در msdn دیدم اما سوال من در مورد این هست که آیا در صورت استفاده از این نوع رشته برای تبادل و نگهداری اطلاعات حساس مصل رمز ها و .. امنیت آنها بیشتر میشود؟ و آیا اصلا "امن" میشوند؟ آیا کرکرها باط به سادگی می توانند به آنها پی ببرند؟

Mehdi Asgari
شنبه 20 مهر 1387, 12:22 عصر
تبادل نه ، ولی نگهداری چرا.
شما به هر حال ورودی رو از TextBox یا Console خواهید گرفت که چندان امن نیستن و کرکر میتونه به داده های اون ها در حافظه دسترسی پیدا کنه.
یک SecureTextBox :
http://www.theglavs.com/DownloadItem.aspx?FileID=46
SecureString در دات نت تو بعضی از کلاس های System.Security.Cryptography استفاده شده. همینطور تو فیلد Password کلاس ProcessStartInfo)
SecureString از DPAPI استفاده می کنه ، پس میشه گفت امنیت خیلی خوبی رو فراهم می کنه. کسی نمیتونه بگه چه چیزی قابل کرک هست یا نه ، خودم هم کرکر نیستم ، ولی مطمئن باشید ، "به سادگی" کرک نخواهد شد.
{DPAPI یک API هست که از زمان Windows 2000 عرضه میشه و کار اصلیش دریافت داده و رمزگذاری اون توسط رمزنگاری متقارنه. برای کلید هم از رمز عبور کاربر استفاده می کنه}
DPAPI خیلی قابل اطمینانه.
منابع زیای هم درباره اش هست تو نت ، مثل:
http://skilldrive.com/book/DOTNETinSamples.htm#_Toc112335248
در ضمن مایکروسافت از DPAPI در IE7 ، و IIS (برای SSL/TLS) و یه سری محصولات دیگه اش استفاده می کنه
(من با Reflector نگاه کردم ، SecureString از توابع advapi32.dll استفاده می کنه)