程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> cocos2d-x學習筆記19:記錄存儲3:使用摘要算法進行存檔校驗

cocos2d-x學習筆記19:記錄存儲3:使用摘要算法進行存檔校驗

編輯:關於C語言

 引子

我在《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() 裡開頭添加以下代碼:

  1. _tsetlocale(LC_ALL,_T(""));  
  2. ::AllocConsole();  
  3. ::freopen("conout$","w",stdout);  

別忘了加頭文件 #include <tchar.h>

然後你就可以使用printf啦,哇咔咔。

 

如何用SHA1做存檔校驗

我們使用如下代碼寫入存儲記錄

  1. #define TEXT1 "test string"  
  2. #define KEY "goldlion"  
  3. SHA1 *sha1;  
  4. unsigned char *digest;  
  5.   
  6. CCUserDefault *save=CCUserDefault::sharedUserDefault();  
  7. save->setStringForKey("string_value",TEXT1);  
  8. sha1=new SHA1;  
  9. sha1->addBytes(TEXT1,strlen(TEXT1));//輸入數據  
  10. sha1->addBytes(KEY,strlen(KEY));//輸入數據  
  11. digest=sha1->getDigest();//獲取校驗碼  
  12. SHA1::hexPrinter(digest,20);//打印16進制校驗碼到控制台  
  13. printf("\n");  
  14. delete sha1;  
  15. free(digest);  

執行結果如下:

 


現在我們寫一個讀取校驗
  1. #define TEXT1 "test string"  
  2. #define KEY "goldlion"  
  3. SHA1 *sha1;  
  4. unsigned char *digest;   
  5.  
  6. CCUserDefault *save=CCUserDefault::sharedUserDefault();  
  7. std::string str=save->getStringForKey("string_value");  
  8. sha1=new SHA1;  
  9. sha1->addBytes(str.c_str(),str.length());//輸入數據  
  10. sha1->addBytes(KEY,strlen(KEY));//輸入數據  
  11. digest=sha1->getDigest();//獲取校驗碼  
  12. SHA1::hexPrinter(digest,20);//打印16進制校驗碼到控制台  
  13. printf("\n");  
  14. delete sha1;  
  15. free(digest);  

執行結果如下:  
可以看到,校驗是沒有問題的
破解測試
現在我們手動修改存檔文件UserDefault.xml,將string_value的值修改為test string crack。

運行結果如下:
校驗不通過,玩家修改了存檔。
思路
1.摘要算法即從原文中提取校驗碼,在讀取存檔時,進行校驗。如果原文修改,校驗碼變化,則校驗不通過。 2.因為摘要算法都是公開的,在使用時,我們會在輸入待校驗數據時,多輸入一個key,這個key是隱藏在編碼中的,除非玩家有很高超逆向工程技術,能反編並找到key,但我們一樣可以調整Key的算法,以及提前對數據樣本進行混淆。這種加密強度足以應付一般單機游戲的開發了。網游存檔是在服務器端的,而且需要傳輸校驗,所以我們也不考慮本地存檔加密了。
實際中的使用
以上只是演示代碼,在實際使用時,我們還需注意: 1.為了方便,演示中我只使用了字符串,對於bool,int等類型,你可以自己封裝函數,進行校驗,這樣比較方便。 2.在編寫的校驗代碼中,增加一個開關——隨時打開和關閉校驗。這樣做的好處是,在校驗關閉狀態,測試人員可以直接修改存檔,方便測試。哈哈哈,這就是把明文存檔劣勢,直接變為開發時的優勢的思維轉換哦。 3.實際使用時,校驗碼是要寫入到存檔中的,在讀取存檔時,順便讀取校驗碼,進行校驗。
參考文獻

cocos2d-x 實現printf 輸出結果,方便調試》 

本文出自 “老G的小屋” 博客,請務必保留此出處http://4137613.blog.51cto.com/4127613/876587

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved