نحوه رمزگذاری و رمزگشایی داده ها از انتها به انتها در فرم وب Asp.net

نحوه رمزگذاری و رمزگشایی داده ها از انتها به انتها در فرم وب Asp.net


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

چندین مزیت برای رمزگذاری و رمزگشایی با ASP.Net وجود دارد. اینها هستند:

  1. رمزگذاری را می توان در تعداد نامحدودی از دستگاه ها انجام داد.
  2. این به اطمینان از امنیت داده های شما در حین کار از راه دور کمک می کند و یکپارچگی کلی آن را بهبود می بخشد.
  3. یک کلید رمزگذاری قوی از هک و سایر حملات به برنامه وب شما جلوگیری می کند.
  4. رمزگذاری همچنین از سرقت هویت جلوگیری می‌کند و به شما کمک می‌کند ناشناس بمانید.

در این وبلاگ مهندسان DEV IT ما مراحل مورد نیاز برای انجام رمزگذاری و رمزگشایی در فرم های وب ASP.Net را برای برنامه های کاربردی وب شما توضیح دادند. مراحل این کار عبارتند از:

1.) اول از همه، ما به فایل های جاوا اسکریپت لیست شده در زیر نیاز داریم تا سمت کلاینت بتواند محتوا را رمزگذاری کند.

  • System.debug.js
  • System.IO.debug.js
  • System.Text.debug.js
  • System.Convert.debug.js
  • System.BitConverter.debug.js
  • System.IO.BinaryReader.debug.js
  • System.BigInt.debug.js
  • System.Security.Cryptography.SHA1.debug.js
  • System.Security.Cryptography.debug.js
  • System.Security.Cryptography.RSA.debug.js

2.) سپس به کلاس رمزگشایی سرور زیر و سایر ویژگی ها نیاز خواهیم داشت.

