【问题标题】:Javascript Decrypt Files without Clients Being Able to AccessJavascript 在客户端无法访问的情况下解密文件
【发布时间】:2025-12-17 22:25:02
【问题描述】:

我想使用model-viewerthree.js 在个人网站上展示我的一些3d 模型。为了在网络上显示 3d 模型,客户端需要从服务器获取文件(3d 网格和纹理图像)

但我不希望我的访问者能够访问这些文件中的任何一个。我希望你能指出我正确的方向。以下是我的一些想法,但我认为它们不会奏效:

(1) 使用crypto-js之类的东西来加密和解密文件

  • 但是在前端解密文件时,用户也不能解密文件吗?
  • 密钥必须以某种方式传输到前端代码,不是吗?

(2) 将文件拆分成小块并在客户端重新组合它们

  • 与 #1 相同的问题
  • 重组代码需要放在客户端上,可以用来访问文件

在详细阐述这些想法时,我不太确定我正在尝试做的事情是否可能????

如果不可能……我能做些什么来让用户很难访问这些文件?

【问题讨论】:

  • 如果数据必须是某种可读格式,猜猜他们能得到什么。在您解密它的部分之后的代码中的简单断点并且他们拥有它。所以说到底,真的没有安全的方法。

标签: javascript security encryption three.js cryptojs


【解决方案1】:

简短的回答是:如果它在网站上,你没有机会保护它免受有足够时间的坚定的人的侵害。这里唯一的例外是视频流,它可以使用“加密媒体扩展”API 将视频显示到屏幕上,而浏览器的任何部分都无法与原始数据进行交互。

无论您如何保护文件,读取文件的代码也需要发送到浏览器。最终,原始数据将位于 js-runtime 内存中的某个位置,可以使用内置调试器将其提取出来。任何以某种方式加密代码的机制也是如此。这使它变得更加困难,但并非不可能。您可以使用 WebAssembly 使这部分代码更难进行逆向工程,但我不需要这样做:

最后,数据需要到达 webgl-api,所以我可以使用浏览器扩展来拦截相关的 webgl-calls 并获取那里的所有原始数据。您可以继续并以可以在顶点着色器中解码的方式加密顶点数据,但猜猜看:我也可以读取顶点着色器代码。

所以名单还在继续。只是没有办法做到这一点,无法以某种方式规避。但也许你把它弄得够难了,没人打扰……

对我来说,最有希望的选择似乎是:

  • 使用 LoFi 或部分模型在浏览器中与全分辨率模型的渲染一起渲染。我在几个下载 CAD-/3D 模型的网站上看到了这一点。他们使用合并模型,有时会减少顶点数、低分辨率纹理等,同时提供我付费后最终结果的图像。

  • 制作您自己的文件格式或隐藏在开发者工具的网络视图中使用的文件格式。例如,谷歌地图/地球使用他们的 3d 数据(他们可能使用基于 protobuf 的东西,但逆向工程非常困难)

  • 是的,我想您也可以使用带有预共享密钥的 WebCrypto-API,这样至少哪些文件包含 3d 数据不太明显。

【讨论】:

  • 很好的答案!你能发给我“一个浏览器扩展来拦截相关的 webgl 调用”吗?
  • 你可以使用最优秀的 spector.js (spector.babylonjs.com) 来了解 webgl 正在发生的事情。但是他们故意不记录实际的缓冲区内容(有一个很好的理由,这是为了保护艺术家的作品..)。还有其他扩展可以做到这一点(另外,如果您“需要”它,自己编写一个简单的扩展并不复杂)。如果您想了解更多关于逆向工程缩小的three.js 代码,请看这里:codepen.io/usefulthink/full/eGpgjL
最近更新 更多