引子
我在《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 輸出結果,方便調試》
本文出自 “老G的小屋” 博客,請務必保留此出處http://4137613.blog.51cto.com/4127613/876587