在现代的软件开发中,如何安全地存储密码信息是一个至关重要的问题。简单地将密码存储在应用程序、数据文件、INI文件、注册表或任何非易失性存储介质中,都是一个非常糟糕的做法。相比之下,一个更好的方法是存储密码的“密码学哈希”。密码学家将这种哈希称为“摘要”。在这个上下文中,摘要函数是一个接受一段文本(称为“明文”)并为该文本块计算校验和类型数字的函数。密码学摘要具有以下特性:
希望保护密码数据的程序员可以立即计算密码的摘要,然后保存这个摘要。当用户被提示输入密码时,计算输入密码候选的摘要,并将这个摘要与存储的摘要进行比较。如果它们相等,那么用户输入了正确的密码。值得注意的是,程序员可以将存储的哈希值发布在公共网页或高速公路上的公告牌上,而不会危及产品的安全性。他或她不必担心有人使用十六进制编辑器挖掘出密码。
摘要还可以用来验证消息是否正确传输,这与循环冗余检查的方式类似。
一个经过验证的摘要算法是罗恩·里维斯特(Ron Rivest,RSA中的'R')的"消息摘要五"(MD5)。它在互联网RFC 1321中有所描述,名为"MD5消息摘要算法"。通过谷歌搜索可以找到数百个链接到这个RFC的资源,使用了找到的。这个RFC包含了MD5算法的K&R风格的'C'语言实现。这个实现有点笨拙,所以用一个简单的通用C++类包装了它。这个类叫做CMD5。它只有四个有趣的成员:
要使用这个类,只需在构造函数中或使用setPlainText成员设置明文。这个类调用一个非常轻微修改过的RFC 1321代码来计算摘要,通过调用getMD5Digest()立即可用。
cout << "Enter password:";
cin >> strUserEnteredPassword;
CMD5 md5((const char*)strUserEnteredPassword);
if (strcmp(md5.getMD5Digest(), (const char*)m_PreviouslyStoredDigestOfTheActualPassword) == 0) {
// 密码有效
} else {
// 用户输入了错误的密码
}