国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Microsoft .NET 中的簡化加密(1)(圖)

2019-11-18 12:06:01
字體:
來源:轉載
供稿:網友

  摘要:學習如何利用 .NET Framework 的加密功能創建類似本文所述的包裝程序來保護您的數據。
  下載與本文相關的CryptoSampleCSSample.msi 和 CryptoSampleVBSample.msi 代碼示例。(請注重,在示例文件中,程序員的注釋使用的是英文,本文中將其譯為中文是為了便于讀者理解。)
  您希望在計算機上保存一些機密信息嗎?假如是,本文就為您介紹如何進行加密!加密技術就是將有意義的字符編碼成無意義的字符,使不應該訪問這些數據的人員無法讀取它們。加密技術已經存在很多年了,甚至遠在計算機誕生之前就已經存在了。隨著計算機的出現,在計算機領域應用加密技術可以生成幾乎牢不可破的代碼。Microsoft 在 Windows 95 中開發并分發了加密 API。使用 Microsoft .NET,新創建的類可以將這些復雜的算法打包到非常易于使用的屬性和方法中。
  
  散列簡介
  假如您只是不想讓別人竊取您的密碼,那么可以為密碼數據創建一個散列。散列是一種單向算法,一旦數據被轉換,將無法再獲得其原始值。大多數開發人員使用數據庫存儲密碼。但是,在數據庫中查找用戶數據的人員也能夠看到這些密碼。不過,您可以使用散列算法對密碼進行加密,然后再將其存儲在數據庫中。用戶輸入密碼后,您可以再次使用散列算法對其進行解密,然后將其與存儲在數據庫中的散列進行比較。散列的缺點之一是,即使原始數據只發生一個小小的改動,數據的散列也會發生非常大的變化。Pork 和 Porky 這兩個單詞非常相似,但使用散列算法加密后的結果卻相去甚遠。您可能根本看不出二者之間有什么相似之處。
  .NET 開發人員可以使用多種散列算法類。最常用的是 SHA1 和 md5。下面我們看一下如何為“Paul”這樣的普通字符串生成散列,使任何人都無法識別它。
  
  使用 SHA1 生成散列
  我們創建一個新例程,然后使用它為字符串“Paul”生成散列。在 Visual Studio? .NET 中打開一個新的 Windows 應用程序,在窗體上放置一個命令按鈕。當該命令按鈕上發生 Click 事件時,將調用名為 HashText() 的方法。您可以將以下代碼添加到該窗體中,看一下此散列算法的實際效果。編寫下列代碼之前,需要導入命名空間 System.Security.Cryptography。
  
 Microsoft .NET 中的簡化加密(1)(圖)(圖一)

  您可以傳遞不同的字符串值來調用該例程,查看散列值的變化。例如,假如將字符串“Paul”傳遞給該例程,Debug(調試)窗口將顯示以下文本:
  w2h6uYgMJt/nq5ZqihcBTeAXwv8=
  現在,將此過程中的輸入值更改為“Pauly”。您將看到以下輸出結果:
  PRoywxJ0znMpGF5sbB18+7GSAsM=
  如您所見,輸入字符串的一個小小變化就會產生完全不同的字符組合。這正是散列算法之所以有效的原因,它使我們很難找到輸入字符串的規律,也很難根據加密后的字符弄清楚字符串原來的模樣。
  
  使用 MD5 也可以生成散列
  了解一種散列類的使用方法后,基本上就了解了所有的散列類。下面的方法用于 MD5 散列算法。注重,除了 CryptoServiceProvider 類不同外,代碼是完全相同的。
  
 Microsoft .NET 中的簡化加密(1)(圖)(圖二)

  輸入“Paul”之后,MD5 散列算法的輸出結果如下所示:
  nVWBsHh1MKNctPioSyqyTQ==
  同樣,加密后的字符串看起來也與原始輸入相去甚遠。這些散列算法對于創建沒有任何意義的密碼來說非常有用,也使黑客很難猜出這些密碼。之所以使用散列算法,是因為可以用這種算法對密碼進行加密并將其存儲在數據庫中。然后,當用戶輸入真實密碼時,您先對密碼進行解密,然后通過網絡發送到數據庫中,比較它與數據庫中的密碼是否匹配。請記住,散列是單向操作。使用散列算法對原始密碼加密后將無法再恢復。
  
  如何選擇算法
  本文介紹的兩種散列算法都執行同一種操作。不同之處只在于生成散列的密鑰大小以及使用的算法。使用的密鑰越大,加密就越安全。例如,MD5 使用的加密密鑰比 SHA1 使用的密鑰大,因此 MD5 散列較難破解。
  對于散列算法要考慮的另外一點是,從實踐或理論的角度上看是否存在沖突的可能性。沖突是我們所不希望的,因為兩個不同的單詞可能會生成相同的散列。例如,SHA1 從實踐或理論上來講沒有發生沖突的可能性。MD5 從理論上講有發生沖突的可能性,但從實踐上講沒有發生沖突的可能性。因此,選擇哪種算法歸根結底取決于您所需要的安全級別。
  
  創建示例散列項目
  本文包含兩個示例散列項目,以更普通的方式說明如何使用不同的散列算法加密任意字符串。這兩個示例項目的名稱分別為 CryptoSampleVB.sln 和 CryptoSampleCS.sln。前者是 Visual Basic .NET 解決方案,后者是 C# 解決方案。兩個解決方案都包括一個類似圖 1 的窗體,該窗體答應您輸入要通過散列算法為其加密的原始字符串,還提供一個用來選擇散列算法的選項按鈕和一個顯示散列結果的文本框。
  
 Microsoft .NET 中的簡化加密(1)(圖)(圖三)

  
