久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Microsoft .NET 中的簡化加密(2)

 MAIKOO 2012-02-02

Microsoft .NET 中的簡化加密(2)

另外一種方法是使用 .NET Framework 類 RNGCryptoServiceProvider 創(chuàng)建一個隨機的數(shù)字字符串,。RNG 表示隨機數(shù)生成器,。該類可以創(chuàng)建一個任意長度的隨機字節(jié)數(shù)組,,長度由您指定。您可以使用此隨機字節(jié)數(shù)組作為散列算法的鹽值,。要采用這種方法,,必須安全地存儲該鹽值。
在2 示例中,,您需要在文本框中輸入一個字符串,,選擇特定的散列類型,然后生成鹽值以及包含該鹽值和原始字符串的散列值,。
在散列值中添加鹽值以創(chuàng)建更安全的密碼散列(需要存儲鹽值以便再次創(chuàng)建相同的散列,。)
該示例與本文中的上一個示例基本相同,不同之處在于創(chuàng)建鹽值的例程,。在此屏幕上的按鈕的 Click 事件下,,首先調(diào)用一個名為 CreateSalt() 的方法來生成一個唯一的鹽值,然后將該值存儲到 txtSalt 文本框中,。獲得唯一的鹽值后,,再調(diào)用 HashString() 方法,將這兩個值結(jié)合起來,。
' Visual Basic .NET
Private Sub btnHash_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnHash.Click
txtSalt.Text = CreateSalt()
txtHashed.Text = HashString(txtSalt.Text & _
txtOriginal.Text)
End Sub
// C#
private void cmdHash_Click(object sender, System.EventArgs e)
{
txtSalt.Text = CreateSalt();
txtHashed.Text = HashString(txtOriginal.Text);
}
CreateSalt() 方法的代碼非常簡單,。它首先創(chuàng)建一個長度為 8 個字節(jié)的字節(jié)數(shù)組,然后您創(chuàng)建一個新的 RNGCryptoServiceProvider 類實例,。使用該對象的 GetBytes() 方法,,將生成的隨機字符集填充到字節(jié)數(shù)組中。然后將此字節(jié)數(shù)組轉(zhuǎn)換成 Base64 編碼字符串并從該函數(shù)返回。
' Visual Basic .NET
Private Function CreateSalt() As String
Dim bytSalt(8) As Byte
Dim rng As New RNGCryptoServiceProvider
rng.GetBytes(bytSalt)
Return Convert.ToBase64String(bytSalt)
End Function
// C#
private string CreateSalt()
{
byte[] bytSalt = new byte[8];
RNGCryptoServiceProvider rng;
rng = new RNGCryptoServiceProvider();
rng.GetBytes(bytSalt);
return Convert.ToBase64String(bytSalt);
}

數(shù)據(jù)加密是一個雙行道

如果需要在兩個或多個人員或計算機之間來回發(fā)送信息,,并希望對方能夠讀取數(shù)據(jù),,而其他人不可以讀取,那么加密則是最好的方式,!加密算法使您可以將數(shù)據(jù)掩蓋起來,,除了特定人員能夠?qū)ζ浣饷芡猓渌藛T不大可能通過數(shù)學(xué)方法讀取該數(shù)據(jù),。但如果您希望某個人能夠讀取該數(shù)據(jù),,您可以為其提供一個特定的“密鑰”,使其能夠解密并讀取數(shù)據(jù),。.NET Framework 中有多種可用的加密/解密算法,。本文主要介紹對稱算法,包括以下幾種:
DES
RC2
Rijndael
TripleDES
對稱算法(或密鑰算法)使用一個密鑰和一個初始化向量 (IV) 來保證數(shù)據(jù)的安全,。使用該數(shù)據(jù)的雙方都必須知道這個密鑰和初始化向量才能夠加密和解密數(shù)據(jù),。必須確保該密鑰的安全,,否則其他人將有可能解密該數(shù)據(jù)并讀取該消息,。初始化向量只是一個隨機生成的字符集,使用它可以確保任何兩個文本都不會生成相同的加密數(shù)據(jù),。使用 .NET 中不同的加密類的內(nèi)置方法可以導(dǎo)出密鑰,,至于如何導(dǎo)出密鑰,則不屬于本文要討論的內(nèi)容,。
其他類型的加密算法稱為不對稱算法,。不對稱算法使用公鑰/私鑰對來創(chuàng)建加密數(shù)據(jù)。不對稱算法將在下文進行討論,。
如何在不同的情況下選擇不同的加密方法