public class EncryptionPageDataProvider : LibCommon.PageBase
    {
        public static string privateKey;
        public static string publicKey;
        public static RSACryptoServiceProvider rsa;
        public static string UserName = "";
        public static int saltLengthLimit = 32;
        
        //The function mentioned below is used to assign required parameter 

        public static void AssignParameter()
        {
            const int PROVIDER_RSA_FULL = 1;
            const string CONTAINER_NAME = "KeyContainer";
            CspParameters cspParams;
            cspParams = new CspParameters(PROVIDER_RSA_FULL);
            cspParams.KeyContainerName = CONTAINER_NAME;
            cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
            cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
            rsa = new RSACryptoServiceProvider(cspParams);
            rsa.PersistKeyInCsp = false;
        }


//The function mentioned below is used to assignor generate new public and private key 

        public static void AssignNewKey()
        {
            AssignParameter();
            RSA rsa = new RSACryptoServiceProvider(2048);
            string PrivateKeyXML = rsa.ToXmlString(true);
            privateKey = PrivateKeyXML; // sets the new private key.

            string publicOnlyKeyXML = rsa.ToXmlString(false);
            publicKey = publicOnlyKeyXML; // sets the new public key.
            LibCommon.LibResult res = new LibCommon.LibResult();
            DataProviders.EncryptionPageDataProvider.UpdateNewKeys(publicOnlyKeyXML, PrivateKeyXML);
            if (res.HasError)
            {
                throw new Exception(res.ErrorException.Message);
            }
        }

//The function mentioned below is used encrypt data with salt string

        public static string EncryptData(string data2Encrypt, string salt)
        {
            LibCommon.LibResult res = new LibCommon.LibResult();
            try
            {
                AssignParameter();
                

                res = GetKeys(UserName);
                if (res.HasError)
                {
                    return "";
                }
                else
                {
                    rsa.FromXmlString(res.ResultDS.Tables["tblKeys"].Rows[0]["PublicKey"].ToString());
                    //read plaintext, encrypt it to ciphertext
                    byte[] plainbytes = System.Text.Encoding.UTF8.GetBytes(data2Encrypt + salt);
                    byte[] cipherbytes = rsa.Encrypt(plainbytes, false);
                    return Convert.ToBase64String(cipherbytes);
                }
            }
            catch (Exception ex)
            {
                throw new Exception(res.ErrorException.Message);
            }
            
        }

//The function mentioned below is used encrypt data without salt string
        public static string EncryptData(string data2Encrypt)
        {
            LibCommon.LibResult res = new LibCommon.LibResult();
            try
            {
                AssignParameter();
                
                res = GetKeys(UserName);
                if (res.HasError)
                {
                    return "";
                }
                else
                {
                    rsa.FromXmlString(res.ResultDS.Tables["tblKeys"].Rows[0]["PublicKey"].ToString());
                    //read plaintext, encrypt it to ciphertext
                    byte[] plainbytes = System.Text.Encoding.UTF8.GetBytes(data2Encrypt);
                    byte[] cipherbytes = rsa.Encrypt(plainbytes, false);
                    return Convert.ToBase64String(cipherbytes);
                }
            }
            catch (Exception ex)
            {
                throw new Exception(res.ErrorException.Message);
            }

        }
//The function mentioned below is used decrypt the encrypted data without salt string
        public static string DecryptData(string data2Decrypt, string privatekey)
        {
            LibCommon.LibResult res = new LibCommon.LibResult();
            
                AssignParameter();

                byte[] getpassword = Convert.FromBase64String(data2Decrypt);

                string publicPrivateKeyXML = privatekey;
                rsa.FromXmlString(publicPrivateKeyXML);

                //read ciphertext, decrypt it to plaintext
                byte[] plain = rsa.Decrypt(getpassword, false);
                string dataAndSalt = System.Text.Encoding.UTF8.GetString(plain);
                return dataAndSalt;            
        }

//The function mentioned below is used decrypt the encrypted data with salt string 

        public static string DecryptData(string data2Decrypt, string privatekey, string salt)
        {
            LibCommon.LibResult res = new LibCommon.LibResult();

            AssignParameter();
            byte[] getpassword = Convert.FromBase64String(data2Decrypt);
            string publicPrivateKeyXML = privatekey;
            rsa.FromXmlString(publicPrivateKeyXML);

            //read ciphertext, decrypt it to plaintext
            byte[] plain = rsa.Decrypt(getpassword, false);
            string dataAndSalt = System.Text.Encoding.UTF8.GetString(plain);
            return dataAndSalt.Substring(0, dataAndSalt.Length - salt.Length);

        }

//The function mentioned below is used to get public and private key from the table   

        public static LibResult GetKeys(string UserName)
        {
            LibResult res;
            res = new LibResult();
            Database db = DatabaseFactory.CreateDatabase();
            DataSet ds = new DataSet();
            try
            {
                DbCommand cmd = db.GetStoredProcCommand("spGetKeys",UserName);
                cmd.CommandTimeout = 0;
                String[] tblNames = { "tblKeys" };
                db.LoadDataSet(cmd, ds, tblNames);
                res.ResultDS = ds;
            }
            catch (Exception e)
            {
                ds = null;
                res = new LibResult(e, null);
            }
            return res;
        }


        

//The function mentioned below is used to update the new public and private key user wise to table. 

public static LibCommon.LibResult UpdateNewKeys(string PublicKey,string PrivateKey)
        {
            LibResult res = new LibResult();
            Database db = DatabaseFactory.CreateDatabase();

            try
            {
                DbCommand cmd = db.GetStoredProcCommand("spUpdateNewKeys", PublicKey, PrivateKey, UserName);
                db.ExecuteNonQuery(cmd);
            }
            catch (Exception e)
            {
                res = new LibResult(e, null);
            }

            return res;
        }


//The function mentioned below is used to insert the activity of user, login time, sessionId etc.

        public static LibCommon.LibResult InsertIntoBankUserLog(string UserName, string SessionId, bool IsActive,DateTime LogInDateTime,string IpAddress)
        {
            LibResult res = new LibResult();
            Database db = DatabaseFactory.CreateDatabase();

            try
            {
                DbCommand cmd = db.GetStoredProcCommand("spInsertBankUserLog", UserName, SessionId, IsActive, LogInDateTime, IpAddress);
                db.ExecuteNonQuery(cmd);
            }
            catch (Exception e)
            {
                res = new LibResult(e, null);
            }

            return res;
        }


//The function mentioned below is used to track the activity of user, login time, logout time etc.

        public static LibCommon.LibResult UpdateBankUserLog(string UserName,string SessionId, bool IsActive, DateTime LogOutDateTime)
        {
            LibResult res = new LibResult();
            Database db = DatabaseFactory.CreateDatabase();

            try
            {
                DbCommand cmd = db.GetStoredProcCommand("spUpdateBankUserLog", UserName, SessionId, IsActive, LogOutDateTime);
                db.ExecuteNonQuery(cmd);
            }
            catch (Exception e)
            {
                res = new LibResult(e, null);
            }
            return res;
        }

//The function mentioned below is used to generate random salt string every time. 

    public static string getrandomvalue(int size)
        {
            try
            {
                var s = new System.Security.Cryptography.RNGCryptoServiceProvider();
                var buff = new byte[size];
                s.GetBytes(buff);
                return Convert.ToBase64String(buff);
            }
            catch (Exception)
            {

                throw;
            }
        }

3.) سپس به دو کلید مخفی نیاز دارید که برای کلید عمومی و رشته سالین ارسال شده است.

