免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Microsoft .NET 中的簡化加密(1)

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

適用于:
Microsoft? .NET
安全
Microsoft? Visual Basic? .NET
C#
您希望在計(jì)算機(jī)上保存一些機(jī)密信息嗎?如果是,本文就為您介紹如何進(jìn)行加密!加密技術(shù)就是將有意義的字符編碼成無意義的字符,使不應(yīng)該訪問這些數(shù)據(jù)的人員無法讀取它們。加密技術(shù)已經(jīng)存在很多年了,甚至遠(yuǎn)在計(jì)算機(jī)誕生之前就已經(jīng)存在了。隨著計(jì)算機(jī)的出現(xiàn),在計(jì)算機(jī)領(lǐng)域應(yīng)用加密技術(shù)可以生成幾乎牢不可破的代碼。Microsoft 在 Windows 95 中開發(fā)并分發(fā)了加密 API。使用 Microsoft .NET,新創(chuàng)建的類可以將這些復(fù)雜的算法打包到非常易于使用的屬性和方法中。
散列簡介

如果您只是不想讓別人竊取您的密碼,那么可以為密碼數(shù)據(jù)創(chuàng)建一個(gè)散列。散列是一種單向算法,一旦數(shù)據(jù)被轉(zhuǎn)換,將無法再獲得其原始值。大多數(shù)開發(fā)人員使用數(shù)據(jù)庫存儲(chǔ)密碼。但是,在數(shù)據(jù)庫中查找用戶數(shù)據(jù)的人員也能夠看到這些密碼。不過,您可以使用散列算法對(duì)密碼進(jìn)行加密,然后再將其存儲(chǔ)在數(shù)據(jù)庫中。用戶輸入密碼后,您可以再次使用散列算法對(duì)其進(jìn)行解密,然后將其與存儲(chǔ)在數(shù)據(jù)庫中的散列進(jìn)行比較。散列的缺點(diǎn)之一是,即使原始數(shù)據(jù)只發(fā)生一個(gè)小小的改動(dòng),數(shù)據(jù)的散列也會(huì)發(fā)生非常大的變化。Pork 和 Porky 這兩個(gè)單詞非常相似,但使用散列算法加密后的結(jié)果卻相去甚遠(yuǎn)。您可能根本看不出二者之間有什么相似之處。
.NET 開發(fā)人員可以使用多種散列算法類。最常用的是 SHA1 和 MD5。下面我們看一下如何為“Paul”這樣的普通字符串生成散列,使任何人都無法識(shí)別它。
使用 SHA1 生成散列

我們創(chuàng)建一個(gè)新例程,然后使用它為字符串“Paul”生成散列。在 Visual Studio? .NET 中打開一個(gè)新的 Windows 應(yīng)用程序,在窗體上放置一個(gè)命令按鈕。當(dāng)該命令按鈕上發(fā)生 Click 事件時(shí),將調(diào)用名為 HashText() 的方法。您可以將以下代碼添加到該窗體中,看一下此散列算法的實(shí)際效果。編寫下列代碼之前,需要導(dǎo)入命名空間 System.Security.Cryptography。
Private Sub HashText(ByVal TextToHash As String)
Dim SHA1 As SHA1CryptoServiceProvider
Dim bytValue() As Byte
Dim bytHash() As Byte
' 創(chuàng)建新的加密服務(wù)提供程序?qū)ο?br>SHA1 = New SHA1CryptoServiceProvider
' 將原始字符串轉(zhuǎn)換成字節(jié)數(shù)組
bytValue = _
System.Text.Encoding.UTF8.GetBytes(TextToHash)
' 計(jì)算散列,并返回一個(gè)字節(jié)數(shù)組
bytHash = SHA1.ComputeHash(bytValue)
SHA1.Clear()
' 返回散列值的 Base64 編碼字符串
Debug.WriteLine(Convert.ToBase64String(bytHash))
End Sub
您可以傳遞不同的字符串值來調(diào)用該例程,查看散列值的變化。例如,如果將字符串“Paul”傳遞給該例程,Debug(調(diào)試)窗口將顯示以下文本:
w2h6uYgMJt/nq5ZqihcBteAXwv8=
現(xiàn)在,將此過程中的輸入值更改為“Pauly”。您將看到以下輸出結(jié)果:
proywxJ0znMpGF5sbB18+7GSAsM=
如您所見,輸入字符串的一個(gè)小小變化就會(huì)產(chǎn)生完全不同的字符組合。這正是散列算法之所以有效的原因,它使我們很難找到輸入字符串的規(guī)律,也很難根據(jù)加密后的字符弄清楚字符串原來的模樣。
使用 MD5 也可以生成散列

