مشکلی که با string معمولی وجود دارد این است که به صورت معمولی و غیر
رمزنگاری شده در حافظه قرار میگیرند و همچنین توسط برنامه هم قابل حذف از
حافظه نیستند. اگر محتویات آنرا تغییر دهید، یک وهله دیگر ایجاد شده و
وهله قبلی هنوز در حافظه قرار داد و البته ... هر زمان که GC صلاح دید
آنرا پس از مدتی حذف میکند اما نه بلافاصله. اصطلاحا به این نوع اشیاء
immutable هم گفته میشود.
SecureString اینبار mutable است و میتوان مقدار آنرا توسط برنامه واقعا تخریب کرد و منتظر GC نشد و تغییرات در آن، چندین کپی از آنرا ایجاد نمیکند. SecureString توسط کدهای unmanaged تهیه شده و دسترسی به محتوای آن به این سادگیها نیست. برای دسترسی به آن خارج از برنامه، یک شخص باید اشارهگر به (IntPtr unmanaged) این رشته رمزنگاری شده را بیابد. Marshal.PtrToStringBSTR فقط یک string pointer را دراختیار شما قرار میدهد.
ضمن اینکه امنیت بحثی نسبی است. اگر از خانه خارج میشوید بهتر است درب آنرا قفل کنید. اما این به معنای نفوذناپذیری 100 درصد خانه شما نیست ولی این امر «نسبت به» خانهای که درب آن کاملا باز است، خیلی بهتر است .
SecureString اینبار mutable است و میتوان مقدار آنرا توسط برنامه واقعا تخریب کرد و منتظر GC نشد و تغییرات در آن، چندین کپی از آنرا ایجاد نمیکند. SecureString توسط کدهای unmanaged تهیه شده و دسترسی به محتوای آن به این سادگیها نیست. برای دسترسی به آن خارج از برنامه، یک شخص باید اشارهگر به (IntPtr unmanaged) این رشته رمزنگاری شده را بیابد. Marshal.PtrToStringBSTR فقط یک string pointer را دراختیار شما قرار میدهد.
ضمن اینکه امنیت بحثی نسبی است. اگر از خانه خارج میشوید بهتر است درب آنرا قفل کنید. اما این به معنای نفوذناپذیری 100 درصد خانه شما نیست ولی این امر «نسبت به» خانهای که درب آن کاملا باز است، خیلی بهتر است .