哈希与加密在现代工程领域应用非常广泛,在计算机领域也发挥了很大作用,这里我们仅仅讨论在平常的软件开发中最常见的应用——数据保护。 所谓数据保护,是指在数据库被非法访问的情况下,保护敏感数据不被非法访问者直接获取。这是非常有现实意义的,试想一个公司的安保系统数据库服务器被入侵,入侵者获得了所有数据库数据的查看权限,如果管理员的口令(Password)被明文保存在数据库中,则入侵者可以进入安保系统,将整个公司的安保设施关闭,或者删除安保系统中所有的信息,这是非常严重的后果。但是,如果口令经过良好的哈希或加密,使得入侵者无法获得口令明文,那么最多的损失只是被入侵者看到了数据库中的数据,而入侵者无法使用管理员身份进入安保系统作恶。 1. 哈希(Hash)与加密(Encrypt)的选择 要实现上述的数据保护,可以选择使用哈希或加密两种方式。那么在什么时候该选择哈希、什么时候该选择加密呢? 基本原则是:如果被保护数据仅仅用作比较验证,在以后不需要还原成明文形式,则使用哈希;如果被保护数据在以后需要被还原成明文,则需要使用加密。 例如,你正在做一个系统,你打算当用户忘记自己的登录口令时,重置此用户口令为一个随机口令,而后将此随机口令发给用户,让用户下次使用此口令登录,则适合使用哈希。实际上很多网站都是这么做的,想想你以前登录过的很多网站,是不是当你忘记口令的时候,网站并不是将你忘记的口令发送给你,而是发送给你一个新的、随机的口令,然后让你用这个新口令登录。这是因为你在注册时输入的口令被哈希后存储在数据库里,而哈希算法不可逆,所以即使是网站管理员也不可能通过哈希结果复原你的口令,而只能重置口令。 相反,如果你做的系统要求在用户忘记口令的时候必须将原口令发送给用户,而不是重置其口令,则必须选择加密而不是哈希。 2. 使用简单的一次哈希(Hash)方法进行数据保护 首先我们讨论使用一次哈希进行数据保护的方法,其原理如下图所示: 对上图我想已无需多言,很多朋友应该使用过类似的哈希方法进行数据保护。当前最常用的哈希算法是MD5和SHA1,下面给出在.NET平台上用C#语言实现MD5和SHA1哈希的代码,由于.NET对于这两个哈希算法已经进行很很好的封装,因此我们不必自己实现其算法细节,直接调用相应的库函数即可(实际上MD5和SHA1算法都十分复杂,有兴趣的可以参考维基百科)。 [size=1em]1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| using System;
using System.Web.Security;
namespace HashAndEncrypt
{
/// <summary>
/// 哈希(Hash)工具类
/// </summary>
public sealed class HashHelper
{
/// <summary>
/// 使用MD5算法进行哈希
/// </summary>
/// <param name="source">源字串</param>
/// <returns>杂凑字串</returns>
public static string MD5Hash(string source)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "MD5");
}
/// <summary>
/// 使用SHA1算法进行哈希
/// </summary>
/// <param name="source">源字串</param>
/// <returns>杂凑字串</returns>
public static string SHA1Hash(string source)
{
return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "SHA1");
}
}
}
|
|