如何提高我的 Unity 项目的安全性?
How to raise security for my Unity project?
简而言之,我的项目包括:
- 一个安全的 RESTful API 网络服务(托管在 Heroku 上),为数据库处理 requests/responses。它接受 & returns JSON 数据
- Unity 桌面应用程序,兼作 Twitch API 聊天机器人,并与网络服务通信以更新游戏状态以及数据库状态。
- 重要提示:此游戏旨在 运行 由 Twitch 流媒体播放,并由 Twitch 聊天中的用户玩
所以我的问题是...即使我的 Web 服务是安全的,我该怎么做才能确保有人不会简单地对我的 Unity 应用程序进行逆向工程来弄清楚如何与我的网络服务器正确通信?
加密的 HTTP 流量停止数据包嗅探,但如果您仍然可以使用应用程序用来与数据交互的相同方法,则它是一个没有实际意义的服务。可能是我太偏执了,不过有plenty of tools out there专门针对Unity&C#的项目,所以真的不用费太大力气。
我的一个想法 是使用 Twitch API 检查用户是否正在直播游戏,并且只允许他们开始游戏,如果Web 服务在设置了 "isStreaming" 标志的数据库中找不到重复的 IP 地址。这在理论上是可行的......但实际上,任何人都可以在他们的机器上设置一个假的 Twitch 帐户和一个假的或 "blank" 流,然后 运行 一些来自游戏的逆向工程代码。
还有什么我可以做的来最大限度地减少黑客与我的数据库交互的能力吗?
简单的答案
- 与 Unity 兼容的代码混淆
感谢 Unity 的插件系统,实际上有一些不错的选择。有些是 Asset Store 中存在的付费选项,还有一些与 Unity 完全无关的第三方 paid/free 选项(但仍然可以工作)。一些免费选项,例如 ConfuserEx,也是开源的,允许您对如何混淆您的作品进行自定义代码更改。
更复杂的答案
- 我制作了一个简单的 C# Class 库并在其中填充了一些毫无意义的功能(用于测试)
- 我编译了库的发布版本
- 我使用 Aggressive 设置通过 ConfuserEx 混淆了它(Maximum 设置让 Unity 吐出
Invalid IL code
错误)
- 我在我的 Unity 项目中添加了一个
Assets/Plugins
文件夹,并将编译好的库放在那里
- 我创建了一个新的 C# 脚本来从 Unity 中测试库
... 而且虽然反编译出来的代码看不懂,但是在Unity里面还是可以正常运行的。我使用了一个IL/C#反编译器工具(例如JustDecompile)来比较混淆后的二进制文件和原始二进制文件之间的差异。
因此,如果我真的愿意,我可以对所有重要的代码(甚至是我的大部分客户项目)执行这些完全相同的步骤,并实施上述任何安全措施...希望现在任何人都无法理解我的项目的内部工作原理。
简而言之,我的项目包括:
- 一个安全的 RESTful API 网络服务(托管在 Heroku 上),为数据库处理 requests/responses。它接受 & returns JSON 数据
- Unity 桌面应用程序,兼作 Twitch API 聊天机器人,并与网络服务通信以更新游戏状态以及数据库状态。
- 重要提示:此游戏旨在 运行 由 Twitch 流媒体播放,并由 Twitch 聊天中的用户玩
所以我的问题是...即使我的 Web 服务是安全的,我该怎么做才能确保有人不会简单地对我的 Unity 应用程序进行逆向工程来弄清楚如何与我的网络服务器正确通信?
加密的 HTTP 流量停止数据包嗅探,但如果您仍然可以使用应用程序用来与数据交互的相同方法,则它是一个没有实际意义的服务。可能是我太偏执了,不过有plenty of tools out there专门针对Unity&C#的项目,所以真的不用费太大力气。
我的一个想法 是使用 Twitch API 检查用户是否正在直播游戏,并且只允许他们开始游戏,如果Web 服务在设置了 "isStreaming" 标志的数据库中找不到重复的 IP 地址。这在理论上是可行的......但实际上,任何人都可以在他们的机器上设置一个假的 Twitch 帐户和一个假的或 "blank" 流,然后 运行 一些来自游戏的逆向工程代码。
还有什么我可以做的来最大限度地减少黑客与我的数据库交互的能力吗?
简单的答案
- 与 Unity 兼容的代码混淆
感谢 Unity 的插件系统,实际上有一些不错的选择。有些是 Asset Store 中存在的付费选项,还有一些与 Unity 完全无关的第三方 paid/free 选项(但仍然可以工作)。一些免费选项,例如 ConfuserEx,也是开源的,允许您对如何混淆您的作品进行自定义代码更改。
更复杂的答案
- 我制作了一个简单的 C# Class 库并在其中填充了一些毫无意义的功能(用于测试)
- 我编译了库的发布版本
- 我使用 Aggressive 设置通过 ConfuserEx 混淆了它(Maximum 设置让 Unity 吐出
Invalid IL code
错误) - 我在我的 Unity 项目中添加了一个
Assets/Plugins
文件夹,并将编译好的库放在那里 - 我创建了一个新的 C# 脚本来从 Unity 中测试库
... 而且虽然反编译出来的代码看不懂,但是在Unity里面还是可以正常运行的。我使用了一个IL/C#反编译器工具(例如JustDecompile)来比较混淆后的二进制文件和原始二进制文件之间的差异。
因此,如果我真的愿意,我可以对所有重要的代码(甚至是我的大部分客户项目)执行这些完全相同的步骤,并实施上述任何安全措施...希望现在任何人都无法理解我的项目的内部工作原理。