امنیت داده ها در ASP.NET Core

سه شنبه 12 اردیبهشت 1396

این مقاله در مورد اینکه چطورامنیت داده در ASP.NET Core با استفاده از( API محافظت داده) به کار می رود، به شما ایده هایی می دهد. ASP.NET Core یک API محافظ تهیه می کند که به ما کمک می کند تا داده ها را با استفاده از تکنیک های رمز نگاری و هشینگ ، رمزنگاری کنیم .به علاوه برای رمز نگاری، کلید توسط خود سیستم تهیه و نگهداری می شود بنابراین رابط های خارجی بلاک می شوند و داده ها امن تر خواهند شد.

امنیت داده ها در  ASP.NET Core

ASP.NET Core چیست؟

ASP.NET 15 سال پیش طراحی و معرفی شد، از آن زمان میلیون ها برنامه نویس از آن استفاده کرده اند و اپلیکیشن های خوبی ساخته اند، مایکروسافت هر ساله ویژگی های جدیدی ارائه می دهد و قابلیت های متفاوتی را در جهت قوی تر کردن آن اضافه می کند. اخیرا متناسب با نیاز تکنولوژی مدرن امروز آنها ASP.NET Core را معرفی کرده اند که Open Source و دارای فریمورک cross-platform( قابل اجرا بر روی ویندوز و مک و لینوکس شامل RedHat و Ubuntu) است که به یک سری از اپلیکیشن ها مانند اپلیکیسن های ابری ، IOT و اپلیکیشن های موبایل  کمک می کند.

ASP.NET Core در ژانویه2016 منتشر شد.

در صورتیکه میخواهید برنامه هایی ایمن و کاملا امن با Asp.Net Core ایجاد کنید پیشنهاد میکنیم دوره آموزش امنیت در Asp.Net Core را در تاپ لرن مشاهده کنید .

چرا ما به  ASP.NET Core  نیاز داریم؟

حالا مهم ترین نکته این است که چرا ما به ASP.NET Core نیازمندیم ؟یا چرا ما از آن استفاده می کنیم؟ چه مزیتی نسبت به  ASP.NET دارد؟ امروزه اپلیکیشن های وب تنها در دسکتاپ ها و لپ تاپ ها وجود ندارد و به سمت ابزارهای هوشمند ، اپلیکیشن های کلود (ابری)، موبایل ها وIoT ها حرکت کرده است، به علاوه پلتفرم های دیگر (لینوکس و مک) را نیز تحت تاثیر قرار داده است.برای پشتیبانی از همه ی اینها ما به  ASP.NET Core نیازمندیم.

 ASP.NET Core دیگر به  system.web.dll وابسته نیست و در خودش تنظیمات داخلی پکیج nuget را دارد که  اجازه می دهد سایز اپلیکیشن ، کارایی ، امنیت و سرعت توسعه را بهینه کنید.بنابراین به صورت خلاصه  به علت های استفاده از آن خواهیم پرداخت.

یک سری از ویژگی های کلیدی آن عبارتند از :

متن باز(Open Source): متن باز است(به MIT  و آپاچی وصل شده است.)

سازگاری: به طور گسترده ای با فریمورک .NET و مونو (Mono) و زامارین سازگار است.

توسعه آسان و راحت

سبک و ماژولار

پشتیبانی از Cross plat-form

میزبانی IIS یا سازگار با میزبانی شخصی

.NET Framework در مقایسه با  .NET Core

مطمئنا .NET فریمورک استوار و پایدار است چون هیچ پکیج API را با خود حمل نمی کند، فقط کاربران پکیج را از ناگت (nuget) نصب می کنند و اپلیکیشن سفارشی خود را می سازند. .NET Core  شامل یک سری از کتابخانه ها به نام "CoreFX " و فایل های  اجرایی(runtime) که CoreCLR نامیده می شود، است که هردوی آنها در ناگت قرار داده شده است که کاربر بر اساس نیاز آن را دانلود می کند.

اجرای کد در.NET Core واقعا آسان است، فقط کافی است .NET Core SDK  را نصب نمایید، مقداردهی اولیه کنید، اپلیکیشن را اجرا نمایید و  پروژه را اجرا کنید، کار تمام شد.