<asp:HiddenField ID="PublicKey" runat="server" />
 <asp:HiddenField ID="Salt" runat="server" />

4.) نمونه ای از کلید عمومی و کلید خصوصی که برای رمزگذاری و رمزگشایی استفاده می شود

کلید عمومی:

ماژول {RandomString}>AQAB

کلید خصوصی:

{RandomString} модул> AQAB Експонента>

6ixwohrsa7k3jxr8ta0dtfega1ntf / u / gpnfg3ozj6gsjsj20uDEH14JE + XHTYAFH23O9YN001QZFVDILJCRKHFMSME4EMVULIJB3Q + KCF5579V8CHB2GMVLLGK67VAZ7E7LCFCDISD / HMJPTNMIOHDNBDWR03VIGM8P5YPXDKOMM = P> + YAzMoJ9 / k5P9CB5NfnvhTyOWSNhgfTT5GEur09I / f9QM1VL + + + EpjaKZC5Nce6gjR OxX7q / 5zsZJKqz5i0ZRiS9wMrul0UoqYEc / tG7jr8xDeVsGsIqk + BHHLovUOb6TZjejME9UlwtDwtwniKqTTF54fA6gvCPocUzQ + djtcs = Q> xJvzAMW7UCujAlubkrxoW5BAvZ4L6dmUJ5qD2yyjA6Y39X8MbS0yvcx35r6z7hzlAwNeuaD1bb3GAW7N4k + 4ASj2JEZqCrtCK + 61KVK13JWeUIRWQ DP> л / lDooSgFP91mWrxj73CuyILj1w / DTOJ7AL4CrXzmWsiMP6krjj0Obe14PB8HoWBXGcqF6HfsuLr82mu11RhoDZp8zucKkV7NyFg19EGJJLGGt DQ> wrnigmnlg2jw1ll5zht4xjhrgpnu9ziht4xjo0m3oo5wzsm0rkwhezlcutgehwhwh6ignwohezlalz5vskno + 1ro4wixcxl / odmcxcmrmquepku / x3dmnweniy8akgv19k7fcl + kgtjvxwnyk0cm / 45la0ray + irddq4a8nf / fkq = InverseQ> dr55hcwt1BWvg 5FT1MHnGtQdyx0Gp5kO30zroJ7e7O8BBTYkAov57KoRG86bLzmvoyaupof / jGIYc5P0oa0vPy2N7IUboKG3ti2Rz / idfjw7GXMl8t64XRGFeyl / GhUWdawG9kwMa6TLGqrehpj + 73nzlz2eHB + b4wUJHcP5Okyo1vobvkh7RD3mM8388TLHaNf / H / b5F + Z8nt2lM9ZeUrCD265uBc / TkiZWbMRHIBdxojtltzECgJqui5GZIy90sIUtZvGAVJh3zUpykYllPz4ixmVWj5pnoxyBx0agOo34bCbsO97BtkgW / TD / mCSpWCADUOUHndz35tGzMVTR9Q == D> RSAKeyValue>

5.) شما می توانید این کلید را در جدول ذخیره کنید و با هر بار ورود کاربر، یک جلسه جدید شروع می شود و هر دو کلید تغییر کرده و در جدول ذخیره می شوند.

در زیر کدی وجود دارد که با هر بار ورود جدید هر دو کلید را تغییر داده و برای کاربر ذخیره می کند.

DataProviders.EncryptionPageDataProvider.UserName = UserName;
                                                        DataProviders.EncryptionPageDataProvider.AssignNewKey();

LibCommon.LibResult res = new LibCommon.LibResult();

SessionIDManager manager = new SessionIDManager();

Session["SessionId"] = manager.CreateSessionID(HttpContext.Current);
                                                        DataProviders.EncryptionPageDataProvider.InsertIntoBankUserLog(UserName, Session["SessionId"].ToString(), true, DateTime.Now, ClientIP);

