Unity3d C#实现文件(json、txt、xml等)加密、解密和加载(信息脱敏)功能实现(含源码工程)

前言

在Unity3d工程中经常有需要将一些文件放到本地项目中,诸如json、txt、csv和xml等文件需要放到StreamingAssets和Resources文件夹目录下,在程序发布后这些文件基本是对用户可见的状态,造成信息泄露,甚至有不法分子会利用这些信息进行一定的破坏行为。在这种背景下是很有必要将本地的一些文件进行加密处理再存储,然后加载后进行解密,这就能规避本地文件带来的风险。而本文就是围绕这个功能实现的一个插件,能快速的对文件进行加密和解密修改。只需要进行简单的配置,然后选中文件进行加密,即可实现该功能。 该项目的Unity3d版本为2020.3.28f1c1 Personal,注意如果版本差异太大可能会无法正确打开使用。

效果

加密配置:
在这里插入图片描述

加密前后对比:
在这里插入图片描述

自定义加密:
在这里插入图片描述

批量直接加密:
在这里插入图片描述

加密至StreamingAssets:
在这里插入图片描述

自定义解密:
在这里插入图片描述

批量解密:
在这里插入图片描述

实现

加密的核心功能实现采用的是加密转换的基本操作,根据加密的配置Key和Code进行加密操作,这些配置在保存/修改时会进行修改存储。而Unity3d工程中的新增菜单和窗口采用Unity编辑器拓展MenuItem和EditorWindow来实现。

配置实现

在顶部的菜单栏中新建一个菜单选项“Tools > 加密配置窗口”:

[MenuItem("Tools/加密配置窗口")]
public static void ShowRegisterWindow()
{EncoderConfigWind wind = (EncoderConfigWind)EditorWindow.GetWindow(typeof(EncoderConfigWind));
}

点击后打开编辑器窗口,这个窗口EncoderConfigWind是继承了Unity的编辑器窗口(EditorWindow)。

然后编写当渲染UI的时候调用OnGUI函数,绘制出配置窗口的明细:

private void OnGUI(){GUILayout.BeginVertical(new GUILayoutOption[0]);GUILayout.Space(10f);GUILayout.Label("加密文件配置", new GUILayoutOption[0]);GUILayout.Space(10f);GUILayout.Label("加密KEY", new GUILayoutOption[0]);this.TempKey = EditorGUILayout.TextArea(this.TempKey, new GUILayoutOption[] { GUILayout.MinHeight(50f) });GUILayout.Space(10f);GUILayout.Label("加密Code", new GUILayoutOption[0]);this.LegalIVCode = EditorGUILayout.TextArea(this.LegalIVCode, new GUILayoutOption[] { GUILayout.MinHeight(50f) });GUILayout.Space(10f);GUILayout.Label("加密文件后缀", new GUILayoutOption[0]);this.EncodeSuffix = EditorGUILayout.TextArea(this.EncodeSuffix, new GUILayoutOption[] { GUILayout.MinHeight(20f) });GUILayout.Space(10f);GUILayout.Label("解密文件后缀", new GUILayoutOption[0]);this.DecodeSuffix = EditorGUILayout.TextArea(this.DecodeSuffix, new GUILayoutOption[] { GUILayout.MinHeight(20f) });GUILayout.Space(10f);if (GUILayout.Button("保存配置", new GUILayoutOption[0])){this.SaveConfigs(this.TempKey, this.LegalIVCode, this.EncodeSuffix, this.DecodeSuffix);}GUILayout.Space(10f);if (GUILayout.Button("获取帮助", new GUILayoutOption[0])){Process.Start("https://blog.csdn.net/qq_33789001");}GUILayout.EndVertical();}

如上的代码能绘制出下面的窗口:

其主要的作用就是在打开配置窗口后绘制出窗体,在窗体中提供Key、Code、默认加密/解密文件的后缀等输入框,点击保存配置按钮后会将这些输入信息进行保存,通过File.WriteAllBytes()函数写入到Resources下的配置文件中去,示例代码如下:

File.WriteAllBytes(path+ "/Key.txt", keybytes);

加密实现

