ASP.Net 加密 Cookie

iDotNetSpace發表於2009-02-24

Cookie是ASP.NET應用程式中很重要的一個全域性變數,它可以用來儲存使用者登入資訊、使用者會話資訊,以及一些全域性變數或資料。為了提高應用程式的安全性,加密Cookie是很有必要的。本例項介紹在ASP.NET應用程式中加密Cookie的方法。

本例項介紹如何使用在ASP.NET應用程式中的加密Cookie的方法。例項中採用的加密方法為DES和TripleDES兩種方法,程式中均實現了 DES和TripleDES的加密和解密方法,同時還設定了建立處理Cookie的類CookieEncrypt。

 
1.建立新ASP.NET應用程式

在Visual Studio .NET 2003整合開發環境中建立新的ASP.NET Web應用程式,命名為Example_12_6。

2.建立加密Cookie的類EncryptString

在應用程式Example_12_6中新增類檔案EncryptString.cs,該檔案實現使用DES方法加密、解密資料和使用TripleDES方法加密、解密資料的方法,還定義了用來加密、解密的金鑰Key以及IV。類檔案 EncryptString.cs的程式程式碼如下:

以下為引用的內容:
public class EncryptString
    {
    private static byte[] Key64 = {42, 16, 93, 156, 78, 4, 218, 32};
    private static byte[] IV64  = {55, 103, 246, 79, 36, 99, 167, 3};
    private static byte[] Key192 = {42, 16, 93, 156, 78, 4, 218, 32,15, 167,
    44,80, 26, 250, 155, 112,2, 94, 11, 204, 119, 35, 184, 197};
    private static byte[] IV192  = {55, 103, 246, 79, 36, 99, 167, 3,42,
    5, 62,83, 184, 7, 209, 13,145, 23, 200, 58, 173, 10, 121, 222};
    public static String Encrypt(String valueString)
    {
    if(valueString != "")
    {   //定義DES的Provider
    DESCryptoServiceProvider desprovider =
    new DESCryptoServiceProvider();
    //定義記憶體流
    MemoryStream memoryStream = new MemoryStream();
    //定義加密流
    CryptoStream cryptoStream = new CryptoStream(memoryStream,
    desprovider.CreateEncryptor(Key64,IV64),
    CryptoStreamMode.Write);
    //定義寫IO流
    StreamWriter writerStream = new StreamWriter(cryptoStream);
    //寫入加密後的字元流
    writerStream.Write(valueString);
    writerStream.Flush();
    cryptoStream.FlushFinalBlock();
    memoryStream.Flush();
    //返回加密後的字串
    return(Convert.ToBase64String(memoryStream.GetBuffer(),0,
    (int)memoryStream.Length));
    }
    return(null);
    }
    public static String Decrypt(String valueString)
    {
    if(valueString != "")
 

  {   //定義DES的Provider
    DESCryptoServiceProvider desprovider =
    new DESCryptoServiceProvider();
    //轉換解密的字串為二進位制
    byte[] buffer = Convert.FromBase64String(valueString);
    //定義記憶體流
    MemoryStream memoryStream = new MemoryStream();
    //定義加密流
    CryptoStream cryptoStream = new CryptoStream(memoryStream,
    desprovider.CreateEncryptor(Key64,IV64),
    CryptoStreamMode.Read);
    //定義讀IO流
    StreamReader readerStream = new StreamReader(cryptoStream);
    //返回解密後的字串
    return(readerStream.ReadToEnd());
    }
    return(null);
    }
    public static String EncryptTripleDES(String valueString)
    {
    if(valueString != "")
    {   //定義TripleDES的Provider
    TripleDESCryptoServiceProvider triprovider =
    new TripleDESCryptoServiceProvider();
    //定義記憶體流
    MemoryStream memoryStream = new MemoryStream();
    //定義加密流
    CryptoStream cryptoStream = new CryptoStream(memoryStream,
    triprovider.CreateEncryptor(Key192,IV192),
    CryptoStreamMode.Write);
    //定義寫IO流
    StreamWriter writerStream = new StreamWriter(cryptoStream);
    //寫入加密後的字元流
    writerStream.Write(valueString);
    writerStream.Flush();
    cryptoStream.FlushFinalBlock();
    memoryStream.Flush();
    //返回加密後的字串
    return(Convert.ToBase64String(memoryStream.GetBuffer(),0,
    (int)memoryStream.Length));
    }
    return(null);
    }
    public static String DecryptTripleDES(String valueString)
    {
    if(valueString != "")
    {   //定義TripleDES的Provider
    TripleDESCryptoServiceProvider triprovider =
    new TripleDESCryptoServiceProvider();
    //轉換解密的字串為二進位制
    byte[] buffer = Convert.FromBase64String(valueString);
    //定義記憶體流
    MemoryStream memoryStream = new MemoryStream();
    //定義加密流

  CryptoStream cryptoStream = new CryptoStream(memoryStream,
    triprovider.CreateEncryptor(Key64,IV64),
    CryptoStreamMode.Read);
    //定義讀IO流
    StreamReader readerStream = new StreamReader(cryptoStream);
    //返回解密後的字串
    return(readerStream.ReadToEnd());
    }
    return(null);
    }
    }
 


