【Cocos2d-x】数据加密解密

【Cocos2d-x】数据加密解密,第1张

概述C++的Base64算法实现 Android平台下使用Base64算法加密解密数据 数据库数据项加密 cocos2d-x中 *** 作数据库的实现都封装在LocalStorage这个类中。使用的是sqlite3。 IOS、Win32平台的加密 1.base64.h和base64.cpp添加项目Classes目录下。 2.右键libExtensions项目,附加包含目录,把base64库所在目录添加到包含目


C++的Base64算法实现





AndroID平台下使用Base64算法加密解密数据




数据库数据项加密


cocos2d-x中 *** 作数据库的实现都封装在localstorage这个类中。使用的是sqlite3。

IOS、Win32平台的加密


1.base64.h和base64.cpp添加项目Classes目录下。


2.右键libExtensions项目,附加包含目录,把base64库所在目录添加到包含目录中,具体路径根据自己项目结构而定



3.修改localstorageSetItem方法,保存数据时加密数据,这里在win32平台下忽略加密 *** 作是因为一般win32平台版本是用于内部测试的

voID localstorageSetItem( const char *key,const char *value){	assert( _initialized );	// 加密数据	#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)		//cclOG("key=%s src=%s",key,value);				std::string encodeStr = base64::encode(value);		value = encodeStr.c_str();		//cclOG("key=%s encode=%s",value);	#endif		int ok = sqlite3_bind_text(_stmt_update,1,-1,sqlITE_TRANSIENT);	ok |= sqlite3_bind_text(_stmt_update,2,value,sqlITE_TRANSIENT);	ok |= sqlite3_step(_stmt_update);		ok |= sqlite3_reset(_stmt_update);		if( ok != sqlITE_OK && ok != sqlITE_DONE)		printf("Error in localstorage.setItem()\n");}

4.修改localstorageGetItem方法,获取数据时解密数据
const char* localstorageGetItem( const char *key ){	assert( _initialized );	int ok = sqlite3_reset(_stmt_select);	ok |= sqlite3_bind_text(_stmt_select,sqlITE_TRANSIENT);	ok |= sqlite3_step(_stmt_select);	const unsigned char *ret = sqlite3_column_text(_stmt_select,0);		if( ok != sqlITE_OK && ok != sqlITE_DONE && ok != sqlITE_ROW)		printf("Error in localstorage.getItem()\n");	// 加密数据	#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)		//cclOG("decode src=%s",ret);			if (ret)		{			std::string decodeStr = base64::decode((const char*)ret);												char* c = new char;  						strcpy_s(c,decodeStr.size() + 1,decodeStr.c_str());  			//cclOG("key=%s decode=%s",c);						return c;		}			#endif	return (const char*)ret;}


注意:c_str()方法返回的是string对象中保留的字符串指针,该指针的生命周期是跟随string对象的。也就是如果直接返回decodeStr.c_str(),返回的将是垃圾数据,因为decodeStr在函数结束后,已经被销毁了,指针所指向的是垃圾数据。


这种数据库加密方案存在以下几个问题:

1.如果别人知道我所使用的加密算法,然后通过程序计算出加密串,还是可以修改成功的。

2.数据库还是可以用相关工具打开,并查看数据表。

3.每次读写数据时,增加了加密解密的步骤,降低效率。


对于Cocos2d-x中数据库的加密有更好的解决办法,就是使用wxsqlite3,点击查看【集成wxSqlite3到Cocos2d-x】,这种数据库加密的实现是在初始化数据库的时候加密,运行时加载数据库时候调用相关API解密,加载完成后数据的读写效率和未加密时一样,相对比较高效。



AndroID平台的加密


从localstorage.cpp中使用的宏可以看出,这个实现在安卓平台下是无法使用的



安卓平台下的实现在:cocos2d-x-2.1.5\extensions\localstorage目录下的localstorageAndroID.cpp中。

从localStrorageInit的实现可以看出,它是通过jni调用了java层中org/cocos2dx/lib/Cocos2dxlocalstorage的静态方法init



在打包安卓版Cocos2d-x游戏时需要用到引擎的一个java库,在cocos2d-x-2.1.5\cocos2dx\platform\androID\java目录下,Cocos2dxlocalstorage类就在这个库中。

修改这个类的setItem方法,在保存数据的时候加密
	public static voID setItem(String key,String value) {		try {			// 加密数据			value = Base64.encodetoString(value.getBytes(),Base64.DEFAulT);			String sql = "replace into " + table_name					+ "(key,value)values(?,?)";			mDatabase.execsql(sql,new Object[] { key,value });		} catch (Exception e) {			e.printstacktrace();		}	}

修改这个类的getItem方法,在获取数据的时候解密
	public static String getItem(String key) {		String ret = null;		try {			String sql = "select value from " + table_name + " where key=?";			Cursor c = mDatabase.rawquery(sql,new String[] { key });			while (c.movetoNext()) {				// only return the first value				if (ret != null) {					Log.e(TAG,"The key contains more than one value.");					break;				}				ret = c.getString(c.getColumnIndex("value"));			}			c.close();		} catch (Exception e) {			e.printstacktrace();		}				// 解密数据		if (ret != null) {			ret = new String(Base64.decode(ret,Base64.DEFAulT));		}				return ret == null ? "" : ret;	}
总结

以上是内存溢出为你收集整理的【Cocos2d-x】数据加密解密全部内容,希望文章能够帮你解决【Cocos2d-x】数据加密解密所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1013006.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存