對稱算法(或密鑰算法)的速度非??欤浅_m于加密大型的數(shù)據(jù)流,。這些算法可以加密數(shù)據(jù),,也可以解密數(shù)據(jù)。它們都相當安全,,但如果有足夠的時間,,也可能會被破密,因為有人可能會搜索每個已知的密鑰值組合,。由于每種算法都使用固定的密鑰長度或 ASCII 字符,,因此計算機程序可以嘗試每個可能的密鑰組合并最終找到正確的那個組合。這些類型的算法一般用于存儲和檢索數(shù)據(jù)庫的連接字符串,。
不對稱算法(或公鑰算法)沒有對稱算法快,,但其代碼較難破密。這些算法取決于兩個密鑰,一個是私鑰,,另一個是公鑰,。公鑰用來加密消息,私鑰是可以解密該消息的唯一密鑰,。公鑰和私鑰通過數(shù)學(xué)方法鏈接在一起,,因此要成功進行加密交換,必須獲得這兩個密鑰,。由于可能會影響到計算機性能,,因此不對稱算法不太適用于加密大量數(shù)據(jù)。不對稱算法的常見用法是將對稱密鑰和初始化向量加密并傳輸給對方,。然后在雙方之間來回發(fā)送的消息中使用對稱算法加密和解密數(shù)據(jù),。
如果您不打算再恢復(fù)原始值,尤其不希望別人發(fā)現(xiàn)原始值,,那么請使用散列值,。散列可以將任意長度的字符串加密為固定的字節(jié)集。此操作是單向的,,因此通常用于密碼這樣的少量數(shù)據(jù),。當用戶在安全的輸入屏幕上輸入用戶密碼后,程序?qū)Υ嗣艽a進行加密并將散列值存儲到數(shù)據(jù)庫中,。即使數(shù)據(jù)庫泄漏,,也沒有人能夠讀取密碼,因為密碼已被加密,。當用戶登錄到該系統(tǒng)進行輸入時,,將使用相同的算法解密用戶鍵入的密碼,如果兩個散列值相匹配,,系統(tǒng)則可以確定用戶輸入的值與以前存儲的值相同,。
加密練習(xí)

示例應(yīng)用程序中包括一個窗體,允許您使用 DES 和 TripleDES 加密服務(wù)提供程序進行加密練習(xí),。該窗體名為 frmEncrypt,。 
3例 加密算法允許您加密并解密值。
在該屏幕上,,首先需要單擊 Gen Key(生成密鑰)按鈕,,然后單擊 Gen IV(生成 IV)按鈕。然后在 Original String(原始字符串)文本框中輸入一些數(shù)據(jù)并單擊 Encrypt(加密)按鈕,。單擊 Encrypt(加密)按鈕后,,加密后的文本將顯示在 Encrypted String(加密字符串)文本框中。如果您希望在自己的應(yīng)用程序中使用這個加密的字符串,,則需要記下生成的密鑰和 IV,,因為要解密連接字符串以便再次使用,您需要提供這兩個值。如果丟失了密鑰和 IV,,將再也無法恢復(fù)連接字符串,。
現(xiàn)在看一下其源代碼,了解如何實現(xiàn)加密和解密例程,。首先看一下該類的成員變量,,它用于保存相應(yīng)加密服務(wù)提供程序的引用。該成員變量的類型為 SymmetricAlgorithm,。所有的對稱算法類都是從這個基類繼承而來的,。
' Visual Basic .NET
Private mCSP As SymmetricAlgorithm
// C#
private SymmetricAlgorithm mCSP;
根據(jù)您在此窗體上選擇的選項按鈕,此 mCSP 變量將被指定給特定的對稱算法類,。SetEnc() 方法將負責創(chuàng)建適當?shù)念愋筒⑵浞祷氐讲煌姆椒ā?BR>' Visual Basic .NET
Private Function SetEnc() As SymmetricAlgorithm
If optDES.Checked Then
Return New DESCryptoServiceProvider
Else
If optTripleDES.Checked Then
Return New TripleDESCryptoServiceProvider
End If
End If
End Function
// C#
private SymmetricAlgorithm SetEnc()
{
if(optDES.Checked)
return new DESCryptoServiceProvider();
else
return new TripleDESCryptoServiceProvider();
}
如您所見,,根據(jù)您在該窗體上選擇的選項按鈕,將創(chuàng)建 DESCryptoServiceProvider 對象或 TripleDESCryptoServiceProvider 對象,。
實現(xiàn)加密和解密的密鑰

