65.9K
CodeProject 正在变化。 阅读更多。
Home

CMD5:一个 C++ MD5 类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (28投票s)

2001年1月10日

viewsIcon

281488

downloadIcon

4244

这个C++类充当互联网 RFC 1321 中描述的消息摘要5代码的包装器。

引言

最近这里有一些关于如何保存密码信息的讨论。一般来说,将密码存储在应用程序、数据文件、INI文件、注册表或除易失性内存以外的任何地方都是一个非常糟糕的主意(tm)

一个比尝试保存密码更好的方法是保存密码的“密码学哈希”。密码学家将这种哈希称为“摘要”。 在这种情况下,摘要函数只是一个接受一段文本(称为“明文”)并计算该文本的校验和类型的数字的函数。 密码学摘要具有以下属性:

  • 不同的输入文本产生相同摘要的可能性极低。
  • 从摘要恢复到输入明文非常非常困难,如果不是完全不可能的话。

希望保护其密码数据的程序员可以立即计算密码的摘要,然后保存它。 当提示用户输入密码时,会计算输入密码候选的摘要,并将此摘要与存储的摘要进行比较。 如果它们相等,则用户输入了正确的密码。 请注意,程序员可以将存储的哈希值发布在公共网页或高速公路上的广告牌上,并且其产品的安全性不会受到损害。 他或她不必担心有人用十六进制编辑器挖出密码。

摘要也可用于验证消息是否已正确传输,类似于循环冗余校验。

一种经过验证的摘要算法是 Ron Rivest 的“消息摘要五”(Ron 是 RSA 中的 'R')。 它在互联网 RFC 1321,“MD5 消息摘要算法”中进行了描述。 谷歌搜索将提供数百个指向此 RFC 的链接,我使用了我在 这里 找到的链接。 此 RFC 包含 K&R 风格的 MD5 算法的 'C' 实现。 此实现使用起来有点麻烦,所以我把它封装在一个简单的通用 C++ 类中。 该类被称为CMD5。 它只有四个有趣的成员

CMD5();    //default ctor

CMD5(const char* plainText);  //set plaintext in ctor

void setPlainText(const char* plainText);
    // set plaintext with a mutator, it's ok to 
    // to call this multiple times, the digest is 
    // recalculated after each call.
                                           
const char* getMD5Digest();
    // access message digest (aka hash), return 0 if
    // plaintext has not been set

要使用该类,只需在构造函数中或使用setPlainText成员设置纯文本。 该类调用 RFC 1321 代码的一个非常轻微修改版本来计算摘要,通过调用getMD5Digest可以立即获得该摘要。

这里有一些伪代码,显示了如何使用这个类

cout >> "Enter password:"; 
cin >> strUserEnteredPassword;
CMD5 md5((const char*)strUserEnteredPassword));
if(strcmp(md5.getMD5Digest(), 
  (const char*)m_PreviouslyStoredDigestOfTheActualPassword)==0)
{ 
    //password is valid
} 
else
{   
    //user entered incorrect password
}

要使用该类,您需要这些文件

  • md5class.hmd5class.cpp - CMD5 C++ 代码。
  • global.hMD5.hmd5.c - RFC 1321 代码的稍加修改的版本。

这些文件是通用的 C++ 文件。 zip 文件包含一个 Win32 控制台应用程序项目,其中包含一个main.cpp文件。 这个小程序运行 RFC 中提供的验证示例。 我在这个演示中使用 STL,但不在类本身中使用。

© . All rights reserved.