ایجاد و مدیریت مجوزهای دیجیتالی در سی شارپ

یکشنبه 23 آبان 1395

مجوزهای دیجیتالی در ایجاد ارتباط امن بین دو طرف استفاده میشوند.در مجوزهای دیجیتالی, ما مطمئن هستیم که مردم در استفاده از سرویس ها و برنامه های ما می توانند ارتباط امن با یکدیگر و مردم و مصرف کنندگان و در کسب و کار فردی برقرار کنند.

ایجاد و مدیریت مجوزهای دیجیتالی در سی شارپ

مقدمه

مجوزهای دیجیتالی در ایجاد ارتباط  امن بین دو طرف استفاده میشوند.در مجوزهای دیجیتالی, ما مطمئن هستیم که مردم در استفاده از سرویس ها و برنامه های ما می توانند ارتباط امن با یکدیگر و مردم  و مصرف کنندگان و در کسب و کار فردی برقرار کنند.

در مجوزهای دیجیتالی برای ایجاد امضای دیجیتالی از هش کردن و رمز گذاری متقارن استفاده می کنیم.

پس از رمزگذاری هش داده ها  یک امضای دیجیتال جهت تایید داده ها ی مورد استفاده بدست می آوریم.

پس زمینه

 بیشتر مردم و کسب و کارهای خصوصی با توجه به نیازهای خود جهت برقراری ارتباطات خصوصی از اینترنت استفاده می کنند.

تعداد زیادی از مردم و کسب و کار آنلاین روز به روز در حال افزایش هستند.ارتباطات بسیار آسان و امکان دسترسی راحت شده است ,مردم زمان زیادی را در اینترنت می گذرانند و رابطه های شخصی خوبی دارند.

اینترنت برای همه آزاد است,همه میتوانند از طریق آن ارتباط برقرار کنند.اینترنت در اصل برای ارتباط طراحی شده است اما امنیت ندارد.بنابراین برخی از جنایتکاران اینترنتی  منافع غیر قانونی از طریق آن انجام داده اند.بنابراین کسب کارهای اینترنتی نیاز به امنیت دارند به این خاطر از مجوزهای دیجیتالی استفاده می کنند.

مجوزهای دیجیتالی یک راه حل امن و محرمانه را در برقراری ارتباطات فراهم می کنند.

زیر ساخت کلید عمومی

مجوزهای دیجیتالی بخشی از زیر ساخت کلید عمومی(PKI ) هستند که یک سیستم رمزنگاری  برای ایجاد گواهینامه های دیجیتالی هستند.

PKI ها با استفاده از دو کلید,که یکی از آن ها کلید عمومی و دیگری کلید خصوصی است.PKI ها درواقع براساس  رمزنگاری متقارن هستند.کلید عمومی توسط همه شناخته شده است ولی کلید خصوصی فقط توسط مالک کلید شناخته میشود.که در یک مکان امن باید نگه داری شود.

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

پی بردن به کلید اصلی از طریق کلید عمومی غیر ممکن است.

سناریوی ساده

فرض کنید دو شخص به نام احمد و فاطیما داریم,آن ها هردو می خواهند ارتباط امن برقرار کنند.بنابراین,آ ن ها چه روندی را برای برقراری ارتباط امن ومحرمانه دنبال کنند؟

1)ابتدا احمد پیام خود را هش میکند.

2)سپس او برای ایجاد امضای دیجیتال پیام هش خود را از طریق کلید خصوصی رمزنگاری میکند.

3)بعد از آن فاطیما پیام احمد و همچنین امضای دیجیتال را دریافت میکند.

4)فاطیما امضا را از طریق کلید عمومی رمزگشایی می کند و هش را دریافت میکند.

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

اگر هردو هش با هم مطابقت پیدا کنند می توان گفت فاطیما پیام درست را دریافت کرده در غیر اینصورت پیام تغییر کرده است.

اقتدار صدور مجوز

صدور مجوز های دیجیتال، CA (مجوز) فرد شخص ثالث است.که این گواهی برای همه افراد درگیر مسائل ارتباطات  قابل اعتماد است.

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

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

ایجادمجوز با Makecert.exe.

در سطح توسعه، ما می توانیم یک ابزار Makecert.exe جهت  ایجاد گواهی X.509 برای آزمایش استفاده کنیم.

مجوز X.509 استاندارد است که به طور گسترده برای تعریف گواهی دیجیتال استفاده می شود. X.509 با استفاده از PKI (زیرساخت کلید عمومی) به منظور بررسی هویت کاربر با کلید عمومی است.

برای ایجاد یک گواهی، از makecert برای باز کردن ویژوال استودیو توسعه دهنده فرمان به عنوان یک مدیر استفاده می شود و اجرای دستور، در زیر آورده شده است.

makecert -n "cn=sampleCertSubject" -sr currentuser -ss sampleCertStore

این دستور یک گواهینامه  جدید ایجاد و آن را به یک گواهی نام فروشگاه sampleCertStoreat  درمحل کاربر فعلی نصب می کند.

مدیریت گواهی

در این مرحله، با موفقیت یک گواهی  در فروشگاه به نام sampleCertStor ایجاد شد. در حال حاضر، ما می توانیم گواهی ما را از sampleCertStore به موفقیت ثبت نام و  اطلاعات استفاده شده را تایید کنیم.