要使用對稱算法,,必須提供要使用的密鑰。每個 CryptoSymmetricAlgorithm 實現(xiàn)都提供一種 GenerateKey 方法,。它們實際上使用的是公共語言運行時 (CLR) 類中內(nèi)置的隨機數(shù)生成器類,。我們來看一下 Gen Key(生成密鑰)按鈕的 Click 事件處理程序,看它如何生成要使用的隨機密鑰值,。
' Visual Basic .NET
Private Sub btnKeyGen_Click(ByVal sender As _
System.Object, ByVal e As System.EventArgs) _
Handles btnKeyGen.Click
mCSP = SetEnc()
mCSP.GenerateKey()
txtKey.Text = Convert.ToBase64String(mCSP.Key)
End Sub
// C#
private void btnKeyGen_Click(object sender,
System.EventArgs e)
{
mCSP = SetEnc();
mCSP.GenerateKey();
txtKey.Text = Convert.ToBase64String(mCSP.Key);
}
獲取服務(wù)提供程序的特定實現(xiàn)后,,只需調(diào)用 GenerateKey 方法來創(chuàng)建一個用于加密的新的隨機密鑰。密鑰的大小取決于用來加密的特定提供程序,。例如,DES 密鑰的大小為 64 位,,而 TripleDES 密鑰的大小為 192 位,。每個 SymmetricAlgorithm 類上都有一個 KeySize 屬性,它將返回用于生成密鑰的密鑰大小,。
我們還需要生成初始化向量 (IV),。IV 將幫助算法生成最終加密字符串的數(shù)據(jù)塊。IV 用于開始第一個塊的加密,。如果不提供 IV,,那么只要密鑰相同,在字符串之間傳遞的通用數(shù)據(jù)將保持同一種模式,。因此,,需要使用 IV 作為加密數(shù)據(jù)的“隨機”組件。通過這種方式,,只要使用的 IV 不同,,即使密鑰相同,同一個數(shù)據(jù)也會被加密成完全不同的值。下面是生成新的 IV 的 Gen IV(生成 IV)按鈕的源代碼,。
' Visual Basic .NET
Private Sub btnIVGen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIVGen.Click
mCSP.GenerateIV()
txtIV.Text = Convert.ToBase64String(mCSP.IV)
End Sub
// C#
private void btnIVGen_Click(object sender,
System.EventArgs e)
{
mCSP.GenerateIV();
txtIV.Text = Convert.ToBase64String(mCSP.IV);
}
此代碼看起來與生成密鑰的代碼非常相似,。每個加密服務(wù)提供程序類上都有一個 GenerateIV() 方法。如果未提供 IV,,該方法將生成一個 IV,。
加密數(shù)據(jù)