加密的实现是通过选择Assets窗口中的文件来进行加密,所有菜单的选项都采用了[MenuItem(“Assets/***”)]的形式进行。为了满足大部分的应用场景提供了多种操作方式,单一自定义加密、批量直接加密和批量的加密到StreamAssets和Resources的方式等,所以写了一个枚举进行操作:

public enum EncodeType 
{ direct = 1,custom = 2,steamingassets = 3,resources = 4,custompath = 5
}

在Assets窗口中新建了如下的菜单选项,并通过加密EncodeType 的枚举值不同的方式进行区分:

[MenuItem("Assets/加密文件/直接加密(批量)")]private static void DoEncodeFileDir(){DoEncodeFiles(EncodeType.direct);}[MenuItem("Assets/加密文件/选路径加密(批量)")]private static void DoEncodeFileSelPath(){DoEncodeFiles(EncodeType.custompath);}[MenuItem("Assets/加密文件/放入StreamAssets(批量)")]private static void DoEncodeFileSa(){DoEncodeFiles(EncodeType.steamingassets);}[MenuItem("Assets/加密文件/放入Resources(批量)")]private static void DoEncodeFileRes(){DoEncodeFiles(EncodeType.resources);}[MenuItem("Assets/加密文件/自定义加密(单一)")]private static void DoEncodeFileCustom(){DoEncodeFiles(EncodeType.custom);}

点击加密选项后,根据选项和选择的文件进行加密处理,样例代码如下:

    string[] strs = Selection.assetGUIDs;string path = AssetDatabase.GUIDToAssetPath(strs[0]);string suffix = (Resources.Load("EncodeFile/DeSuffix") as TextAsset).text;string buildPath = EditorUtility.SaveFilePanel("请选择解析保存的路径", GetPrePath(path), GetFileName(path), suffix);string spath = buildPath;if (!string.IsNullOrEmpty(path)){string text = File.ReadAllText(path);string decode = Decrypt(text);//Debug.Log(spath);File.WriteAllText(spath, decode);AssetDatabase.Refresh();//刷新}elseDebug.LogError("请选择正确的文件进行解析!");

处理的流程是提取选中的文件路径,并读取加密的配置选项,再根据用户的自定义选择保存的目录、文件名称和文件后缀等加密后存储信息,将需要加密的文件进行读取内容,进行加密后,保存到对应的加密后存储位置中去。

解密实现

解密顾名思义就是加密的逆操作,其适用场景是对加密过的文件进行解密后,对文件进行浏览查看或者修改更新操作。对解密文件的操作类似于加密的操作窗口,都是在Assets窗口进行,以[MenuItem(“Assets/***”)]的形式进行,不过细分了入口的菜单:

[MenuItem("Assets/解密文件/直接解析(批量)")]
[MenuItem("Assets/解密文件/自定解析(单一)")]

这里就两种方式自定义解析(仅支持单一文件)和批量直接解析的方式。解析的样例代码如下:

            string[] strs = Selection.assetGUIDs;string path = AssetDatabase.GUIDToAssetPath(strs[0]);string suffix = (Resources.Load("EncodeFile/DeSuffix") as TextAsset).text;string buildPath = EditorUtility.SaveFilePanel("请选择解析保存的路径", GetPrePath(path), GetFileName(path), suffix);string spath = buildPath;if (!string.IsNullOrEmpty(path)){string text = File.ReadAllText(path);string decode = Decrypt(text);//Debug.Log(spath);File.WriteAllText(spath, decode);AssetDatabase.Refresh();//刷新}elseDebug.LogError("请选择正确的文件进行解析!");

处理的流程和加密的流程类似,提取选中的文件路径,并读取加密的配置选项,再根据用户的自定义选择保存的目录、文件名称和文件后缀等解密后存储信息,将需要解密的文件进行读取内容,进行解密后,保存到对应的解密后存储位置中去。

加载解密测试

这个才是采用了两种方式进行,是读取Resources的方式和读取StreamingAssetsPath的方式。分别读取CSV、TXT和JSON、XML文件。测试过程尽量简单化,就是将文件读取、解密后,将解密的内容显示到Text上即可,其中需要注意的是如果文件存储到Resources下的话,文件最好是.txt、.json,否则可能读取不到内容。UI和测试脚本的配置如下:
在这里插入图片描述

读取Resources目录下的文件代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class LoadResourcesFileTest : MonoBehaviour
{[Header("文件名")]public string FileName = "";[Header("显示内容的Text")]public Text showText;private void Awake(){Debug.LogWarning("Resources文件夹下的文件最好是.txt、.json,否则可能读取不到");if (!showText)showText = transform.GetComponent<Text>();RequestFile();}void RequestFile(){TextAsset ta = Resources.Load(FileName) as TextAsset;string EnCodeStr ="";if (ta)EnCodeStr = ta.text;Debug.Log("解析前:" + EnCodeStr);string orgString = Decoder.GetDecodeString(EnCodeStr);if (showText)showText.text = orgString;Debug.Log("解析后:" + orgString);}
}

读取StreamingAssetsPath的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;public class LoadSAFileTest : MonoBehaviour
{[Header("文件名")]public string FileName = "";[Header("显示内容的Text")]public Text showText;private void Awake(){if (!showText)showText = transform.GetComponent<Text>();string filePath = Application.streamingAssetsPath +"/"+ FileName;StartCoroutine(RequestFile(filePath));}IEnumerator RequestFile(string uri){using (UnityWebRequest webRequest = UnityWebRequest.Get(uri)){// Request and wait for the desired page.yield return webRequest.SendWebRequest();if (webRequest.result == UnityWebRequest.Result.Success){Debug.Log("解析前:"+webRequest.downloadHandler.text);string orgString = Decoder.GetDecodeString(webRequest.downloadHandler.text);if (showText)showText.text = orgString;Debug.Log("解析后:" + orgString);}else{Debug.LogError("加载解密文件异常:" + webRequest.error);}}}
}

这里的xml读取效果如下:
在这里插入图片描述

源码工程

https://download.csdn.net/download/qq_33789001/88915590
无法下载需要稍等,可能审核未通过。

工程说明

工程包含了上述所有的功能和演示场景,包含了所有的编辑器扩展代码和测试功能源码,可以自由修改自定义功能,也可以通过 “Tools” > “加密配置窗口”进行简单的加密配置后快速使用加密功能。
\Assets\TestFiles为加密测试的原文件;
\Assets\Editor为编辑器拓展的源代码;
\Assets\Resources 为测试加载加密文件并解析的文件和配置存储文件;\Assets\Scenes包含测试加载加密后的CSV、TXT、JSON、XML文件的demo场景;
\Assets\Scripts 测试和解密代码;
\Assets\StreamingAssets加密后的测试文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/526651.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划课堂4-----子数组系列

目录 引入&#xff1a; 例题1&#xff1a;最大子数组和 例题2&#xff1a;环形子数组的最大和 例题3&#xff1a;乘积最大子数组 例题4&#xff1a;乘积为正数的最长子数组 总结&#xff1a; 结语&#xff1a; 引入&#xff1a; 在动态规划&#xff08;DP&#xff09;子…

Python+Django+Html网页前后端指纹信息识别

程序示例精选 PythonDjangoHtml网页前后端指纹信息识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjangoHtml网页前后端指纹信息识别》编写代码&#xff0c;代码整洁&#xff0…

小迪安全33WEB 攻防-通用漏洞文件上传中间件解析漏洞编辑器安全

#知识点&#xff1a; 1、中间件安全问题 2、中间件文件上传解析 3、Web 应用编辑器上传 编辑器也就是第三方插件&#xff0c;一般都是文件上传漏洞 #详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完…

单例九品--第八品[可用的设计]

单例九品--第八品[可用的设计] 上一品引入写在前边代码部分1代码部分2代码部分3实现方式评注与思考下一品设计的思考 上一品引入 第七品使用std::atomic静态函数实现了计数变量singletonCount的定义&#xff0c;解决了第六品引入的多线程安全的问题&#xff0c;但是从第五品开…

第十一篇 - 应用于市场营销视频场景中的人工智能和机器学习技术 – Video --- 我为什么要翻译介绍美国人工智能科技巨头IAB公司(1)

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒体…

Java 汇编源码查看环境搭建

目录 一、简介 二、在IDEA开发环境中搭建汇编环境 2.1 在IDEA中搭建字节码查看环境 2.1.1 搭建步骤 2.1.1.1 第一步 2.1.1.2 第二步 2.1.1.3 第三步 2.1.1.4 第四步 2.1.2 验证 2.2 在IDEA开发环境中搭建汇编代码查看环境 2.2.2 配置HSDIS插件 2.2.3 验证HSDIS插件是…

《vtk9 book》 官方web版 第3章 - 计算机图形基础 (3 / 6)

3.8 演员几何 我们已经看到了光照属性如何控制演员的外观&#xff0c;以及相机如何结合变换矩阵将演员投影到图像平面上。剩下的是定义演员的几何形状&#xff0c;以及如何将其定位在世界坐标系中。 建模 计算机图形学研究中的一个重要主题是建模或表示物体的几何形状。…

手机短信恢复 - 如何在 Android 手机上恢复删除的短信

手机每天发送和接收的短信数以亿计&#xff0c;而Android消息丢失每天都在发生。 Android短信恢复对于那些在设备中保存了一些重要信息的人来说显得至关重要。首先&#xff0c;我们向您推荐奇客数据恢复安卓版&#xff0c;这款软件能够高效、安全地恢复已删除的短信&#xff0…

真与假和对与错

我说过先看到股市里的真和假&#xff0c;再去管对和错。今天正好看到一个帖子写的这段话&#xff0c;我太认同了。你以为龙头是真的&#xff0c;股票是真的&#xff0c;其实都是假的&#xff0c;反而看不见的情绪是真的&#xff0c;情绪周期是真的&#xff0c;我们关注买在分歧…

MACBOOK PRO M2 MAX 安装Stable Diffusion及文生图实例

以前偶尔会使用Midjourney生成一些图片&#xff0c;现在使用的头像就是当时花钱在Midjourney上生成的。前段时间从某鱼上拍了一台性价比还不错的macbook&#xff0c;想着不如自己部署Stable Diffusion&#xff08;以下简称SD&#xff09;尝试一下。 网上有很多教程&#xff0c…

【网络原理】使用Java基于TCP搭建简单客户端与服务器通信

目录 &#x1f384;API介绍&#x1f338;ServerSocket API&#x1f338;Socket API &#x1f340;TCP中的长短连接&#x1f333;建立TCP回显客户端与服务器&#x1f338;TCP搭建服务器&#x1f338;TCP搭建客户端 ⭕总结 TCP服务器与客户端的搭建需要借助以下API &#x1f384;…

[Java安全入门]三.CC1链

1.前言 Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库&#xff0c;它提供了很多强大的数据结构类型和实现了各种集合工具类。Commons Collections触发反序列化漏洞构造的链叫做cc链&#xff0c;构造方式多种&#xff0c;这里先学习cc1链…