application-security.md 10 KB


title: 应用程序安全手册

brief: 本手册涵盖了安全开发实践的若干方面。

应用安全

应用安全是一个广泛的主题,涵盖了从安全开发实践到游戏发布后保护游戏内容的各个方面。本手册将涵盖多个领域,并将其放在使用Defold引擎、工具和服务时的应用安全背景下:

  • 知识产权保护
  • 反作弊解决方案
  • 安全网络通信
  • 使用第三方软件
  • 使用云构建服务器
  • 可下载内容

保护您的知识产权免遭盗窃

大多数开发者关心的问题是如何保护他们的创作不被盗用。从法律角度来看,版权、专利和商标可以用来保护视频游戏知识产权的不同方面。版权赋予其所有者分发创意作品的专有权,专利保护任何发明,而商标保护名称、符号和标志。

采取技术预防措施来保护游戏的创意作品也是可取的。然而,重要的是要记住,一旦游戏到了玩家手中,就有可能找到提取资源的方法。这可以通过对游戏应用程序和文件进行逆向工程来实现,也可以通过使用工具在资源发送到GPU时或加载到内存时提取纹理和模型。

因此,我们的总体立场是,如果用户决心提取游戏的资源,他们将能够做到这一点。

开发者可以添加自己的保护措施,使提取资源变得更加困难,但并非不可能。这通常包括各种加密和混淆手段,以保护和隐藏游戏资源。

源代码混淆

应用源代码混淆是一个自动化过程,其中源代码被故意设计为难以被人理解,同时不影响程序的输出。目的通常是为了防止被盗,同时也使作弊变得更加困难。

在Defold中,可以应用源代码混淆,既可以作为预构建步骤,也可以作为Defold构建过程的集成部分。使用预构建混淆时,源代码在Defold构建过程开始之前使用混淆工具进行混淆。

另一方面,构建时混淆通过使用Lua构建器插件集成到构建过程中。Lua构建器插件将原始源代码作为输入,并返回混淆后的源代码作为输出。构建时混淆的一个示例在Prometheus扩展中展示,该扩展基于GitHub上可用的Prometheus Lua混淆器。下面您将找到一个使用Prometheus积极混淆代码片段的示例(请注意,这种重度混淆会影响Lua代码的运行时性能):

示例:

function init(self)
 print("hello")
 test.greet("Bob")
end

混淆后输出:

local v={"+qdW","ZK0tEKf=";"XP/IX3+="}for o,J in ipairs({{1;3};{1,1},{2,3}})do while J[1]<J[2]do v[J[1]],v[J[2]],J[1],J[2]=v[J[2]],v[J[1]],J[1]+1,J[2]-1 end end local function J(o)return v[o+45816]end do local o={["/"]=9;["8"]=48;["9"]=1;q=38,o=62;V=33;y=43,d=61,B=50,L=54;v=2;["0"]=21,n=31;p=63;R=5;N=3;i=10;e=35;C=7;l=56;a=47,J=58;m=59;["2"]=36;z=11;M=12;Z=26;O=18;["5"]=20;s=8,["4"]=30,P=55;w=4;U=29;Q=28;r=24,h=41;G=45;c=19;W=34,k=57;T=14,t=44,S=0;f=60;F=42,E=27;u=40;X=25,j=17;["3"]=23,b=13;["1"]=53;Y=32,A=22,K=6,["+"]=16,["6"]=46;["7"]=51;I=37;D=52;H=15,x=49,g=39}local J=type local x=string.sub local d=v local l=string.len local W=string.char local L=table.insert local w=table.concat local h=math.floor for v=1,#d,1 do local X=d[v]if J(X)=="string"then local J=l(X)local H={}local S=1 local k=0 local K=0 while S<=J do local v=x(X,S,S)local d=o[v]if d then k=k+d*64^(3-K)K=K+1 if K==4 then K=0 local o=h(k/65536)local v=h((k%65536)/256)local J=k%256 L(H,W(o,v,J))k=0 end elseif v=="="then L(H,W(h(k/65536)))if S>=J or x(X,S+1,S+1)~="="then L(H,W(h((k%65536)/256)))end break end S=S+1 end d[v]=w(H)end end end local function o(o)test[J(-45815)](o)end function init(v)print(J(-45813))o(J(-45814))end

资源加密

在Defold构建过程中,游戏资源被处理并转换为适合Defold引擎运行时使用的格式。纹理被编译为Basis Universal格式,集合、游戏对象和组件从人类可读的文本表示转换为对应的二进制格式,Lua源代码被处理并编译为字节码。其他资源(如声音文件)则按原样使用。

当这个过程完成后,资源会逐个添加到游戏存档中。游戏存档是一个大型二进制文件,存档中每个资源的位置存储在存档索引文件中。该格式在这里有文档说明。

