wasm 存储客户端机密是否安全?
Is wasm safe to store client side secrets?
我的问题安全上下文如下:
我目前有一个运行我的网络应用程序的 electron 桌面应用程序。在我的应用程序中,有一项功能允许经过身份验证的用户访问受密码保护的文档 (pdf)。该文件是在服务器上准备的,密码是使用 10 个字符串的 SHA256 哈希生成的。这 10 个字符由两部分组成 1) 可变文档 ID 和第二个固定盐。
目前,在电子内部的客户端上,我有一个用 C 编写并使用 node-gyp 编译的本机节点模块。我调用了这个模块,其中包含使用密码的两个部分生成相同密码的代码。在客户端拥有这个本地节点模块的全部目的是因为该模块是一个编译的二进制文件,它不能被逆向工程并且没有人可以访问我的秘密盐。如果发现盐,那么另一部分很容易找到,因此攻击者可以访问所有文档。
我了解了 WebAssembly 以及它如何将低级语言代码编译为 wasm,然后可以将其加载到浏览器中。这实际上意味着我可以使用我在本机模块中使用的相同 C 代码,但现在可以通过网络而不是在电子中使用。
我的疑虑是生成的 wasm 模块的安全性和逆向工程部分。我读到可以对 wasm 进行逆向工程并取回 C 文件,但它提供的格式与源代码不完全相同,它对攻击者有多大帮助又是一个问题。
我读过的一些话题
- https://twitter.com/jebdec/status/1012749064696295425?lang=en
- https://news.ycombinator.com/item?id=17507767
- https://www.reddit.com/r/WebAssembly/comments/8qmxjv/can_we_decompile_wasm_to_ccsource/
除了安全问题外,我想我在这里使用 wasm 的目的可能是错误的,因为在开放的网络上,如果有源代码是不可查看和不可审计的,那么它总体上会带来非常大的安全问题.
任何 comments/advice 都会有所帮助。
先回答你的问题。不,WASM 不能安全地为您描述的场景存储客户端机密。
而且您当前的实施似乎也不安全(根据可用的有限信息)。
如果您将代码编译为二进制文件只是为了让攻击者无法找到您的固定盐,我有一个坏消息要告诉您。很有可能从二进制文件中提取数据。
试想一下您将盐作为变量存储在 c 程序中的情况。
int main() {
char* mySaltVar = "my salt";
char* b = "my other string";
}
然后你用 gcc 编译它并创建二进制文件。你可能认为这些字符串无法读取,因为它们在二进制文件中,但你可以 运行 strings
在二进制文件上编程以获取二进制文件中的字符串。
sk$ strings binary.out
my salt
my other string
这两个字符串是从二进制中提取出来的。
这是一个过度简化的示例,它表明代码中的所有内容都在二进制文件中。在大多数情况下,编译器会丢弃一些信息以使二进制文件尽可能高效。在这种情况下,攻击者会使用逆向工程工具来弄清楚二进制文件中发生了什么。
我的问题安全上下文如下:
我目前有一个运行我的网络应用程序的 electron 桌面应用程序。在我的应用程序中,有一项功能允许经过身份验证的用户访问受密码保护的文档 (pdf)。该文件是在服务器上准备的,密码是使用 10 个字符串的 SHA256 哈希生成的。这 10 个字符由两部分组成 1) 可变文档 ID 和第二个固定盐。
目前,在电子内部的客户端上,我有一个用 C 编写并使用 node-gyp 编译的本机节点模块。我调用了这个模块,其中包含使用密码的两个部分生成相同密码的代码。在客户端拥有这个本地节点模块的全部目的是因为该模块是一个编译的二进制文件,它不能被逆向工程并且没有人可以访问我的秘密盐。如果发现盐,那么另一部分很容易找到,因此攻击者可以访问所有文档。
我了解了 WebAssembly 以及它如何将低级语言代码编译为 wasm,然后可以将其加载到浏览器中。这实际上意味着我可以使用我在本机模块中使用的相同 C 代码,但现在可以通过网络而不是在电子中使用。
我的疑虑是生成的 wasm 模块的安全性和逆向工程部分。我读到可以对 wasm 进行逆向工程并取回 C 文件,但它提供的格式与源代码不完全相同,它对攻击者有多大帮助又是一个问题。
我读过的一些话题
- https://twitter.com/jebdec/status/1012749064696295425?lang=en
- https://news.ycombinator.com/item?id=17507767
- https://www.reddit.com/r/WebAssembly/comments/8qmxjv/can_we_decompile_wasm_to_ccsource/
除了安全问题外,我想我在这里使用 wasm 的目的可能是错误的,因为在开放的网络上,如果有源代码是不可查看和不可审计的,那么它总体上会带来非常大的安全问题.
任何 comments/advice 都会有所帮助。
先回答你的问题。不,WASM 不能安全地为您描述的场景存储客户端机密。
而且您当前的实施似乎也不安全(根据可用的有限信息)。
如果您将代码编译为二进制文件只是为了让攻击者无法找到您的固定盐,我有一个坏消息要告诉您。很有可能从二进制文件中提取数据。
试想一下您将盐作为变量存储在 c 程序中的情况。
int main() {
char* mySaltVar = "my salt";
char* b = "my other string";
}
然后你用 gcc 编译它并创建二进制文件。你可能认为这些字符串无法读取,因为它们在二进制文件中,但你可以 运行 strings
在二进制文件上编程以获取二进制文件中的字符串。
sk$ strings binary.out
my salt
my other string
这两个字符串是从二进制中提取出来的。
这是一个过度简化的示例,它表明代码中的所有内容都在二进制文件中。在大多数情况下,编译器会丢弃一些信息以使二进制文件尽可能高效。在这种情况下,攻击者会使用逆向工程工具来弄清楚二进制文件中发生了什么。