امنیت در Web application

 در طی سالیان سال مردم تلاش فراوانی برای امنیت وب اپلیکیشن ها و داده های آن انجام دادند . برخلاف اپلیکیشن دسکتاپ ویندوز ،  API وب اپلیکیشن (DPAPI) امنیت داده ندارد و داده ها را رمزنگاری می کند ، اما  ASP.NET Core راه خیلی خوبی برای امنیت داده های شما دارد که درآن به وسیله یک پشته امنیتی همراه API آن به ما کمک می کند داده ها را با قابلیت مدیریت کلید رمزنگاری کنیم. اساسا این API های پنهان برای غلبه بر مشکلات فریمورک موجود مجددا طراحی شده است.

نیازهای امنیت داده 

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

با توجه به تکنیک ماژولار و سفارشی سازی ، یک سری اجزا در جاهایی بدون در نظر گرفتن سیستم ، مجدد استفاده می شوند . ما باید مطمئن شویم که داده ها با یکدیگر تداخل نداشته باشند. چیزهایی که ما برای رمزنگاری داده ها استفاده می کنیم مانند آدرس فایل ، حق دسترسی ، ذخیره سازی سمت سرور باید مطمئن باشد و نباید برای کاربران مشکوک باز شود.

به عبارت ساده تر طراحی امنیت داده باید معتبر، امن ، با پیاده سازی آسان ، مجزا از عملیات های عادی باشد و منطق هسته (Core) باید از دید توسعه دهنده پنهان باشد.

استراتژی های امنیت

همه ی الزامات بالا را در ذهن خود نگه دارید، ASP.NET Core با استراتژی امنیت زیر آمده است:

1)توسعه سیستم امنیت داده که به پیکربندی کمتری نیاز دارد.

2) منطق کلید نباید برای توسعه دهنده فاش شود ، اغلب توسعه دهنده به متن خام رمز (cypoher) دسترسی ندارد.

3)کلید رمزنگاری باید توسط سیستم خودش نگهداری و محافظت شود.

 برای در بر گرفتن همه ی این نیاز ها ASP.NET Core با بسته ی محافظت داده آمد تاAPI  آن به ما کمک کند، مکانیزم رمزنگاری و هش(hashing) را پیاده سازی کنیم.

محافظت داده چیست و چه کسی می تواند از آن استفاده کند ؟

اساسا API محافظت داده یک کلید مخفی برای رمزنگاری را تولید و مدیریت می کند که توسط 3 نوع کاربر قابل استفاده است:

1)توسعه دهنده های اپلیکیشن و فریمورکی که نمی خواهند بدانند API محافظت داده و بسته چطور کار می کند و چطور پیکربندی می شود، فقط می خواهند  به API یک ورودی بفرستند و یک خروجی دریافت کنند.

2)ادمین سیستم و توسعه دهنده هایی که نمی خواهند فایل های مخفی و کلیدهای خود را در مسیر پیش فرض با تنظیمات پیش فرض ذخیره کنند . بنابراین هیچ کس نمی تواند به راحتی آن را دنبال کند. برای مثال داده ها به صورت پیش فرض نباید در مسیر '%AppData%' ذخیره شوند ( که مسیر پیش فرض است)، ASP.NET Core توسط رابط 'IDataProtectionBuilder'  به ما اجازه می دهد همه ی مسیرهاو تنظیمات پیش فرض را تغییر دهیم . برای محافظت از داده ASP.NET Core از هر دو تکنیک رمزنگاری و هشینگ استفاده می کند. حالا سوالی که درذهن به وجود می آید این است که رمزنگاری و هشینگ چیست؟ اگر هردو برای امنیت استفاده می شود چه تفاوتی بین رمزنگاری و هشینگ وجود دارد؟

رمزنگاری در مقایسه با هشینگ

رمزنگاری فرآیندی است که داده را به کاراکتر های ناخوانا و بی نظمی که طول ثابتی ندارد، تبدیل می کند. این فرآیند به کلیدی برای رمزنگاری داده نیاز دارد،رشته رمزنگاری شده به عنوان یک متن رمز  شناسایی می شود بنابراین با کمک یک کلید مخفی و یک الگوریتم رمزنگاری متن رمز تولید می شود. الگوریتم های رمزنگاری محبوب بسیاری وجود دارند مانند DES,  Triple DES, AES و ... .

