熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

用ASP.NET加密Cookie數據

2013-11-13 10:10:47  來源: .NET編程 

  Cookie確實在WEB應用方面為訪問者和編程者都提供了方便然而從安全方面考慮是有問題的首先Cookie數據包含在HTTP請求和響應的包頭裡透明地傳遞也就是說聰明的人是能清清楚楚看到這些數據的
  其次Cookie數據以Cookie文件格式存儲在浏覽者計算機的cache目錄裡其中就包含有關網頁密碼和其他用戶行為的信息那麼只要進入硬盤就能打開Cookie文件是一個Cookie文件的內容
  
  如果你未曾留意你的機器裡有Cookie文件可以按下列方法查看打開IE選擇工具菜單裡的Internet選項然後在彈出的對話框裡點擊設置按鈕在設置對話框裡點擊查看就會打開一個窗口顯示浏覽器放在硬盤裡的所有緩存數據其中就有大量的Cookie文件
  
  所以奉勸大家不要將敏感的用戶數據存放在Cookie中要麼就通過加密將這些數據保護起來
  
  在以前的ASP版本中沒有加密的功能現在NET構架在SystemSecurityCryptography命名空間裡提供了許多加密類可以利用
  
  一NET的密碼系統概要
  
  簡單地說加密就是將原始字符(字節)串轉變為完全不同的字符串的處理過程達到原始字符無法破譯的目的這個處理過程是用另一個字符串(稱為密鑰采取復雜的混合的算法搗進原始字符串有時還使用一個稱為初始向量的字符串在密鑰搗進之前先打亂目標字符串預防目標字符串中較明顯的內容被識破加密的功效取決於所用密鑰的大小密鑰越長保密性越強典型的密鑰長度有位和攻擊者唯一的方法是創建一個程序嘗試每一個可能的密鑰組合位密鑰也有種組合
  
  目前有兩種加密方法對稱加密(或稱私有密鑰)和非對稱加密(或稱公共密鑰)對稱加密技術的數據交換兩邊(即加密方和解密方)必須使用一個保密的私有密鑰非對稱加密技術中解密方向加密方要求一個公共密鑰加密方在建立一個公共密鑰給解密方後用公共密鑰創建唯一的私有密鑰加密方用私有密鑰加密送出的信息對方用公共密鑰解密保護HTTP傳輸安全的SSL就是使用非對稱技術
  
  我們對Cookie數據的加密采取對稱加密法NET構架從基本的SymmetricAlgorithm類擴展出來四種算法
  
  ·SystemSecurityCryptographyDES
  
  ·SystemSecurityCryptographyTripleDES
  
  ·SystemSecurityCryptographyRC
  
  ·SystemSecurityCryptographyRijndael
  
  下面將示范DES和TripleDES算法DES的密鑰大小限制在但用於Cookie的加密是有效的TripleDES完成了三次加密並有一個較大的密鑰位數所以它更安全使用那一種算法不僅要考慮加密強度還要考慮Cookie的大小因為加密後的Cookie數據將變大並且密鑰越大加密後的數據就越大然而Cookie數據的大小限制在KB這是一個必須考慮的問題再者加密的數據越多或算法越復雜就會占有更多的服務器資源進而減慢整個站點的訪問速度
  
  二創建一個簡單的加密應用類
  
  NET的所有加密和解密通過CryptoStream類別來處理它衍生自SystemIOStream將字符串作為以資料流為基礎的模型供加密轉換之用下面是一個簡單的加密應用類的代碼
  
  Imports SystemDiagnostics
  
  Imports SystemSecurityCryptography
  
  Imports SystemText
  
  Imports SystemIO
  
  
  Public Class CryptoUtil
  
  
  隨機選個字節既為密鑰也為初始向量
  
  Private Shared KEY_() As Byte = { }
  
  Private Shared IV_() As Byte = { }
  
  
  對TripleDES采取字節或位的密鑰和初始向量
  
  Private Shared KEY_() As Byte = { _
  
   _
  
   }
  
  Private Shared IV_() As Byte = { _
  
   _
  
   }
  
  
  標准的DES加密
  
  Public Shared Function Encrypt(ByVal value As String) As String
  
  If value <> Then
  
  Dim cryptoProvider As DESCryptoServiceProvider = _
  
  New DESCryptoServiceProvider()
  
  Dim ms As MemoryStream = New MemoryStream()
  
  Dim cs As CryptoStream = _
  
  New CryptoStream(ms cryptoProviderCreateEncryptor(KEY_ IV_) _
  
  CryptoStreamModeWrite)
  
  Dim sw As StreamWriter = New StreamWriter(cs)
  
  
  swWrite(value)
  
  swFlush()
  
  csFlushFinalBlock()
  
  msFlush()
  
  
  再轉換為一個字符串
  
  Return ConvertToBaseString(msGetBuffer() msLength)
  
  End If
  
  End Function
  
  
  
  標准的DES解密
  
  Public Shared Function Decrypt(ByVal value As String) As String
  
  If value <> Then
  
  Dim cryptoProvider As DESCryptoServiceProvider = _
  
  New DESCryptoServiceProvider()
  
  
  從字符串轉換為字節組
  
  Dim buffer As Byte() = ConvertFromBaseString(value)
  
  Dim ms As MemoryStream = New MemoryStream(buffer)
  
  Dim cs As CryptoStream = _
  
  New CryptoStream(ms cryptoProviderCreateDecryptor(KEY_ IV_) _
  
  CryptoStreamModeRead)
  
  Dim sr As StreamReader = New StreamReader(cs)
  
  
  Return srReadToEnd()
  
  End If
  
  End Function
  
  
  TRIPLE DES加密
  
  Public Shared Function EncryptTripleDES(ByVal value As String) As String
  
  If value <> Then
  
  Dim cryptoProvider As TripleDESCryptoServiceProvider = _
  
  New TripleDESCryptoServiceProvider()
  
  Dim ms As MemoryStream = New MemoryStream()
  
  Dim cs As CryptoStream = _
  
  New CryptoStream(ms cryptoProviderCreateEncryptor(KEY_ IV_) _
  
  CryptoStreamModeWrite)
  
  Dim sw As StreamWriter = New StreamWriter(cs)
  
  
  swWrite(value)
  
  swFlush()
  
  csFlushFinalBlock()
  
  msFlush()
  
  
  再轉換為一個字符串
  
  Return ConvertToBaseString(msGetBuffer() msLength)
  
  End If
  
  End Function
  
  
  
  TRIPLE DES解密
  
  Public Shared Function DecryptTripleDES(ByVal value As String) As String
  
  If value <> Then
  
  Dim cryptoProvider As TripleDESCryptoServiceProvider = _
  
  New TripleDESCryptoServiceProvider()
  
  
  從字符串轉換為字節組
  
  Dim buffer As Byte() = ConvertFromBaseString(value)
  
  Dim ms As MemoryStream = New MemoryStream(buffer)
  
  Dim cs As CryptoStream = _
  
  New CryptoStream(ms cryptoProviderCreateDecryptor(KEY_ IV_) _
  
  CryptoStreamModeRead)
  
  Dim sr As StreamReader = New StreamReader(cs)
  
  
  Return srReadToEnd()
  
  End If
  
  End Function
  
  
  End Class
  
  上面我們將一組字節初始化為密鑰並且使用的是數字常量如果你在實際應用中也這樣做這些字節一定要在之間這是一個字節允許的范圍值
  
  三創建一個Cookie的應用類
  
  下面我們就創建一個簡單的類來設置和獲取Cookies
  
  Public Class CookieUtil
  
  
  設置COOKIE *****************************************************
  
  
  SetTripleDESEncryptedCookie (只針對密鑰和Cookie數據)
  
  Public Shared Sub SetTripleDESEncryptedCookie(ByVal key As String _
  
  ByVal value As String)
  
  key = CryptoUtilEncryptTripleDES(key)
  
  value = CryptoUtilEncryptTripleDES(value)
  
  
  SetCookie(key value)
  
  End Sub
  
  
  SetTripleDESEncryptedCookie (增加了Cookie數據的有效期參數)
  
  Public Shared Sub SetTripleDESEncryptedCookie(ByVal key As String _
  
  ByVal value As String ByVal expires A
From:http://tw.wingwit.com/Article/program/net/201311/12808.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.