圖 1:創建一個通用散列屏幕來嘗試兩種散列算法

  單擊此屏幕上的 Hash(散列)按鈕時,將運行該按鈕的 Click 事件過程。此事件過程將調用一個名為 HashString() 的例程。
  
 Microsoft .NET 中的簡化加密(1)(圖)(圖四)

  HashString() 方法接受輸入的值并調用 SetHash() 方法。此方法將根據窗體上選項按鈕的設置來決定使用哪個加密服務提供程序創建該方法的實例并返回該方法。將為該窗體創建一個名為 mHash 的 HashAlgorithm 類型的成員變量。HashAlgorithm 類型是創建所有散列加密服務提供程序的基類。
  
 Microsoft .NET 中的簡化加密(1)(圖)(圖五)

  SetHash() 方法如下所示:
  
 Microsoft .NET 中的簡化加密(1)(圖)(圖六)

  根據您在窗體上選擇的選項按鈕,此方法將創建并返回一個不同的 HashAlgorithm 類型。HashString() 方法在該窗體上執行實際的數據加密:
  
 Microsoft .NET 中的簡化加密(1)(圖)(圖七)

  在 HashString 方法中,我們創建了兩個字節數組。第一個數組用來保存用戶的原始字符串輸入。我們使用 System.Text.Encoding.UTF8.GetBytes() 方法將該字符串轉換成字節數組。將原始字符串轉換成字節數組后,現在使用服務提供程序的 ComputeHash() 方法計算該字符串的散列值。此方法接受字節數組作為輸入,然后返回該字符串加密格式的字節數組。
  
  注重:完成之后清除散列變量是一個好的做法。因此,您看到計算該字符串的散列后,我們調用了 Clear 方法。
  現在我們已經獲得了加密的字節數組,這正是要從該方法返回的數組。因為我們要將原始值和加密值都作為字符串數據類型而不是字節數組進行處理,所以要通過使用 Convert.ToBase64String 方法返回加密的字節。此方法負責將字節數組轉換成 Base64 編碼的字符串。Base64 編碼的使用非常重要,因為有可能需要將此字符串推到 Web 頁上或將其存儲到數據庫中。假如不進行轉換,加密字符串中的某些高階 ASCII 字符將無法正確顯示或存儲。
  
  在散列中添加一些“鹽”值
  到目前為止,散列算法暴露出來的問題之一是,假如兩個用戶碰巧使用相同的密碼,那么散列值將完全相同。假如黑客看到您存儲密碼的表格,會從中找到規律并明白您很可能使用了常見的詞語,然后黑客會開始詞典攻擊以確定這些密碼。要確保任何兩個用戶密碼的散列值都不相同,一種方法是在加密密碼之前,在每個用戶的密碼中添加一個唯一的值。這個唯一值稱為“鹽”值。在進行此操作時,需要確保將使用的鹽值存儲為用戶記錄的一部分。假如您使用表格存儲用戶 ID 和密碼,我建議您使用不同的表格來存儲鹽值。這樣,即使數據庫泄漏,鹽值也可以為您提供一層額外的安全保護。
  在用戶密碼中添加鹽值的方法有多種。最簡單的方法是摘取用戶的某些信息(例如姓、名、電子郵件地址或員工 ID)并將其添加到用戶密碼中,然后再進行加密。這種方法的缺點是,因為您需要存儲鹽值,所以假如黑客找到該值,將會對您所做的一切操作了如指掌。當然,黑客需要花費額外的時間來破解鹽值,但這對黑客來說簡直是易如反掌。
  另外一種方法是使用 .NET Framework 類 RNGCryptoServiceProvider 創建一個隨機的數字字符串。RNG 表示隨機數生成器。該類可以創建一個任意長度的隨機字節數組,長度由您指定。您可以使用此隨機字節數組作為散列算法的鹽值。要采用這種方法,必須安全地存儲該鹽值。
  該示例與本文中的上一個示例基本相同,不同之處在于創建鹽值的例程。在此屏幕上的按鈕的 Click 事件下,首先調用一個名為 CreateSalt() 的方法來生成一個唯一的鹽值,然后將該值存儲到 txtSalt 文本框中。獲得唯一的鹽值后,再調用 HashString() 方法,將這兩個值結合起來。
  
 Microsoft .NET 中的簡化加密(1)(圖)(圖八)

  CreateSalt() 方法的代碼非常簡單。它首先創建一個長度為 8 個字節的字節數組,然后您創建一個新的 RNGCryptoServiceProvider 類實例。使用該對象的 GetBytes() 方法,將生成的隨機字符集填充到字節數組中。然后將此字節數組轉換成 Base64 編碼字符串并從該函數返回。
  
 Microsoft .NET 中的簡化加密(1)(圖)(圖九)

  
  數據加密是一個雙行道
  假如需要在兩個

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 垫江县| 新民市| 新竹市| 巨野县| 象山县| 贵南县| 鲁甸县| 交口县| 龙江县| 孟村| 兴隆县| 中山市| 阿荣旗| 都江堰市| 紫金县| 亳州市| 衡东县| 南岸区| 龙井市| 罗源县| 准格尔旗| 九龙县| 攀枝花市| 通海县| 平凉市| 油尖旺区| 吐鲁番市| 桦川县| 濮阳县| 大宁县| 博罗县| 伊金霍洛旗| 连城县| 防城港市| 桑植县| 山东省| 平和县| 永寿县| 怀化市| 秭归县| 南宫市|