هشینگ فرآیندی است که اگر داده هایی با طول ثابت رشته یا عدد در آن وارد شود ،برای ورودی های مشابه ، همیشه خروجی مشابهی تولید می کند . وقتی داده ای هش شود دیگر نمی تواند به متن اولیه بازگردد . بنابراین ما هرگز داده واقعی را که فرستادیم نخواهیم دید. برخی از تکنیک های هشینگ عبارتند از MD5,SHA و ... .

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

Namespace ها و کلاس ها

'Microsoft.AspNetCore.DataProtection'   فضای ناماصلی Core است، اگر شما فقط می خواهید از API محافظت داده استفاده کنید و نمی خواهید این مکانیزم را یاد بگیرید فقط namesapce، 'Microsoft.AspNetCore.DataProtection.Abstractions' را رفرنس دهید.

'Microsoft.AspNetCore.DataProtection.Extensions '  برای دریافت مزایای اضافه API هایی استفاده می شود که متعلق به پکیج core نیستند.

'Microsoft.AspNetCore.Cryptography.KeyDerivation' برای پسورد هشینگ استفاده می شود.

استفاده ازAPI

استفاده از محافظت داده خیلی ساده است، فقط کافی است شما namesapces های   'AspNetCore.DataProtection' و 'Extensions.DependencyInjection' را وارد کنید و شما برای محافظت از داده های خودتان به متد protect() نیاز دارید.( برای استفاده از متد protect()  ما باید با استفاده از یک پشتیبان گیر داده از اطلاعات پشتیبان تهیه کنیم).

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

رمزنگاری با استفاده ASP.NET Core

رمزنگاری به یک کلید برای رمز کردن داده نیاز دارد ، اما اینجا، کلید ساخته شده و به وسیله API خودش نگهداری می شود، این کلید ها با طول عمر پیش فرض 90 روز ساخته شده و درجای محرمانه ای(مناسبی) نگهداری می شوند.  این کلید موقتی است،API  امنیت داده برای محافظت کوتاه مدت داده مانندQuerystring و  cookies و ...  طراحی شده است.

قطعه کد زیر را ببینید

using System;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.DependencyInjection;

public class Program
{
    public static void Main(string[] args)
    {
        //use data protection services
        var SCollection = new ServiceCollection();

       //add protection services
        SCollection.AddDataProtection();
        var SerPro = SCollection.BuildServiceProvider();

        // create an instance of classfile using 'CreateInstance' method
        var instance = ActivatorUtilities.CreateInstance<ProClass>(SerPro);
        instance.getPutOut();
    }

    public class ProClass
    {
        IDataProtector _iPro;

        // the 'provider' parameter is provided by DI
        public ProClass(IDataProtectionProvider provider)
        {
            _iPro = provider.CreateProtector("ProClass");
        }

        public void getPutOut()
        {
            string input = "Hello World";

            // protect string
            string protectedString = _iPro.Protect(input);
           
            // protect string
            string unProtectedString = _iPro.Unprotect(protectedString);
        }
    }
}

//output
input : "Hello World"
protectedString : CfDJ8ICcgQwZZhlAlTZT....
unprotectedeString : "Hello World"

در مثال بالا ما یک شیء  'ServiceCollection' ساختیم  که برای ایجاد و افزودن سرویس های محافظت داده از آن استفاده می شود. بعد با استفاده از متد  'CreateInstance' یک جایگزین برای کلاس خودمان ساختیم . این متد به وسیله کلاس 'ActivatorUtilities' نمایش داده شد.(که یک کلاس کمکی استاتیک از namesapce،  'Microsoft.Framework.DependencyInjection' است )، سرانجام ما به سادگی متدهای 'Protect'  و  'Unprotect'  را فراخوانی می کنیم .