獲得密鑰和初始化向量后,現(xiàn)在可以使用 Key,、IV 和 Original String 值來創(chuàng)建原始字符串值的加密版本,。單擊 Encrypt(加密)按鈕將運行以下代碼。
' Visual Basic .NET
Private Sub btnEncrypt_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdEncrypt.Click
txtEncrypted.Text = EncryptString(txtOriginal.Text)
End Sub
// C#
private void cmdEncrypt_Click(object sender, System.EventArgs e)
{
txtEncrypted.Text = EncryptString(txtOriginal.Text);
}
Click 事件過程將調(diào)用名為 EncryptString() 的方法,,從 Original String(原始字符串)文本框中接受值并對其進行加密,。然后返回該值并將其放到 Encrypted String(加密字符串)文本框中。下面是 EncryptString() 方法的代碼,。
' Visual Basic .NET
Private Function EncryptString(ByVal Value As String) _
As String
Dim ct As ICryptoTransform
Dim ms As MemoryStream
Dim cs As CryptoStream
Dim byt() As Byte
ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV)
byt = Encoding.UTF8.GetBytes(Value)
ms = New MemoryStream
cs = New CryptoStream(ms, ct, CryptoStreamMode.Write)
cs.Write(byt, 0, byt.Length)
cs.FlushFinalBlock()
cs.Close()
Return Convert.ToBase64String(ms.ToArray())
End Function
// C#
private string EncryptString(string Value)
{
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);
byt = Encoding.UTF8.GetBytes(Value);
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
現(xiàn)在我們分開看一下各行代碼并了解這些代碼的作用,。首先是加密進程的幾個變量。
Dim ct As ICryptoTransform
Dim ms As MemoryStream
Dim cs As CryptoStream
Dim byt() As Byte
ICryptoTransform 是一個接口,。需要此接口才能在任何服務(wù)提供程序上調(diào)用 CreateEncryptor 方法,,服務(wù)提供程序?qū)⒎祷囟x該接口的實際 encryptor 對象。
然后需要將原始字符串轉(zhuǎn)換成字節(jié)數(shù)組,。大多數(shù) .NET 加密算法處理的是字節(jié)數(shù)組而不是字符串,。
byt = Encoding.UTF8.GetBytes(Value)
現(xiàn)在可以執(zhí)行實際的加密了。此進程需要創(chuàng)建一個數(shù)據(jù)流,用于將加密的字節(jié)寫入到其中,。要使用名為 ms 的 MemoryStream 對象,、ICryptoTransform 對象(提供給 CryptoStream 類的構(gòu)造函數(shù))以及說明您希望在何種模式(讀,、寫等)下創(chuàng)建該類的枚舉常數(shù),。創(chuàng)建 CryptoStream 對象 cs 后,,現(xiàn)在使用 CryptoStream 對象的 Write 方法將數(shù)據(jù)寫入到內(nèi)存數(shù)據(jù)流,。這就是進行實際加密的方法,,加密每個數(shù)據(jù)塊時,,數(shù)據(jù)將被寫入 MemoryStream 對象,。
ms = New MemoryStream
cs = New CryptoStream(ms, ct, CryptoStreamMode.Write)
cs.Write(byt, 0, byt.Length)
cs.FlushFinalBlock()
cs.Close()
創(chuàng)建 MemoryStream 后,,該代碼將在 CryptoStream 對象上執(zhí)行 FlushFinalBlock 方法,以確保所有數(shù)據(jù)均被寫入 MemoryStream 對象。該過程將關(guān)閉 CryptoStream 對象,。
最后,,該過程將內(nèi)存數(shù)據(jù)流從字節(jié)數(shù)組轉(zhuǎn)換回字符串,這樣才可以在窗體上的文本框內(nèi)顯示該字符串,??梢允褂?MemoryStream ToArray() 方法從數(shù)據(jù)流中獲取字節(jié)數(shù)組,然后調(diào)用 Convert.ToBase64String() 方法,,該方法接受字節(jié)數(shù)組輸入并使用 Base64 編碼方法將該字符串編碼為可讀內(nèi)容,。
解密數(shù)據(jù)

加密數(shù)據(jù)后,有時還需要解密數(shù)據(jù),。解密數(shù)據(jù)的過程非常簡單,,與加密過程相似。您需要提供加密過程中使用的密鑰和初始化向量,。SymmetricAlgorithm 類的 Key 和 IV 屬性被定義為字節(jié)數(shù)組,。因此,設(shè)置這些屬性之前需要提供您創(chuàng)建的字符串并將其轉(zhuǎn)換成字節(jié)數(shù)組,。下面我們看一下窗體內(nèi)用于解密字符串的 DecryptString 方法,。該方法是從窗體上 Decrypt(解密)按鈕的 Click 事件處理程序中調(diào)用的,。
' Visual Basic .NET
Private Function DecryptString(ByVal Value As String) _
As String
Dim ct As ICryptoTransform
Dim ms As MemoryStream
Dim cs As CryptoStream
Dim byt() As Byte
ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV)
byt = Convert.FromBase64String(Value)
ms = New MemoryStream
cs = New CryptoStream(ms, ct, CryptoStreamMode.Write)
cs.Write(byt, 0, byt.Length)
cs.FlushFinalBlock()
cs.Close()
Return Encoding.UTF8.GetString(ms.ToArray())
End Function
// C#
private string DecryptString(string Value)
{
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);
byt = Convert.FromBase64String(Value);
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Encoding.UTF8.GetString(ms.ToArray());
}

Encrypt 函數(shù)和 Decrypt 函數(shù)只有三個不同之處,。
需要使用 CryptoServiceProvider 類的 CreateDecryptor 方法來創(chuàng)建相應(yīng)的 ICtryptoTransform 對象,。
需要將 Base64 編碼字符串轉(zhuǎn)換成字節(jié)數(shù)組,。需要使用 Convert.FromBase64String 方法來實現(xiàn)此轉(zhuǎn)換,。
通過對原始字節(jié)數(shù)組進行轉(zhuǎn)換,,將字節(jié)數(shù)組轉(zhuǎn)換成相應(yīng)的內(nèi)存數(shù)據(jù)流,。需要將內(nèi)存數(shù)據(jù)流從字節(jié)數(shù)組轉(zhuǎn)換回可以在窗體上再次顯示的普通字符串,。需要使用 Encoding.UTF8.GetString() 方法來實現(xiàn)此轉(zhuǎn)換。
注意:Encoding.UTF8 類來自于 System.Text 命名空間,。
是否可以使其更簡單,?,!
盡管到目前為止顯示的代碼并不難,,但有很多不同的類和接口您可能還不習(xí)慣于使用,。此外,還要記住很多代碼,。下面我們學(xué)習(xí)如何將 Cryptography 類包裝成易于使用的類,。
名為 PDSACryptography 的程序集中有兩個類,,分別為 PDSAHash 和 PDSAEncryption,。這兩個類用于封裝創(chuàng)建散列字符串或加密字符串的實際機制,。此外,,它們還允許您使用枚舉常數(shù)來決定要使用哪種散列或加密算法,。不必記住每個不同的加密服務(wù)提供程序的所有不同的名稱,,即可獲得不錯的 Intellisense? 提供程序列表,。
使用 PDSAHash 包裝散列