3.建立處理Cookie的類CookieEncrypt

在應用程式Example_12_6中的類檔案EncryptString.cs中新增類CookieEncrypt,該類用來處理應用程式的 Cookie,如加密Cookie、獲取Cookie、解密Cookie等。類CookieEncrypt的程式程式碼如下:

以下為引用的內容:
  public class CookieEncrypt
    {
    public static void SetCookie(HttpCookie cookie)
    {   //設定Cookie
    HttpContext.Current.Response.Cookies.Set(cookie);
    }
    public static void SetCookie(String key,String valueString)
    {   //設定加密後的Cookie
    key = HttpContext.Current.Server.UrlEncode(key);
    valueString = HttpContext.Current.Server.UrlEncode(valueString);
    HttpCookie cookie = new HttpCookie(key,valueString);
    SetCookie(cookie);
    }
    public static void SetCookie(String key,String valueString,
    DateTime expires)
    {   //設定加密後的Cookie,並設定Cookie的有效時間
    key = HttpContext.Current.Server.UrlEncode(key);
    valueString = HttpContext.Current.Server.UrlEncode(valueString);
    HttpCookie cookie = new HttpCookie(key,valueString);
    cookie.Expires = expires;
    SetCookie(cookie);
    }
    public static void SetTripleDESEncryptedCookie(String key,
    String valueString)
    {   //設定使用TripleDES加密後的Cookie
    key = EncryptString.EncryptTripleDES(key);
    valueString = EncryptString.EncryptTripleDES(valueString);
    SetCookie(key,valueString);
    }
    public static void SetTripleDESEncryptedCookie(String key,
    String valueString,DateTime expires)
    {   //設定使用TripleDES加密後的Cookie,並設定Cookie的有效時間
    key = EncryptString.EncryptTripleDES(key);
    valueString = EncryptString.EncryptTripleDES(valueString);
    SetCookie(key,valueString,expires);
    }
 

  public static void SetEncryptedCookie(String key,String valueString)
    {   //設定使用DES加密後的Cookie
    key = EncryptString.Encrypt(key);
    valueString = EncryptString.Encrypt(valueString);
    SetCookie(key,valueString);
    }
    public static void SetEncryptedCookie(String key,
    String valueString,DateTime expires)
    {   //設定使用DES加密後的Cookie,並設定Cookie的有效時間
    key = EncryptString.Encrypt(key);
    valueString = EncryptString.Encrypt(valueString);
    SetCookie(key,valueString,expires);
    }
    public static String GetTripleDESEncryptedCookieValue(String key)
    {   //獲取使用TripleDES解密後的Cookie
    key = EncryptString.EncryptTripleDES(key);
    String valueString = GetCookieValue(key);
    valueString = EncryptString.DecryptTripleDES(valueString);
    return(valueString);
    }
    public static String GetEncryptedCookieValue(String key)
    {   //獲取使用DES解密後的Cookie
    key = EncryptString.Encrypt(key);
    String valueString = GetCookieValue(key);
    valueString = EncryptString.Decrypt(valueString);
    return(valueString);
    }
    public static HttpCookie GetCookie(String key)
    {   //通過關鍵字獲取Cookie
    key = HttpContext.Current.Server.UrlEncode(key);
    return(HttpContext.Current.Request.Cookies.Get(key));
    }
    public static String GetCookieValue(String key)
    {   //通過關鍵字獲取Cookie的value
    String valueString = GetCookie(key).Value;
    valueString = HttpContext.Current.Server.UrlDecode(valueString);
    return(valueString);
    }
    }
 


4 .設計頁面EncryptCookies.aspx 

以下為引用的內容:
把應用程式Example_12_6的預設頁面WebForm1.aspx重新命名為 EncryptCookies.aspx,並在頁面上新增3個Label控制元件,它們的名稱分別為TripleDESCookie、 EncryptCookie和myCookie,分別用來顯示使用TripleDES加密後的Cookie的值、使用DES加密後的Cookie的值和 Cookie的原始值。頁面EncryptCookies.aspx的設計介面如圖所示。

頁面EncryptCookies.aspx的HTML設計程式碼如下:

    private void Page_Load(object sender, System.EventArgs e)
    {              //呼叫函式EncryptMyCookies()獲取Cookie的原始值和加密後的值
    if(!Page.IsPostBack){EncryptMyCookies();}
    }
    private void EncryptMyCookies()
    {              //獲取Cookie的原始值
    myCookie.Text =
    HttpContext.Current.Response.Cookies[HttpContext.Current.
    Response.Cookies.GetKey(0)].Value.ToString();
    //獲取使用DES加密後Cookie的值
    EncryptCookie.Text = EncryptString.Encrypt(myCookie.Text);
    //獲取使用TripleDES加密後Cookie的值
    TripleDESCookie.Text = EncryptString.EncryptTripleDES(myCookie.Text);
    } 
 


執行效果

設定頁面EncryptCookies.aspx為應用程式的起始頁面,按F5鍵執行。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-557574/,如需轉載,請註明出處,否則將追究法律責任。

相關文章