了解一種散列類的使用方法后,基本上就了解了所有的散列類。下面的方法用于 MD5 散列算法。注意,除了 CryptoServiceProvider 類不同外,代碼是完全相同的。
Private Sub HashTextMD5(ByVal TextToHash As String)
Dim md5 As MD5CryptoServiceProvider
Dim bytValue() As Byte
Dim bytHash() As Byte
' 創(chuàng)建新的加密服務(wù)提供程序?qū)ο?br>md5 = New MD5CryptoServiceProvider
' 將原始字符串轉(zhuǎn)換成字節(jié)數(shù)組
bytValue = System.Text.Encoding. _
UTF8.GetBytes(TextToHash)
' 計(jì)算散列,并返回一個(gè)字節(jié)數(shù)組
bytHash = md5.ComputeHash(bytValue)
md5.Clear()
' 返回散列值的 Base64 編碼字符串
Debug.WriteLine(Convert.ToBase64String(bytHash))
End Sub
輸入“Paul”之后,MD5 散列算法的輸出結(jié)果如下所示:
nVWBsHh1MKNctPioSyqyTQ==
同樣,加密后的字符串看起來也與原始輸入相去甚遠(yuǎn)。這些散列算法對(duì)于創(chuàng)建沒有任何意義的密碼來說非常有用,也使黑客很難猜出這些密碼。之所以使用散列算法,是因?yàn)榭梢杂眠@種算法對(duì)密碼進(jìn)行加密并將其存儲(chǔ)在數(shù)據(jù)庫中。然后,當(dāng)用戶輸入真實(shí)密碼時(shí),您先對(duì)密碼進(jìn)行解密,然后通過網(wǎng)絡(luò)發(fā)送到數(shù)據(jù)庫中,比較它與數(shù)據(jù)庫中的密碼是否匹配。請(qǐng)記住,散列是單向操作。使用散列算法對(duì)原始密碼加密后將無法再恢復(fù)。
如何選擇算法

本文介紹的兩種散列算法都執(zhí)行同一種操作。不同之處只在于生成散列的密鑰大小以及使用的算法。使用的密鑰越大,加密就越安全。例如,MD5 使用的加密密鑰比 SHA1 使用的密鑰大,因此 MD5 散列較難破解。
對(duì)于散列算法要考慮的另外一點(diǎn)是,從實(shí)踐或理論的角度上看是否存在沖突的可能性。沖突是我們所不希望的,因?yàn)閮蓚€(gè)不同的單詞可能會(huì)生成相同的散列。例如,SHA1 從實(shí)踐或理論上來講沒有發(fā)生沖突的可能性。MD5 從理論上講有發(fā)生沖突的可能性,但從實(shí)踐上講沒有發(fā)生沖突的可能性。因此,選擇哪種算法歸根結(jié)底取決于您所需要的安全級(jí)別。
創(chuàng)建示例散列項(xiàng)目

