分享
 
 
 

[翻译]微软.net加密技术简介[上]

王朝c#·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

作者:Paul D. Sheriff

PDSA.com

2003年10月

关键字:

.net

安全

Visual Basic? .NET

C#

概述:学习如何利用.net框架中的加密功能来保护你的数据。

下载代码:CryptoSampleCSSample.msi(

http://download.microsoft.com/download/2/a/3/2a363740-3da6-48e9-a5d1-8eca01524372/CryptoSampleCSSample.msi)

CryptoSampleVBSample.msi(

http://download.microsoft.com/download/2/a/3/2a363740-3da6-48e9-a5d1-8eca01524372/CryptoSampleVBSample.msi)

正文:

你的电脑中有秘密吗?如果有,加密技术就是你最好的工具。加密技术是一种将有含义的字符转换为无含义的字符的科学,用以保证其不会被不具备权限的人阅读。加密技术的历史比计算机的历史还要久远。计算机出现以后,加密技术可以生成几乎不能攻破的密码。微软已经在Windows95中开发并发布了加密API。在.net中,崭新的类将复杂的算法封装在简单易用的方法和属性中。

玉米 牛肉 散列

如果你要做的只是避免密码被他人窃取,你需要创建密码的散列值。散列是一种单向算法,一旦数据被转换,就不可能重新得到数据的原值。大多数开发者使用数据库来存储密码,如果有人查看数据库中的用户数据,将得到用户的密码,除非你在数据库中存储的是密码的散列值。当用户输入用户密码时,你可以再次计算密码的散列值,将其与数据库中存储的散列值进行比较。散列的另一个副产品是,即使原始数据中的一小处修改将产生一个完全不同的散列值。例如“Pork”和“Porky”,进行散列运算后将产生完全不同的输出,而且两个输出之间没有任何联系。

对于.net开发者,有几种散列算法供选择,最常用的是SHA1和MD5。让我们看看如何将一个普通的字符串“Paul”进行散列运算,得到一个完全不可辨认的值。

使用SHA1计算散列

让我们创建一个新的例程来计算字符串“Paul”的散列值。在Visual Studio .NET中创建一个新的Windows应用程序,在窗体上拖放一个按钮。在按钮的Click事件中,调用一个名称为HashText的方法。下面就是你添加到窗体代码中用来试验散列算法的代码。在输入代码之前你需要引入System.Security.Cryptography命名空间。

以下内容为程序代码:

Private Sub HashText(ByVal TextToHash As String)

Dim SHA1 As SHA1CryptoServiceProvider

Dim bytValue() As Byte

Dim bytHash() As Byte

' Create New Crypto Service Provider Object

SHA1 = New SHA1CryptoServiceProvider

' Convert the original string to array of Bytes

bytValue = _

System.Text.Encoding.UTF8.GetBytes(TextToHash)

' Compute the Hash, returns an array of Bytes

bytHash = SHA1.ComputeHash(bytValue)

SHA1.Clear()

' Return a base 64 encoded string of the Hash value

Debug.WriteLine(Convert.ToBase64String(bytHash))

End Sub

你可以将一个字符串传入这个例程,以得到散列值。例如,你可以传入“Paul”这个字符串,调试窗口将显示下列字符:

以下内容为程序代码:

w2h6uYgMJt/nq5ZqihcBteAXwv8=

现在将传入的值改为“Pauly”,你可以看到如下输出:

以下内容为程序代码:

proywxJ0znMpGF5sbB18+7GSAsM=

正象你看到的,传入字符串的一处小小的改动就生成了一个完全不同的结果。这也是散列如此有效的原因————很难得到字符转换的模式或者从加密的字符串中得到原始字符串的内容。

使用MD5计算散列

一旦你学会了使用一个散列类,你已经基本上掌握了所有的散列类。下面的方法使用的就是MD5散列算法。我想你已经注意到代码基本上是相同的,除了CryptoServiceProvider类是不同的。

以下内容为程序代码:

Private Sub HashTextMD5(ByVal TextToHash As String)

Dim md5 As MD5CryptoServiceProvider

Dim bytValue() As Byte

Dim bytHash() As Byte

' Create New Crypto Service Provider Object

md5 = New MD5CryptoServiceProvider

' Convert the original string to array of Bytes

bytValue = System.Text.Encoding. _

UTF8.GetBytes(TextToHash)

' Compute the Hash, returns an array of Bytes

bytHash = md5.ComputeHash(bytValue)

md5.Clear()

' Return a base 64 encoded string of the Hash value

Debug.WriteLine(Convert.ToBase64String(bytHash))

End Sub

传入“Paul”,MD5算法输出的字符串如下:

以下内容为程序代码:

nVWBsHh1MKNctPioSyqyTQ==

加密的字符串和原始字符串完全不同。散列算法非常适合于用于密码,因为生成的字符串完全没有任何含义,所以黑客十分难于破解。你可以使用散列算法得到密码的散列值存储在数据库中。当用户输入密码时,你首先得到密码的散列值,然后通过网络发送散列值,和数据库中存储的散列值进行比较。请记住散列是单向操作,一旦进行散列操作,你永远不能恢复原始的密码。

如何选择算法

上面介绍的各种散列算法进行的操作是一样的。其区别只在于用于产生散列所用的键值(key)的长度,所用键值的长度越大,加密的安全性就越强。例如SHA1使用160位(bit)的加密键值,然而MD5使用的是128位的加密键值,所以SHA1比MD5更难于破解。

选择散列算法时另一点需要考虑的是,是否有实际的或理论上出现冲突的可能。如果重现冲突,两个截然不同的字符串经过散列运算后将得到同样的结果。SHA1在理论上和实际上,都没有出现冲突的可能。MD5在理论上可能出现冲突,但是在实际中却没有可能。所以选择散列算法的关键还是你需要的安全性。

创建散列应用范例

文章中包括两个散列应用范例,用以演示使用不同的散列算法加密任何字符串。这两个应用被命名为CryptoSampleVB.sln和CryptoSampleCS.sln。其中CryptoSampleVB是一个Visual Basic应用程序,CryptoSampleCS是C#应用程序。两个应用都包含一个图1所示的窗体(Form),你可以在其中输入你想要计算散列的字符串,你可以通过一个单选按钮选择使用的散列算法,结果将在一个文本框中显示。

图1创建一个通用散列窗体用以测试多种散列算法

当你点击窗体上的“Hash”按钮时,将触发按钮的Click事件,事件处理处理程序将调用一个名为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()方法取得你输入的字符串并调用SetHash方法,这个方法将根据你在窗体中选择的单选按钮决定使用哪种加密服务提供者(cryptography service provider)来创建一个实例来返回调用者。程序将创建一个类型为HashAlgorithm,名为mHash的成员变量。HashAlgorithm是创建的所有加密服务提供者的基类。

以下内容为程序代码:

' 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();

}

根据你在窗体上选择的单选按钮,将创建一个特定类型的HashAlgorithm型变量并从方法中返回给调用者。HashString()方法进行实际的数据加密操作:

以下内容为程序代码:

' Visual Basic .NET

Private Function HashString(ByVal Value As String) _

As String

Dim bytValue() As Byte

Dim bytHash() As Byte

' Create New Crypto Service Provider Object

mhash = SetHash()

' Convert the original string to array of Bytes

bytValue = System.Text.Encoding.UTF8.GetBytes(Value)

' Compute the Hash, returns an array of Bytes

bytHash = mhash.ComputeHash(bytValue)

mhash.Clear()

' Return a base 64 encoded string of the Hash value

Return Convert.ToBase64String(bytHash)

End Function

// C#

private string HashString(string Value)

{

mhash = SetHash();

// Convert the original string to array of Bytes

byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(Value);

// Compute the Hash, returns an array of Bytes

byte[] bytHash = mhash.ComputeHash(bytValue);

mhash.Clear();

// Return a base 64 encoded string of the Hash value

return Convert.ToBase64String(bytHash);

}

在HashString()方法中创建两个Byte数组,第一个数组保存用户输入的原始字符串,你可以利用System.Text.Encoding.UTF8.GetBytes()方法将用户输入的字符串转换为Byte数组。将用户输入的字符串转换为Byte数组后,你就可以利用服务提供者(service provider)的ComputeHash()方法计算字符串的散列值。这个方法接受一个Byte数组,并以Byte数组型式返回加密的字符串。

注意:完成散列操作后及时清理散列变量总是个好主意。计算字符串的散列值后,你可以调用Clear方法释放创建的散列变量。

现在你得到了一个加密后的Byte数组用以返回调用者。既然你想以字符串(string)而不是Byte数组的形式处理输入和输出的值,你应该调用Convert.ToBase64String方法返回加密结果的字符串格式。这个方法可以将一个Byte数组转换为Base64编码的字符串。既然你想将字符串用在网页中或存储在数据库中,你应该使用Base64编码的字符串。如果你不进行这样的转换,加密字符串中的某些ASCII字符将可能不能正确的显示或保存。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有