Javascript WASM可以用来检查JS方法的完整性吗?

Javascript WASM可以用来检查JS方法的完整性吗?,javascript,c,security,emscripten,webassembly,Javascript,C,Security,Emscripten,Webassembly,我正在试验webAssembly,并试图找出一种验证webAssembly模块使用的JS方法完整性的方法 为了讨论的目的,让我们假设二进制模块是不可破解的(我知道不是这样),但是JS端是 给定以下C代码: #include <emscripten.h> //js method to validate void validateMe(); int validateMethods(){ // check validateMe integrity. // return

我正在试验webAssembly,并试图找出一种验证webAssembly模块使用的JS方法完整性的方法

为了讨论的目的,让我们假设二进制模块是不可破解的(我知道不是这样),但是JS端是

给定以下C代码:

#include <emscripten.h>

//js method to validate
void validateMe();

int validateMethods(){
    // check validateMe integrity.
    // return 1 if validation succeeded.
}

EMSCRIPTEN_KEEPALIVE
void doStuff(){
    if (validateMethods()){
       // do stuff
    }
}
#包括
//要验证的js方法
void validateMe();
int validateMethods(){
//检查validateMe的完整性。
//如果验证成功,则返回1。
}
EMSCRIPTEN_KEEPALIVE
void doStuff(){
if(validateMethods()){
//做事
}
}
我想从JS端调用
doStuff()
,只有在完整性检查成功的情况下,
doStuff()
才会运行。 我想做一些完整性检查,类似于检查方法的toString表示。然而,如果我想将当前的(内存中的)JS方法转换为字符串,我必须调用JS,这可能会受到影响

Q:我能以不同的方式获得toString吗?任何其他方法也将不胜感激

更新:深入阅读后,似乎除了共享阵列之外,没有其他方法可以访问JS内存。因此,任何验证技术都将受到赞赏


更新2(目标):我的最终目标是确保WASM部分只适用于特定的JS,或者至少使其更难与被操纵的JS交互


Fiddle示例:是一个简单的函数验证,将函数的toString逐字符进行比较。如果更改validateMe函数,验证将失败。我正试图“防弹”它。

JS是一种动态语言,你可以覆盖(几乎)一切。您可以将函数体获取为字符串,并对其进行散列,以生成函数的“快照”,然后根据此快照进行检查,但可以独立重写其中一个内部函数

var getA = function() { return 1; };

var myFunc = function() {
  var a = getA();
  return a * 2;
};

WebAssembly.instantiate(wasmBytes, { myFunc });

// ... later on ...
getA = function() { return 5; };

不,它不能。当然,您可以验证某些源代码的完整性,但这并不能为您购买任何真正的安全性。无论您做什么,都不能阻止第三方的计算机运行、修改和执行他们喜欢的任何操作

现在,您可以确定地使它变得更难(模糊处理、内存加密、自重写代码、解释器/虚拟机……以及所有这些技巧),但通常情况下,使它变得足够难以使其变得有用是非常重要的(例如,see和VMProtect等),并且随着时间的推移或普及程度的提高,它无论如何都会被忽略

保护应用程序安全的唯一方法是在服务器端运行它;这是更昂贵的,并打开了你的其他问题


请注意,如果您的目标是试图保护源代码而不是应用程序本身(换句话说,避免其他人阅读/复制代码),那么(通过优化)将类似C的语言编译到WebAssembly中可能是一个公平的选择(而且您希望尽可能多地在其中编写应用程序)。即使解决方案没有隐藏应用程序的工作方式,它也会有效地增加读取/重用原始代码/设计的难度——这只是一种模糊处理


然而,这个问题的重点是防止恶意方绕过保护和/或操纵行为/数据,因此,通过编译到WebAssembly进行一些模糊处理不会给您带来任何安全性。

感谢您的回复,我也只能这样做:(假设没有内部函数,您将如何验证“快照”?从JS检索函数字符串到wasm也可以操作。这不清楚为什么要混合javascript、wasm和C?因此您希望使用从C文件生成的wasm来检查JS方法的完整性?另外,“为了讨论的目的,让我们假设二进制模块是不可破解的(我知道不是这样),但JS端是。”不清楚“但JS端是”是什么意思?客户端中的所有内容都不能被信任。实际上,您的问题可以分为两部分,一部分是C,另一部分是”WASM可以用来检查JS方法的完整性吗?"。我不明白你为什么在你的问题中添加了C,这让问题变得宽泛和不清楚。谢谢你的回答。WASM是用C代码编译的。目的是提高恶意用户的门槛,即:WASM代码更难操作/调试,JS对任何具有最低调试知识的人都可见。我的目标是确保WASM工作正常使用特定的JS。请检查我的更新