cocos2d-x学习笔记19:记录存储3:使用摘要算法进行存档校验

简介:

引子

我在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.实际使用时,校验码是要写入到存档中的,在读取存档时,顺便读取校验码,进行校验。







 本文转自 老G 51CTO博客,原文链接:http://blog.51cto.com/goldlion/876587 ,如需转载请自行联系原作者

相关文章
|
2月前
|
JSON 小程序 数据安全/隐私保护
小程序动态调试-解密加密数据与签名校验
本文主要讲解微信小程序加密、验签的情况下如何进行动态调试已获取签名以及加密信息
|
Java 数据安全/隐私保护
java实现加密电话号码,有具体的加密流程注释
java实现加密电话号码,有具体的加密流程注释
19 0
|
9月前
|
存储
模块加载失败请确保该二进制存储在指定路径中
模块加载失败请确保该二进制存储在指定路径中
577 0
|
2月前
|
存储 算法 安全
在线SM4加密/解密工具
在线SM4加密/解密工具支持快速、便捷地对数据进行SM4算法加密与解密。
171 0
|
7月前
|
存储 算法
5.0 CRC32校验技术概述
CRC校验技术是用于检测数据传输或存储过程中是否出现了错误的一种方法,校验算法可以通过计算应用与数据的循环冗余校验(CRC)检验值来检测任何数据损坏。通过运用本校验技术我们可以实现对特定内存区域以及磁盘文件进行完整性检测,并以此来判定特定程序内存是否发生了变化,如果发生变化则拒绝执行,通过此种方法来保护内存或磁盘文件不会被非法篡改。总之,内存和磁盘中的校验技术都是用于确保数据和程序的完整性和安全性的重要技术。
125 1
5.0 CRC32校验技术概述
|
8月前
MD5值对比辨别文件是否改动
去年自己写了一个对比MD5值以此来辨别文件是否被改动,UI和代码有点拉,初学者
49 0
|
10月前
|
算法
Qt实现一个重复文件检测小工具(原理:通过md5校验)
Qt实现一个重复文件检测小工具(原理:通过md5校验)
231 0
|
消息中间件 存储 RocketMQ
删除过期文件机制分析|学习笔记
快速学习删除过期文件机制分析
182 0
|
数据安全/隐私保护
【小工具】2. 需要对测试用的数据进行MD5加密
【小工具】2. 需要对测试用的数据进行MD5加密