引子
我在《cocos2d-x学习笔记16:记录存储1:CCUserDefault 》中提到过CCUserDefalut做存档的种种缺陷,其中之一就是明文存储,玩家可以直接修改存档。
本文将探讨如何使用摘要算法进行存档校验的方法。
准备工作
摘要算法很多,算法内容都是公开的。所以网络上有很多现成的算法库,最有名的是Crypto++,该库支持大量对称加密,非对称加密,和摘要算法。不过这库太庞大了,我们只是用一个简单的摘要算法,就先不用这玩意了。
我选择了SHA1,库从这个地址下载:
http://tamale.net/
打开后发现非常简洁,只有两个源代码(sha1.cpp,sha1.h),还有一个是测试代码(testsha1.cpp)。
我们先新建一个工程名为TestSha,然后把源代码导入。
然后为了方便调试,我们需要printf,cocos2d-x中打开printf的方法如下:
在代理函数 bool AppDelegate::applicationDidFinishLaunching() 里开头添加以下代码:
- _tsetlocale(LC_ALL,_T(""));
- ::AllocConsole();
- ::freopen("conout$","w",stdout);
别忘了加头文件 #include <tchar.h>
然后你就可以使用printf啦,哇咔咔。
如何用SHA1做存档校验
我们使用如下代码写入存储记录
- #define TEXT1 "test string"
- #define KEY "goldlion"
- SHA1 *sha1;
- unsigned char *digest;
- CCUserDefault *save=CCUserDefault::sharedUserDefault();
- save->setStringForKey("string_value",TEXT1);
- sha1=new SHA1;
- sha1->addBytes(TEXT1,strlen(TEXT1));//输入数据
- sha1->addBytes(KEY,strlen(KEY));//输入数据
- digest=sha1->getDigest();//获取校验码
- SHA1::hexPrinter(digest,20);//打印16进制校验码到控制台
- printf("\n");
- delete sha1;
- free(digest);
执行结果如下:
- #define TEXT1 "test string"
- #define KEY "goldlion"
- SHA1 *sha1;
- unsigned char *digest;
- CCUserDefault *save=CCUserDefault::sharedUserDefault();
- std::string str=save->getStringForKey("string_value");
- sha1=new SHA1;
- sha1->addBytes(str.c_str(),str.length());//输入数据
- sha1->addBytes(KEY,strlen(KEY));//输入数据
- digest=sha1->getDigest();//获取校验码
- SHA1::hexPrinter(digest,20);//打印16进制校验码到控制台
- printf("\n");
- delete sha1;
- free(digest);
《cocos2d-x 实现printf 输出结果,方便调试》