آشنایی با کلاس SecureString در Net.

جمعه 4 اردیبهشت 1394

در این مقاله نحوه استفاده از کلاسی خاص برای افزایش امنیت با نام (SecureString) را شرح خواهیم داد

به طور کلی در بعضی سناریو ها با اطلاعاتی حساس مانند رمز عبور ، شماره کارت اعتباری و یا اطلاعات شخصی افراد مواجه می شویم  و این اطلاعات را در سراسر برنامه برای استفاده و اقدامات بیشتر بکار میبریم .عموماً ما از کلاس System.String استفاده می کنیم .سؤالی که پیش می آید این است که آیا این کلاس از امنیت لازم برخوردار است ؟

محدودیت های System.String

متغیر های رشته ای در پشته ایجاد می شوند و با Garbage Collector ها برای آزاد سازی حافظه اشغال شده حذف می شوند .در برخی موارد ممکن است که از روی حافظه سرور پس از انجام عملیات پاک سازی به مدت 2 ساعت نیز حذف نشوند .بنا براین همیشه احتمال خطر نمایش این اطلاعات به این دلیل که نرم افزار شما نتوانسته آنها را حدف کند ، وجود دارد .

راه حل :

Net. نسخه 2.0 و به بعد یک راه امن برای مدیریت اطلاعات حساس را فراهم کرد و آن ایجاد کلاس SecureString است که از  System.Object.SecureString ارث بری می کند که باعث میشود که Garbage Collector ها قادر به دریافت و یا کپی این اطلاعات نباشند .

این کلاس در فضای نام  System.Security قرار دارد .این کلاس به صورت پیش فرض رابط IDisposable را پیاده سازی می کند .هنگامی که عملیات بر روی این کلاس به اتمام می رسد ، متغیرها متد Dsipose را در یک بلوک Try/Catch فراخوانی می کنند .روشی دیگر برای رهایی از Garbage Collector ها استفاده از این کلاس در Statement جاری میباشد .

متغیر SecureString مشابه متغیر رشته ای می باشد که حاوی مقادیر متن می باشد .اگرچه مقدار SecureString رمز نگاری شده است و از طریق نرم افزار مربوط به حافظه سیستم و یا Garbage Collector های موجود در         Net Framework.  قابل تشخیص می باشند .حتی اگر کاربر با هدف های مخرب یک رونوشت از آن در اختیار داشته باشد ، محتوای این متغیر ها قابل دسترسی و بازخوانی نمی باشند .

برای ذخیره  این instance و پیش گیری از در معرض خطر قرار گرفتن اطلاعات ، هیچ کدام از از متد های اعضا و یا خاصیت های مربوط به کلاس مجاز به ویرایش یا مقایسه مقادیر نیستند .اگر چه برخی اعضا از کلاس System.Runtime.InteropSerivce.Marshal امکان تغییر و ویرایش این مقادیر را در instance دارند .

برای درک بیشتر به مثال زیر توجه فرمایید :


    public class Example  
    {  
        public static void Main()  
        {  
            // Instantiate the secure string.  
            SecureString password = new SecureString ();  
            ConsoleKeyInfo consoleKey;  
      
            Console. Write ("Enter password: ");  
            do {  
               consoleKey = Console.ReadKey (true);  
      
               // Ignore any key out of range.   
               if (((int) consoleKey.Key) >= 65 && ((int) consoleKey.Key <= 90)) {  
                  // Append the character to the password.  
                  password.AppendChar (consoleKey.KeyChar);  
                  Console. Write ("*");  
               }     
            // Exit if Enter key is pressed.  
            } while (consoleKey.Key! = ConsoleKey.Enter);  
            Console.WriteLine ();  
      
            try  
            {  
                Process. Start ("Notepad.exe", <USERNAME>, password, <DOMAINNMAE>);  
            }  
            catch (Win32Exception e)  
            {  
                Console.WriteLine (e.Message);  
            }  
        }  
    }  

 

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید