NET框架中提供了许多Hash类 每种算法的实现方式不同 但是在使用层面上 NET为我们提供了几乎一致的 *** 作 所谓一通百通 在本节不打算把所有的算法都做演示 因为这样既没必要性也鄙视读者的智商
关于SHA 我们选用托管实现SHA Managed类做演示 在实际应用中 我建议各位读者尽可能的使用托管实现 因为基于加密服务的实现对特定的 *** 作系统环境有依赖性
代码清单 演示了简单的Hash应用 将一个字符串散列之后保存散列值 然后对字符串做验证 *** 作
代码清单 SHA Managed类的简单应用
class Program
{
static SHA Managed sha M = new SHA Managed()
static void Main(string[] args)
{
string testString = 大家好 我是xuanhun 欢迎阅读我的文章!
byte[] hashY = GetHashData(testString testString)
string testString = 大家好 我是xuanhun 欢迎阅读我的文章!
byte[] hashY = GetHashData(testString testString )
string ChangedString = 大家好 我是xuanhun 欢迎阅读我的文章
byte[] hashChange = GetHashData(ChangedString ChangedString)
Console Read()
}
private static byte[] GetHashData(string s string ys)
{
Console WriteLine( { }: ys)
byte[] buffer = Encoding UTF GetBytes(s)
byte[]hashBytes= sha M ComputeHash(buffer)
OutHash(hashBytes)
return hashBytes
}
private static void OutHash(byte[] hashBytes)
{
foreach (byte b in hashBytes)
{
Console Write( { } b)
}
Console WriteLine()
Console WriteLine()
}
}
现在我们简单分析代码清单 先看GetHashData方法 它的主要工作是对传入的字符串s做处理 获取它的hash值 第一步通过Encoding UTF GetBytes(s)把字符串转成byte数组 然后对该byte数组进行散列 *** 作 完成 *** 作的是下面这条语句
byte[]hashBytes= sha M ComputeHash(buffer)
sha M是SHA Managed的实例 这里我们使用ComputeHash方法返回byte数组的Hash值
OutHash方法用来输出散列值
Main方法中我定义了三个字符串 第一个和第二个字符串完全一样 第三个字符串只少了一个叹号( ! ) 下面我们看一下这段程序的运行结果 如图 所示
图 代码清单 的运行结果
从图 中我们很容易看出 改掉一个字符 hash值发生了很大的变化
在实际应用中 为了增强安全性 我们更倾向于使用键控Hash NET中的每个Hash加密算法都有对应的键控Hash类 针对于上个例子 我们演示如何使用HMACSHA 类 实例程序如代码清单 所示
代码清单 HMACSHA 类应用实例
class Program
{
public static void Encript(byte[] key String sourceFile String destFile)
{
HMACSHA myhmacsha = new HMACSHA (key)
FileStream inStream = new FileStream(sourceFile FileMode Open)
FileStream outStream = new FileStream(destFile FileMode Create)
byte[] hashValue = myhmacsha ComputeHash(inStream)
inStream Position =
outStream Write(hashValue hashValue Length)
int bytesRead
byte[] buffer = new byte[ ]
do
{
bytesRead = inStream Read(buffer )
outStream Write(buffer bytesRead)
} while (bytesRead >)
myhmacsha Clear()
inStream Close()
outStream Close()
return
}
public static bool Decript(byte[] key String sourceFile)
{
HMACSHA hmacsha = new HMACSHA (key)
byte[] storedHash = new byte[hmacsha HashSize / ]
FileStream inStream = new FileStream(sourceFile FileMode Open)
inStream Read(storedHash storedHash Length)
byte[] putedHash = hmacsha ComputeHash(inStream)
for (int i = i <storedHash Lengthi++)
{
if (putedHash[i] != storedHash[i])
{
Console WriteLine( Hash值验证失败文件被篡改! )
return false
}
}
Console WriteLine( 文件完整! )
return true
}
public static void Main(string[] Fileargs)
{
string file = @ f:\ txt
string file = @ f:\ txt
try
{
byte[] secretkey = new Byte[ ]
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider()
rng GetBytes(secretkey)
Encript(secretkey file file )
Decript(secretkey file )
}
catch (IOException e)
{
Console WriteLine(e Message)
}
Console Read()
}
}
}
看代码清单 在Main方法中 我定义了file 和file 两个变量 file 为本地磁盘的一个已经存在的文件 file 是未存在的文件 将由程序创建 下面注意Main方法中的这两句代码
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider()
rng GetBytes(secretkey)
RNGCryptoServiceProvider类提供方法用来生成高强度随机数 这里我们用来生成作为HMACSHA 类的加密和解密的密钥
Encript方法用来使用HMACSHA 类生成文件file 的加密Hash值 我们首先创建了两个文件流inStream和outStream分别对应file 和file 然后读取file 的内容 使用myhmacsha ComputeHash方法获取加密的Hash值 并将该值写入file
Decript方法用来验证文件完整性 验证文件完整性的方法很简单 我们读出保存在file 中key的Hash数据 然后使用之前的Key对该数据执行Hash 如果得到的Hash值和取出的KeyHash值相同 则数据完整
执行加密Hash的过程后 file 和file 的文件内容如图 所示
图 执行加密Hash的过程后 file 和file 的文件内容
从图中 我们可以看出 加密Hash值被添加在原文内容的前边
验证结果如图 所示
lishixinzhi/Article/program/ASP/201311/21811
ASP.NET3.5网站开发实例教程?
首先运行visualstudio2015进入vs2015主画面
找到左上角的文件依次找到文件->新建->项目
在打开的新建项目窗口中,找到我们的framwork版本我们选择ASP.NET3.5
选择ASP.NET3.5后,在左侧找到web项目选择ASP.NET空web应用程序
接着定义我们的应用程序名称和位置设定完成后,选择确定,选择确定后,就会根据我们的设定,生成应用程式所需的文件和框架目录结构见下图
因为我们是创建的空应用程序所有整个目录结构很简单我们可以右键单击我们的应用程序,选择属性来确认我们当前的框架是否使用的是ASP.NET3.5
接着我们就可以开发我们的web应用程序了我们新建一个aspx页面简单的填入以下内容:<%@PageLanguage=C#AutoEventWireup= rueCodeBehind=WebForm1.aspx.csInherits=WebApplication1.WebForm1%>
撰写代码完成后,保存并运行就可以了这样一个简单的web应用程序实例就创建完成了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)