我们都知道数据使我们计算机处理的基本元素,现在是信息时代,所以数据也是在爆炸,我们的计算机每时每刻都在处理这些数据,对于一个企业来说这些信息也许就是他们的命根子,比如:某公司的客户资源意外的泄漏出去那么我想对该企业来将是最大的损失.因此计算机的安全性尤为重要,这里我们不靠率OS的安全隐患或者OS的安全问题,这些留给黑克们去研究好了.今天我要介绍的是.NET里面我们如何保护我们的数据,这样我们首先想到的就是加密数据,是的加密数据是一种最有效也是最直接的保护数据的办法.好了废话就不多说了,下面我们利用.NET里面命名空间下的System.Security.Cryptography如果想了解该命名空间的详细信息请浏览MSDN帮助.
在通常情况下我们将用户名和密码存在数据库中,登陆数据库是需要密码的,所以我们认为我们的数据(用户名和密码)是安全的,是这样吗?我认为基本上是这样,但是如果对于一些人来说这个密码不起作用(有恶意的内部人员),解决这个问题的办法我们使用Hash加密的方法,这种加密的方法得到的密文是不能被返回来的,也就是说有了密文是不能得到明文的,我们就把这种密文存于数据库中即使你打开看也无济于事,为了可以让程序识别出正确的用户,我们用同样的方法给用户输入的密码(明文)加密以后再和数据库重的密码比较这样来判断是否为合法用户.前面是说了一个简单的例子,下面我们看看在.NET中是怎么实现这种加密方法的.首先我们要非常感谢微软给我们提供的框架,它几乎想到了我们要做的每一件事情,在上面提到的命名空间里就有我们需要的类来完成我上面说的功能.
不可逆的加密算法(Hash算法):
我们可以在该命名空间下看到一个SHA1的类和MD5的类,这也是我们最长用的两种不可逆的加密Hash算法,首先我们先要介绍一下SHA1接下来是MD5.
SHA1:
首先我们看看他的描述: The hash is used as a unique value of fixed size representing a large amount of data. Hashes of two sets of data should match if the corresponding data also matches. Small changes to the data result in large, unpredictable changes in the hash.
The hash size for the SHA1 algorithm is 160 bits.
其次我们将要用SHA1CryptoServiceProvider来实例化一个SHA1的实例,然后利用ComputeHash方法计算他的Hash码具体的代码如下:
private HashAlgorithm mhash;
private string HashString(string Value,string hashDes){
byte[] bytValue;
byte[] bytHash;
mhash = SetHash(hashDes);
// 将原始字符串转化成字节的形式
bytValue = System.Text.Encoding.UTF8.GetBytes(Value);
// 计算Hash结果同时返回结果给bytHash
bytHash = mhash.ComputeHash(bytValue);
mhash.Clear();
// 返回Hash结果的Base64的编码
return Convert.ToBase64String(bytHash);
}
上面使用了一个工厂方法SetHash,改方法的具体内容如下:
private HashAlgorithm SetHash(string hashScription){
HashAlgorithm retHash;
switch(hashScription){
case "SHA1":{
retHash = new SHA1CryptoServiceProvider();
break;
}
case "MD5" :{
retHash = new MD5CryptoServiceProvider();
break;
}
default :{
retHash = new SHA1CryptoServiceProvider();
break;
}
}
return retHash;
}
因为我们在该应用程序中定义了一个全局的对象mhash所以我们在HashString方法里面可以直接赋值.这个工厂方法可以让我们得到一个HashAlgorithm的对象,这样可以将推迟对象实例化的时间,让程序更具灵活性详细的信息参看(http://www.csdn.net/Develop/read_article.asp?id=21036).利用这个工厂方法我们不仅可以的到SHA1的对象还可以得到MD5的对象(这取决于子类).我们将根据输入的描述信息来确定实例化那个类,如果没有输入则默认为SHA1对象.
可以看出利用.NET框架很容易的就实现了SHA1和MD5的加密工作(.NET越来越丰富我们做的工作越来越少,是不是有一天我们就没事做了? J).上面的方法有一个很致命的弱点,就是如果有人用算法来穷举那么他用同样的方法加密的字符不是同样可以通过系统的验证吗?毕竟这是一种公共的加密方法嘛.解决这个问题也有一些办法,比如我们在Hash的时候不止是Hash密码,我们可以给密码中添加一些其他的信息比如:手记号码,住址等等,这样即使知道算法和密码如果不知道那个附加信息还是白玩.当然了要是你还是想用.NET框架完成这个工作也很容易,微软想到了这点,我们可以利用System.Security.Cryptography.RNGCryptoServiceProvider来作到,它是一个随机数字产生器,当然为了可以让合法的人登陆系统,我们需要将这些随机数也要存入数据库,至于存在哪里,当然是一个最不起眼的地方了.还有的做法就是将密码异或再加密等等等,只要你能想出来的都可以.
上面介绍的是Hash的加密算法以及简单的实现方法,下面将要介绍一下可以还原(也就是双向的Two-way)的加密算法.(未完待续…)
参考文献: http://msdn.microsoft.com/