在Lua源文件被添加到存档之前,它们也可以选择性地进行加密。Defold中提供的默认加密是一种简单的分组加密,用于防止在使用二进制文件查看器工具检查游戏存档时,代码中的字符串立即可见。由于Defold源代码在GitHub上可用,且加密密钥在源代码中可见,因此不应将其视为密码学安全的。

可以通过实现资源加密插件为Lua源文件添加自定义加密。资源加密插件由构建时部分和运行时部分组成,构建时部分用于在构建过程中加密资源,运行时部分用于在从游戏存档中读取资源时解密资源。一个基本的资源加密插件(可用作您自己加密的起点)在GitHub上可用

编码项目配置值

*game.project*文件将原样包含在您的应用程序包中。有时您可能希望存储公共API访问密钥或类似的敏感但非私密性质的值。为了加强这类值的安全性,可以将它们包含在应用程序二进制文件中,而不是存储在*game.project*中,同时仍然可以通过Defold API函数(如sys.get_config_string()等)访问它们。您可以通过在*game.project*中添加原生扩展,并使用DM_DECLARE_CONFIGFILE_EXTENSION宏来提供您自己的覆盖,以使用Defold API函数获取配置值。一个可用作起点的示例项目在GitHub上可用

保护您的游戏免受作弊者侵害

视频游戏作弊的历史与游戏行业本身一样悠久。作弊码曾经流行于视频游戏杂志中,特殊的作弊盒卡带也在早期的家用电脑上销售。随着行业和游戏的演变,作弊者和他们的方法也在不断演变。一些最流行的游戏作弊机制包括:

  • 重新打包游戏内容以注入自定义逻辑
  • 速度黑客,使游戏运行速度比正常更快或更慢
  • 自动化和视觉分析,用于自动瞄准和机器人
  • 代码和内存注入,以修改分数、生命值、弹药等

防止作弊很困难,几乎是不可能的。即使是云游戏,即游戏在远程服务器上运行并直接流式传输到用户设备,也不能完全免受作弊的影响。

Defold在引擎或工具中不提供任何反作弊解决方案,而是将这类工作交给众多专门为游戏提供反作弊解决方案的公司之一。

保护您的网络通信

Defold套接字和HTTP通信支持安全套接字连接。建议对任何服务器通信使用安全连接,以验证服务器并保护在客户端到服务器以及服务器到客户端传输过程中任何交换数据的隐私和完整性。Defold使用流行且广泛采用的TLS和SSL协议开源实现Mbed TLS。Mbed TLS由ARM及其技术合作伙伴开发。

SSL证书验证

为了防止网络通信中的中间人攻击,可以在与服务器协商连接时的SSL握手期间验证证书链。这可以通过在Defold中向网络客户端提供公钥列表来实现。有关保护网络通信的更多信息,请阅读网络手册中关于SSL验证的部分。

保护您对第三方软件的使用

虽然创建游戏不一定需要使用任何第三方库或原生扩展,但使用官方资源门户中的资源来加速开发已成为开发者的常见做法。资源门户包含大量资源,从第三方SDK集成到屏幕管理器、UI库、摄像机等等。

资源门户中的任何资源都未经Defold基金会审核,我们不对通过资源门户获取的任何资源使用导致的计算机系统或其他设备损坏或数据丢失负责。您可以在我们的条款与条件中阅读细则。

我们建议您在使用任何资源之前进行审查,一旦您认为它适合在您的项目中使用,就创建该资源的分支或副本,以确保它不会在您不知情的情况下发生变化。

保护您对云构建服务器的使用

Defold云构建服务器(也称为扩展器服务器)的创建是为了帮助开发者为Defold引擎添加新功能,而无需重新构建引擎本身。当包含原生代码的Defold项目首次构建时,原生代码及任何相关资源会被发送到云构建服务器,在那里创建一个自定义版本的Defold引擎并返回给开发者。当项目使用自定义应用程序清单来移除引擎中未使用的组件时,也会应用相同的过程。

云构建服务器托管在AWS上,并根据安全最佳实践创建。然而,Defold基金会不保证云构建服务器将满足您的要求,没有缺陷、没有病毒、安全或没有错误,或者您对服务器的使用将是不间断或安全的。您可以在我们的条款与条件中阅读细则。

如果您对构建服务器的安全性和可用性感到担忧,我们建议您设置自己的私有构建服务器。有关如何设置自己的服务器的说明可以在GitHub上扩展器仓库的主readme文件中找到。

保护您的可下载内容

Defold的Live Update系统允许开发者将内容从主游戏包中排除,以便稍后下载和使用。典型的用例是随着玩家在游戏中的进展下载额外的关卡、地图或世界。

当被排除的内容被下载并准备在游戏中使用时,引擎会在使用前对其进行加密验证,以确保它没有被篡改。验证包括多项检查:

  • 二进制格式是否正确?
  • 当前运行的引擎版本是否支持下载的内容?
  • 下载的内容是否使用了正确的公私钥对进行签名?
  • 下载的内容是否完整且没有遗漏任何文件?

您可以在Live Update手册中阅读有关此过程的更多信息。