本文包含兩個(gè)示例散列項(xiàng)目,以更普通的方式說明如何使用不同的散列算法加密任意字符串。這兩個(gè)示例項(xiàng)目的名稱分別為 CryptoSampleVB.sln 和 CryptoSampleCS.sln。前者是 Visual Basic .NET 解決方案,后者是 C# 解決方案。兩個(gè)解決方案都包括一個(gè)類似圖 1 的窗體,該窗體允許您輸入要通過散列算法為其加密的原始字符串,還提供一個(gè)用來選擇散列算法的選項(xiàng)按鈕和一個(gè)顯示散列結(jié)果的文本框。
創(chuàng)建一個(gè)通用散列屏幕來嘗試兩種散列算法。
單擊此屏幕上的 Hash(散列)按鈕時(shí),將運(yùn)行該按鈕的 Click 事件過程。此事件過程將調(diào)用一個(gè)名為 HashString() 的例程。
' Visual Basic .NET
Private Sub btnHash_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnHash.Click
txtHashed.Text = HashString(txtOriginal.Text)
End Sub
// C#
private void cmdHash_Click(object sender,
System.EventArgs e)
{
txtHashed.Text = HashString(txtOriginal.Text);
}
HashString() 方法接受輸入的值并調(diào)用 SetHash() 方法。此方法將根據(jù)窗體上選項(xiàng)按鈕的設(shè)置來決定使用哪個(gè)加密服務(wù)提供程序創(chuàng)建該方法的實(shí)例并返回該方法。將為該窗體創(chuàng)建一個(gè)名為 mHash 的 HashAlgorithm 類型的成員變量。HashAlgorithm 類型是創(chuàng)建所有散列加密服務(wù)提供程序的基類。
' Visual Basic .NET
Private mhash As HashAlgorithm
// C#
private HashAlgorithm mhash;
SetHash() 方法如下所示:
' Visual Basic .NET
Private Function SetHash() As HashAlgorithm
If optSHA1.Checked Then
Return New SHA1CryptoServiceProvider
Else
If optMD5.Checked Then
Return New MD5CryptoServiceProvider
End If
End If
End Function
// C#
private HashAlgorithm SetHash()
{
if(this.optSHA1.Checked)
return new SHA1CryptoServiceProvider();
else
return new MD5CryptoServiceProvider();
}
根據(jù)您在窗體上選擇的選項(xiàng)按鈕,此方法將創(chuàng)建并返回一個(gè)不同的 HashAlgorithm 類型。HashString() 方法在該窗體上執(zhí)行實(shí)際的數(shù)據(jù)加密:
' Visual Basic .NET
Private Function HashString(ByVal Value As String) _
As String
Dim bytValue() As Byte
Dim bytHash() As Byte
' 創(chuàng)建新的加密服務(wù)提供程序?qū)ο?br>mhash = SetHash()
' 將原始字符串轉(zhuǎn)換成字節(jié)數(shù)組
bytValue = System.Text.Encoding.UTF8.GetBytes(Value)
' 計(jì)算散列,并返回一個(gè)字節(jié)數(shù)組
bytHash = mhash.ComputeHash(bytValue)
mhash.Clear()
' 返回散列值的 Base64 編碼字符串
Return Convert.ToBase64String(bytHash)
End Function
// C#
private string HashString(string Value)
{
mhash = SetHash();
// 將原始字符串轉(zhuǎn)換成字節(jié)數(shù)組
byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(Value);
// 計(jì)算散列,并返回一個(gè)字節(jié)數(shù)組
byte[] bytHash = mhash.ComputeHash(bytValue);
mhash.Clear();
// 返回散列值的 Base64 編碼字符串
return Convert.ToBase64String(bytHash);
}
在 HashString 方法中,我們創(chuàng)建了兩個(gè)字節(jié)數(shù)組。第一個(gè)數(shù)組用來保存用戶的原始字符串輸入。我們使用 System.Text.Encoding.UTF8.GetBytes() 方法將該字符串轉(zhuǎn)換成字節(jié)數(shù)組。將原始字符串轉(zhuǎn)換成字節(jié)數(shù)組后,現(xiàn)在使用服務(wù)提供程序的 ComputeHash() 方法計(jì)算該字符串的散列值。此方法接受字節(jié)數(shù)組作為輸入,然后返回該字符串加密格式的字節(jié)數(shù)組。
注意:完成之后清除散列變量是一個(gè)好的做法。因此,您看到計(jì)算該字符串的散列后,我們調(diào)用了 Clear 方法。
現(xiàn)在我們已經(jīng)獲得了加密的字節(jié)數(shù)組,這正是要從該方法返回的數(shù)組。因?yàn)槲覀円獙⒃贾岛图用苤刀甲鳛樽址當(dāng)?shù)據(jù)類型而不是字節(jié)數(shù)組進(jìn)行處理,所以要通過使用 Convert.ToBase64String 方法返回加密的字節(jié)。此方法負(fù)責(zé)將字節(jié)數(shù)組轉(zhuǎn)換成 Base64 編碼的字符串。Base64 編碼的使用非常重要,因?yàn)橛锌赡苄枰獙⒋俗址频?Web 頁上或?qū)⑵浯鎯?chǔ)到數(shù)據(jù)庫中。如果不進(jìn)行轉(zhuǎn)換,加密字符串中的某些高階 ASCII 字符將無法正確顯示或存儲(chǔ)。
在散列中添加一些“鹽”值

到目前為止,散列算法暴露出來的問題之一是,如果兩個(gè)用戶碰巧使用相同的密碼,那么散列值將完全相同。如果黑客看到您存儲(chǔ)密碼的表格,會(huì)從中找到規(guī)律并明白您很可能使用了常見的詞語,然后黑客會(huì)開始詞典攻擊以確定這些密碼。要確保任何兩個(gè)用戶密碼的散列值都不相同,一種方法是在加密密碼之前,在每個(gè)用戶的密碼中添加一個(gè)唯一的值。這個(gè)唯一值稱為“鹽”值。在進(jìn)行此操作時(shí),需要確保將使用的鹽值存儲(chǔ)為用戶記錄的一部分。如果您使用表格存儲(chǔ)用戶 ID 和密碼,我建議您使用不同的表格來存儲(chǔ)鹽值。這樣,即使數(shù)據(jù)庫泄漏,鹽值也可以為您提供一層額外的安全保護(hù)。
在用戶密碼中添加鹽值的方法有多種。最簡單的方法是摘取用戶的某些信息(例如姓、名、電子郵件地址或員工 ID)并將其添加到用戶密碼中,然后再進(jìn)行加密。這種方法的缺點(diǎn)是,因?yàn)槟枰鎯?chǔ)鹽值,所以如果黑客找到該值,將會(huì)對(duì)您所做的一切操作了如指掌。當(dāng)然,黑客需要花費(fèi)額外的時(shí)間來破解鹽值,但這對(duì)黑客來說簡直是易如反掌。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
概述VB.NET加密經(jīng)驗(yàn)總結(jié)
結(jié)合反射技術(shù)實(shí)現(xiàn)多算法動(dòng)態(tài)加密
DotNet加密方式解析--散列加密
MessageDigest簡介
Java MD5 加密算法類
C#開發(fā)中常用加密解密方法解析
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服