1. 程式人生 > >asp.Net位址列引數加密傳遞

asp.Net位址列引數加密傳遞

網上很多人在問怎麼實現Web系統URL傳輸(表單提交)引數加密。例如:要進行一個使用者帳號編輯,要傳遞使用者的ID,URL如下:http://localhost/mysystem/editAccounts.aspx?ID=2 
但又不想讓別人知道這個使用者的ID為2,惡意的使用者可能還會將2修改,改為別的使用者ID。 
加密傳遞的引數值可以解決問題。 

以下是DEC加密、解密的基類。

檔名:Security.CS 

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;
                    }
            }
        }
    }
}
類中URL及帳號加密使用了不同的KEY。呼叫URL加密過程如下: 
EIP.Framework.Security objSecurity = new EIP.Framework.Security(); 
objSecurity.EncryptQueryString(''待加密的字串''); 
解密:objSecurity.DecryptQueryString(''傳遞過來的引數);