6.) متغیرهای کلید عمومی و Salt Hidden Field را اختصاص دهید

protected void Page_Load(object sender, EventArgs e)
{
            
            LibCommon.LibResult res1 = new LibCommon.LibResult();
            res1 = DataProviders.EncryptionPageDataProvider.GetKeys(this.Page.User.Identity.Name);
            if (res1.HasError)
            {
                throw new Exception(res1.ErrorException.Message);
            }
            else
            {
                PublicKey.Value = res1.ResultDS.Tables["tblKeys"].Rows[0]["PublicKey"].ToString();
                DataProviders.EncryptionPageDataProvider.privateKey = res1.ResultDS.Tables["tblKeys"].Rows[0]["PrivateKey"].ToString();
            }
            this.Salt.Value = DataProviders.EncryptionPageDataProvider.getrandomvalue(DataProviders.EncryptionPageDataProvider.saltLengthLimit);

 }

7.) چگونه محتوای مشتری را رمزگذاری می کنیم.

$("body").on("click", "#MainContent_ImageButton1", function (e) {
                encrypt();
            });

function encrypt() {
            var PublicKey = $("[id*=PublicKey]").val();
            var Salt = $("[id*=Salt]").val();
            var KeyNo=$("[id*=txtKeyNo]").val();
            var FormFlag=$("#MainContent_DropDownList1 option:selected").text();
            var FormNo= $("[id*=txtFormNo]").val();
            if (KeyNo != "" || (FormFlag != "" && FormNo != "")) {
                var rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
                rsa.FromXmlString(PublicKey);
                if (KeyNo != "") {
                    var byteKeyNo = System.Text.Encoding.UTF8.GetBytes(KeyNo + Salt);                    
                    var encryptedBytesKeyNo = rsa.Encrypt(byteKeyNo, false);
                    var encryptedStringKeyNo = System.Convert.ToBase64String(encryptedBytesKeyNo);                    
                    $("[id*=txtKeyNo]").val(encryptedStringKeyNo);
                }
                if (FormFlag != "" && FormNo != "") {
                    var byteFormFlag = System.Text.Encoding.UTF8.GetBytes(FormFlag + Salt);
                    var encryptedBytesFormFlag = rsa.Encrypt(byteFormFlag, false);
                    var encryptedStringFormFlag = System.Convert.ToBase64String(encryptedBytesFormFlag);
                    $("[id*=EFormFlag]").val(encryptedStringFormFlag);

                    var byteFormNo = System.Text.Encoding.UTF8.GetBytes(FormNo + Salt);
                    var encryptedBytesFormNo = rsa.Encrypt(byteFormNo, false);
                    var encryptedStringFormNo = System.Convert.ToBase64String(encryptedBytesFormNo);
                    $("[id*=txtFormNo]").val(encryptedStringFormNo);
                }
                return true;

            }
            else {
                $("[id*=txtKeyNo]").val('');
                $("[id*=DropDownList1]").val('');
                $("[id*=txtFormNo]").val('');
                return false;
            }
        }

8.) در اینجا ما این محتوای رمزگذاری شده را در سمت سرور رمزگشایی می کنیم.

protected void btnGetDetail_Click(object sender, EventArgs e)
        {
            try
            {
                
                if (this.txtKeyNo.Text.Trim()!=string.Empty)
                    this.txtKeyNo.Text = DataProviders.EncryptionPageDataProvider.DecryptData(this.txtKeyNo.Text, DataProviders.EncryptionPageDataProvider.privateKey, this.Salt.Value);
                if (this.txtKeyNo.Text.Trim().Length == 0)
                {
                    throw new Exception("Key No should not be blank...");
                }
                else
                {                    
                    LibResult res = this.DisplayData(this.txtKeyNo.Text, "", "", "");
                    if (res.HasError)
                    {
                        throw new Exception(res.ErrorException.Message.ToString());
                    }
                    else
                    {
                        this.TaxDetailPnl.Visible = true;
                        this.lblerr.Text = "";
                    }
                }
                
            }
            catch (Exception Ex)
            {
                this.lblerr.Text = Ex.Message.ToString();
                this.TaxDetailPnl.Visible = false;
                
            }
        }

نتیجه

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

نشریه How to Encrypt and Decrypt Data End-to-End در فرم وب Asp.net اولین بار در مجله DEV IT ظاهر شد.