PDSAHash 類包含屬性 HashType,、HashObject,、OriginalString,、HashString,、SaltValue、UseSalt 和 SaltLength,。與該類相關(guān)的方法包括 SetEncryptor,、CreateSalt、Reset 和 CreateHash,。該類中創(chuàng)建了一個稱為 PDSAHashType 的枚舉,,您可以從中選擇要使用的相應(yīng)散列類。該類的作用是將上文所示的代碼簡化為以下代碼,。
Private Sub UsePDSAHash()
Dim ph As New PDSAHash(PDSAHash.PDSAHashType.MD5)
MessageBox.Show(ph.CreateHash("Paul"))
End Sub

我寧愿鍵入以上代碼也不愿意記住上文顯示的所有代碼,。如您所見,這段代碼相當簡單,,與上文所述的代碼完全相同,,只是被包裝到一個易于使用的接口中。您可以從本文包含的示例中找到完整的類,。下面列舉了可以使用該類創(chuàng)建的不同散列算法,。
Public Enum PDSAHashType As Byte
MD5
SHA1
SHA256
SHA384
SHA512
End Enum
其中的每個算法都為最終的散列提供了一個不同的安全級別。.NET 中完整的散列類列表如下所示:
MD5CryptoServiceProvider
SHA1CryptoServiceProvider
SHA256Managed
SHA384Managed
SHA512Managed
有關(guān)這些不同的散列類型的詳細信息,,請參閱 Visual Studio .NET 聯(lián)機文檔,。
使用 PDSAEncryption 包裝加密

就像 PDSAHash 類可以包裝 .NET Framework 中的所有散列功能一樣,PDSAEncryption 類可用于包裝 .NET Framework 中的各種對稱算法類,。PDSAEncryption 類包括以下枚舉類型,,允許您創(chuàng)建各種加密/解密對象。
Public Enum PDSAEncryptionType As Byte
DES
RC2
Rijndael
TripleDES
End Enum

同樣,每個服務(wù)提供程序都為加密字符串提供了不同的安全級別,。這在 Visual Studio .NET 聯(lián)機文檔中都有詳細的介紹,,這里不再贅述。
該類包含屬性 EncryptionType,、OriginalString,、EncryptedString、Key,、KeyString,、IV、IVString 和 CryptoProvider,。其中的大多數(shù)屬性都是不言自明的,,但 Key 和 IV 屬于字節(jié)數(shù)組,而 KeyString 和 IVString 是這些字節(jié)數(shù)組的字符串表示,。
該類還包含一些方法,。例如 Encrypt 和 Decrypt。還有 GenerateKey 和 GenerateIV 方法,,如果沒有現(xiàn)成的密鑰和 IV,,可以使用這兩個方法創(chuàng)建一個密鑰和 IV。另外還有 SetEncryptor 方法,,它用于創(chuàng)建將在各種方法中使用的新的 CryptoProvider 對象,。
該類的作用是使加密和解密字符串更容易實現(xiàn)。例如,,下面的代碼片斷顯示了使用該類加密字符串是多么容易,。
Private Sub btnHardCoded_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnHardCoded.Click
Dim ps As New PDSASymmetric( _
PDSASymmetric.PDSAEncryptionType.TripleDES)
MessageBox.Show(ps.Encrypt( _
"Server=localhost;Database=Northwind;uid=sa;pwd=sa"))

End Sub

小結(jié)

使用 Microsoft .NET Framework 中的類可以很容易地在計算機中保存機密信息。您會發(fā)現(xiàn) Cryptography 命名空間中的多個類都可以很好完成這一任務(wù),。為這些類創(chuàng)建包裝可以幫助您大大減少需要編寫的代碼量,。強烈建議您按照本文所述,創(chuàng)建類似的包裝,。注:在示例文件中,,程序員的注釋使用的是英文,本文中將其譯為中文是為了便于讀者理解,。


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多