asp.Net位址列引數加密傳遞
阿新 • • 發佈:2019-02-12
網上很多人在問怎麼實現Web系統URL傳輸(表單提交)引數加密。例如:要進行一個使用者帳號編輯,要傳遞使用者的ID,URL如下:http://localhost/mysystem/editAccounts.aspx?ID=2
但又不想讓別人知道這個使用者的ID為2,惡意的使用者可能還會將2修改,改為別的使用者ID。
加密傳遞的引數值可以解決問題。
EIP.Framework.Security objSecurity = new EIP.Framework.Security();
objSecurity.EncryptQueryString(''待加密的字串'');
解密:objSecurity.DecryptQueryString(''傳遞過來的引數);
但又不想讓別人知道這個使用者的ID為2,惡意的使用者可能還會將2修改,改為別的使用者ID。
加密傳遞的引數值可以解決問題。
以下是DEC加密、解密的基類。
檔名:Security.CS
類中URL及帳號加密使用了不同的KEY。呼叫URL加密過程如下:namespace EIP.Framework { /// Security類實現.NET框架下的加密和解密。 public class Security { string _QueryStringKey = "abcdefgh"; //URL傳輸引數加密Key string _PassWordKey = "hgfedcba"; //PassWord加密Key //加密URL傳輸的字串 public string EncryptQueryString(string QueryString) { return Encrypt(QueryString, _QueryStringKey); } //解密URL傳輸的字元 public string DecryptQueryString(string QueryString) { return Decrypt(QueryString, _QueryStringKey); } //加密帳號口令 public string EncryptPassWord(string PassWord) { return Encrypt(PassWord, _PassWordKey); } //解密帳號口令 public string DecryptPassWord(string PassWord) { return Decrypt(PassWord, _PassWordKey); } // DEC 加密過程 public string Encrypt(string pToEncrypt, string sKey) { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); //把字串放到byte陣列中 byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt); //byte[] inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt); des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); //建立加密物件的金鑰和偏移量 des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); //原文使用ASCIIEncoding.ASCII方法的GetBytes方法 MemoryStream ms = new MemoryStream(); //使得輸入密碼必須輸入英文文字 CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); StringBuilder ret = new StringBuilder(); foreach (byte b in ms.ToArray()) { ret.AppendFormat("{0:X2}", b); } ret.ToString(); return ret.ToString(); } /// DEC 解密過程 public string Decrypt(string pToDecrypt, string sKey) { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray = new byte[pToDecrypt.Length / 2]; for (int x = 0; x < pToDecrypt.Length / 2; x++) { int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16)); inputByteArray[x] = (byte)i; } des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); //建立加密物件的金鑰和偏移量,此值重要,不能修改 des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); StringBuilder ret = new StringBuilder(); //建立StringBuild物件,CreateDecrypt使用的是流物件,必須把解密後的文字變成流物件 return System.Text.Encoding.Default.GetString(ms.ToArray()); } /// 檢查己加密的字串是否與原文相同 public bool ValidateString(string EnString, string FoString, int Mode) { switch (Mode) { default: case 1: if (Decrypt(EnString, _QueryStringKey) == FoString.ToString()) { return true; } else { return false; } case 2: if (Decrypt(EnString, _PassWordKey) == FoString.ToString()) { return true; } else { return false; } } } } }
EIP.Framework.Security objSecurity = new EIP.Framework.Security();
objSecurity.EncryptQueryString(''待加密的字串'');
解密:objSecurity.DecryptQueryString(''傳遞過來的引數);