امضای داده

اکنون اگر احمد داده ای را به فاطیما ارسال کند او نیاز دارد داده ها را با کلید خصوصی ثبت کند.

classX509CertTest {    
    staticvoid Main(string[] args) {    
        string messageToFatima = "My personal data";    
    
        //retrieve certificate from store//    
        X509Certificate2 certificate = GetCertFromStore();    
    
        //**signing data**//    
    
        //to sign we need the hash of data//    
        byte[] hashBytes = GetDataHash(messageToFatima);    
    
    
        byte[] signature = GetDigitalSignature(hashBytes);    
    }    
    
    
    privatestaticbyte[] GetDigitalSignature(byte[] hashBytes) {    
        X509Certificate2 certificate = GetCertFromStore();    
        /*use any asymmetric crypto service provider for encryption of hash   
        with private key of cert.   
        */    
        RSACryptoServiceProvider rsaCryptoService = (RSACryptoServiceProvider) certificate.PrivateKey;    
    
        /*now lets sign the hash   
        1.spevify hash bytes   
        2. and hash algorithm name to obtain the bytes   
        */    
        return rsaCryptoService.SignHash(hashBytes, CryptoConfig.MapNameToOID("SHA1"));    
    }    
    
    privatestaticbyte[] GetDataHash(string sampleData) {    
        //choose any hash algorithm    
        SHA1Managed managedHash = newSHA1Managed();    
    
        return managedHash.ComputeHash(Encoding.Unicode.GetBytes(sampleData));    
    }    
    
    privatestaticX509Certificate2 GetCertFromStore() {    
        //to access to store we need to specify store name and location    
        X509Store x509Store = newX509Store("sampleCertStore", StoreLocation.CurrentUser);    
    
        //obtain read only access to get cert    
        x509Store.Open(OpenFlags.ReadOnly);    
    
        return x509Store.Certificates[0];    
    }    
}     

صحت داده

هنگامی که فاطیما پیام و امضا را از احمد دریافت میکند او برای اطمینان از صحت داده از کلید عمومی استفاده می کند.

privatestaticbool VerifyData(byte[] signature, string messageFromAhemd)  
{  
    var messageHash = GetDataHash(messageFromAhemd);  
    X509Certificate2 certificate = GetCertFromStore();  
    RSACryptoServiceProvider cryptoServiceProvider = (RSACryptoServiceProvider) certificate.PublicKey.Key;  
    return cryptoServiceProvider.VerifyHash(messageHash, CryptoConfig.MapNameToOID("SHA1"), signature);  
}  

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

using System;    
using System.Security.Cryptography;    
using System.Security.Cryptography.X509Certificates;    
using System.Text;    
    
namespace CertTest {    
    classX509CertTest {    
        staticvoid Main(string[] args) {    
            string messageToFatima = "My personal data";    
    
            //retrieve certificate from store//    
            X509Certificate2 certificate = GetCertFromStore();    
    
            //**signing data**//    
    
            //to sign we need the hash of data//    
            byte[] hashBytes = GetDataHash(messageToFatima);    
    
    
            byte[] signature = GetDigitalSignature(hashBytes);    
            bool isVerified = VerifyData(signature, messageToFatima);    
    
            Console.WriteLine($ "IsVerified: {isVerified}");    
    
            Console.ReadLine();    
        }    
    
        privatestaticbool VerifyData(byte[] signature, string messageFromAhemd) {    
            var messageHash = GetDataHash(messageFromAhemd);    
    
            X509Certificate2 certificate = GetCertFromStore();    
    
            RSACryptoServiceProvider cryptoServiceProvider = (RSACryptoServiceProvider) certificate.PublicKey.Key;    
    
            return cryptoServiceProvider.VerifyHash(messageHash, CryptoConfig.MapNameToOID("SHA1"), signature);    
        }    
    
        privatestaticbyte[] GetDigitalSignature(byte[] hashBytes) {    
            X509Certificate2 certificate = GetCertFromStore();    
            /*use any asymmetric crypto service provider for encryption of hash   
            with private key of cert.   
            */    
            RSACryptoServiceProvider rsaCryptoService = (RSACryptoServiceProvider) certificate.PrivateKey;    
    
            /*now lets sign the hash   
            1.spevify hash bytes   
            2. and hash algorithm name to obtain the bytes   
            */    
            return rsaCryptoService.SignHash(hashBytes, CryptoConfig.MapNameToOID("SHA1"));    
        }    
    
        privatestaticbyte[] GetDataHash(string sampleData) {    
            //choose any hash algorithm    
            SHA1Managed managedHash = newSHA1Managed();    
    
            return managedHash.ComputeHash(Encoding.Unicode.GetBytes(sampleData));    
        }    
    
        privatestaticX509Certificate2 GetCertFromStore() {    
            //to access to store we need to specify store name and location    
            X509Store x509Store = newX509Store("sampleCertStore", StoreLocation.CurrentUser);    
    
            //obtain read only access to get cert    
            x509Store.Open(OpenFlags.ReadOnly);    
    
            return x509Store.Certificates[0];    
        }    
    }    
}    

آموزش سی شارپ

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

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 3k بازدید
  • 3 تشکر

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

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