Microsoft .NET 中的简化加密__教程 |
|
日期:2007-5-20 1:15:08 人气:168 [大 中 小] |
|
|
|
创建示例散列项目 本文包含两个示例散列项目,以更普通的方式说明如何使用不同的散列算法加密任意字符串。这两个示例项目的名称分别为 CryptoSampleVB.sln 和 CryptoSampleCS.sln。前者是 Visual Basic .NET 解决方案,后者是 C# 解决方案。两个解决方案都包括一个类似图 1 的窗体,该窗体允许您输入要通过散列算法为其加密的原始字符串,还提供一个用来选择散列算法的选项按钮和一个显示散列结果的文本框。
图 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() 方法。此方法将根据窗体上选项按钮的设置来决定使用哪个加密服务提供程序创建该方法的实例并返回该方法。将为该窗体创建一个名为 mHash 的 HashAlgorithm 类型的成员变量。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
' 创建新的加密服务提供程序对象 mhash = SetHash()
' 将原始字符串转换成字节数组 bytValue = System.Text.Encoding.UTF8.GetBytes(Value)
' 计算散列,并返回一个字节数组 bytHash = mhash.ComputeHash(bytValue)
mhash.Clear()
' 返回散列值的 Base64 编码字符串 Return Convert.ToBase64String(bytHash) End Function
// C# private string HashString(string Value) { mhash = SetHash();
// 将原始字符串转换成字节数组 byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(Value);
// 计算散列,并返回一个字节数组 byte[] bytHash = mhash.ComputeHash(bytValue);
mhash.Clear();
// 返回散列值的 Base64 编码字符串 return Convert.ToBase64String(bytHash); } 在 HashString 方法中,我们创建了两个字节数组。第一个数组用来保存用户的原始字符串输入。我们使用 System.Text.Encoding.UTF8.GetBytes() 方法将该字符串转换成字节数组。将原始字符串转换成字节数组后,现在使用服务提供程序的 ComputeHash() 方法计算该字符串的散列值。此方法接受字节数组作为输入,然后返回该字符串加密格式的字节数组。
注意:完成之后清除散列变量是一个好的做法。因此,您看到计算该字符串的散列后,我们调用了 Clear 方法。 现在我们已经获得了加密的字节数组,这正是要从该方法返回的数组。因为我们要将原始值和加密值都作为字符串数据类型而不是字节数组进行处理,所以要通过使用 Convert.ToBase64String 方法返回加密的字节。此方法负责将字节数组转换成 Base64 编码的字符串。Base64 编码的使用非常重要,因为有可能需要将此字符串推到 Web 页上或将其存储到数据库中。如果不进行转换,加密字符串中的某些高阶 ASCII 字符将无法正确显示或存储。
在散列中添加一些“盐”值 到目前为止,散列算法暴露出来的问题之一是,如果两个用户碰巧使用相同的密码,那么散列值将完全相同。如果黑客看到您存储密码的表格,会从中找到规律并明白您很可能使用了常见的词语,然后黑客会开始词典攻击以确定这些密码。要确保任何两个用户密码的散列值都不相同,一种方法是在加密密码之前,在每个用户的密码中添加一个唯一的值。这个唯一值称为“盐”值。在进行此操作时,需要确保将使用的盐值存储为用户记录的一部分。如果您使用表格存储用户 ID 和密码,我建议您使用不同的表格来存储盐值。这样,即使数据库泄漏,盐值也可以为您提供一层额外的安全保护。 |
|
出处:本站原创 作者:佚名 |
|
|