Javascript 在客户端无法访问的情况下解密文件
Javascript Decrypt Files without Clients Being Able to Access
我想使用 model-viewer or three.js 在个人网站上展示我的一些 3d 模型。为了在网络上显示 3d 模型,客户端需要从服务器获取文件(3d 网格和纹理图像)
但我不希望我的访问者能够访问这些文件中的任何一个。我希望你能指出我正确的方向。以下是我的一些想法,但我认为它们行不通:
(1) 使用类似crypto-js的方式加密和解密文件
- 但是在前端解密文件时,用户是不是也可以解密文件呢?
- 密钥必须以某种方式传输到前端代码,不是吗?
(2) 将文件分割成小块并在客户端重新组合
- 与#1 相同的问题
- 重构的代码需要放在客户端,可以用来访问文件
在阐述这些想法时,我不太确定我正在尝试做的事情是否可行
万一不可能...我能做些什么来让用户很难访问这些文件吗?
简短的回答是:如果它在网站上,您没有机会保护它免受有足够时间的坚定的人的侵害。这里唯一的例外是视频流,它可以使用 'Encrypted Media Extensions' API 将视频显示到屏幕上,而浏览器的任何部分都无法与原始数据交互。
无论您如何保护文件,读取它们的代码也需要发送到浏览器。最终,原始数据将位于 js-runtime 内存中的某个位置,可以使用内置调试器将其提取出来。这同样适用于任何以某种方式加密代码的机制。这使它变得更加困难,但并非不可能。您可以使用 WebAssembly 使这部分代码更难进行逆向工程,但我不需要这样做:
最终,数据需要到达webgl-api,所以我只能使用浏览器扩展来拦截相关的webgl调用并在那里获取所有原始数据。您可以继续并以可以在顶点着色器中解码的方式加密顶点数据,但猜猜是什么:我也可以阅读顶点着色器代码。
等等等等。只是没有办法做到这一点,无法以某种方式规避。但也许你让它变得足够困难以至于没有人打扰...
对我来说,最有希望的选择似乎是:
使用 LoFi 或部分模型在浏览器中与全分辨率模型的渲染一起渲染。我在几个下载网站上看到过 CAD-/3D-models。他们使用合并模型,有时减少顶点数、低分辨率纹理等,同时提供我支付后最终结果的图像。
创建您自己的文件格式或隐藏开发人员工具的网络视图中使用的文件格式。 Google maps/earth 例如用他们的 3d 数据来做到这一点(他们可能使用的是基于 protobuf 的东西,但逆向工程非常困难)
是的,我想您也可以将 WebCrypto-API 与预共享密钥一起使用,这样至少哪个文件包含 3d 数据不会太明显。
我想使用 model-viewer or three.js 在个人网站上展示我的一些 3d 模型。为了在网络上显示 3d 模型,客户端需要从服务器获取文件(3d 网格和纹理图像)
但我不希望我的访问者能够访问这些文件中的任何一个。我希望你能指出我正确的方向。以下是我的一些想法,但我认为它们行不通:
(1) 使用类似crypto-js的方式加密和解密文件
- 但是在前端解密文件时,用户是不是也可以解密文件呢?
- 密钥必须以某种方式传输到前端代码,不是吗?
(2) 将文件分割成小块并在客户端重新组合
- 与#1 相同的问题
- 重构的代码需要放在客户端,可以用来访问文件
在阐述这些想法时,我不太确定我正在尝试做的事情是否可行
万一不可能...我能做些什么来让用户很难访问这些文件吗?
简短的回答是:如果它在网站上,您没有机会保护它免受有足够时间的坚定的人的侵害。这里唯一的例外是视频流,它可以使用 'Encrypted Media Extensions' API 将视频显示到屏幕上,而浏览器的任何部分都无法与原始数据交互。
无论您如何保护文件,读取它们的代码也需要发送到浏览器。最终,原始数据将位于 js-runtime 内存中的某个位置,可以使用内置调试器将其提取出来。这同样适用于任何以某种方式加密代码的机制。这使它变得更加困难,但并非不可能。您可以使用 WebAssembly 使这部分代码更难进行逆向工程,但我不需要这样做:
最终,数据需要到达webgl-api,所以我只能使用浏览器扩展来拦截相关的webgl调用并在那里获取所有原始数据。您可以继续并以可以在顶点着色器中解码的方式加密顶点数据,但猜猜是什么:我也可以阅读顶点着色器代码。
等等等等。只是没有办法做到这一点,无法以某种方式规避。但也许你让它变得足够困难以至于没有人打扰...
对我来说,最有希望的选择似乎是:
使用 LoFi 或部分模型在浏览器中与全分辨率模型的渲染一起渲染。我在几个下载网站上看到过 CAD-/3D-models。他们使用合并模型,有时减少顶点数、低分辨率纹理等,同时提供我支付后最终结果的图像。
创建您自己的文件格式或隐藏开发人员工具的网络视图中使用的文件格式。 Google maps/earth 例如用他们的 3d 数据来做到这一点(他们可能使用的是基于 protobuf 的东西,但逆向工程非常困难)
是的,我想您也可以将 WebCrypto-API 与预共享密钥一起使用,这样至少哪个文件包含 3d 数据不会太明显。