به این نکته توجه کردید که ما یک رشته به متد  'CreateProtector' ارسال کردیم؟ آیا می دانید این رشته چه چیزی را نمایش می دهد؟ این رشته 'purpose string'  نامیده می شود و اساسا برای ایجاد یک محیط ایزوله استفاده می شود مثلا ما به وسیله یک رشته ABC یک محافظ ایجاد می کنیم و از اطلاعات محافظت می کنیم ، این رشته نمی تواند توسط محافظی که با رشته ‘XYZ’ ایجاد شده است اطلاعات مشابهی را برگرداند . بنابراین یک مرحله تکرار می شود تا اطلاعات امن تر شوند..

هشینگ با استفاده از ASP.NET Core

به کمک پکیج 'Microsoft.AspNetCore.Cryptography.KeyDerivation'  ما می توانیم هشینگ را در ASP.NET Core پیاده سازی کنیم که دارای متد '"Pbkdf2' است که از الگوریتم  'PBKDF2 algorithm' برای هش کردن داده ها استفاده می کنند. در قطعه کد زیر می بینید که چطور امنیت داده با استفاده از هشینگ صورت می پذیرد.

using System;
using System.Security.Cryptography;
using Microsoft.AspNetCore.Cryptography.KeyDerivation;
 
public class Program
{
    public static void Main(string[] args)
    {
        string SimpleText = "myText";
 
        //Generate a 128-bit salt
       //**Salt: it is nothing but a random number
        byte[] Slt = new byte[128 / 8];
        using (var RandomNum = RandomNumberGenerator.Create())
        {
            RandomNum.GetBytes(Slt);
        }
 
        // Create 256-bit key using HMACSHA1 algorithm with 1000 iterations
        string secureHash = Convert.ToBase64String(KeyDerivation.Pbkdf2(
            password: SimpleText,
            salt: Slt,
            prf: KeyDerivationPrf.HMACSHA1,
            iterationCount: 1000,
            numBytesRequested: 256 / 8));

        System.IO.AppendAllText("D:\\hashed.txt", "HashedText : " + secureHash);
    }
}

در مثال بالا با کمک  الگوریتم  'HMACSHA1' (100 بار تکرار) ما یک رشته را برای رمزنگاری متن ، هش کردیم .

چه مشکلی در الگوریتم هش در  فریمورک  .NET وجود دارد؟

یه نکته وجود دارد که چرا ما به ASP.NET Core برای هش کردن رشته نیاز داریم ؟  در الگوریتم  فریمورک .NET موجود  چه مشکلی وجود دارد؟ فریمورک .NET موجود حاوی کلاس 'Rfc2898DeriveBytes' است که برای ساخت و هش رشته استفاده می شود اما یک سری محدودیت ها وجود دارد مانند :

فقط از الگوریتم HMACSHA1 استغاده می کند در حالیکه 'KeyDerivation.Pbkdf2'  (HMACSHA1, HMACSHA256, HMACSHA512)  را پشتیبانی می کند.

الگوریتم 'KeyDerivation.Pbkdf2' بهبود کارایی را پشتیبانی می کند درحالیکه  وابسته به سیستم عامل است ( اساسا در روش جدید سیستم عامل و پیاده سازی بهینه ترین راه را اتوماتیک تشخیص می دهد)

ما می توانیم پارامترهای ورودی برای هشینگ را تعیین کنیم (مقدار ، الگوریتم ، تعداد تکرار) در حالیکه کلاس هشینگ .NET موجود مقادیر پیش فرض برای این کار تهیه می کند.

چه جاهایی باید از این AP استفاده کنیم؟

تکنیک رمز نگاری ASP.NET Core می تواند برای استفاده در تکنیک مدیریت وضعیت کاربر مفید باشد مانند Querystring و کوکی ها ، که برای تولید اتوماتیک کلید رمزنگاری یک نقش امن ارائه می دهد.

تکنیک هشینگ ASP.NET Core برای نگهداری پسورد بسیار مناسب است ( چون نمی تواند به متن اولیه برگردد)

 امنیت داده به راحتی آب خوردن نیست ، بحث های زیادی پیرامون آن وجود دارد که در مقاله های بعدی در مورد نکات رمزنگاری و هشینگ و امنیت بیشتر صحبت خواهیم کرد.

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

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

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

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