存储客户端机密安全吗?

时间:2019-06-08 12:41:57

标签: security electron webassembly

我的问题的安全上下文如下:

我目前有一个运行我的Web应用程序的electron桌面应用程序。我的应用程序内部有一个功能,允许经过身份验证的用户访问受密码保护的文档(pdf)。在服务器上准备了该文档,并使用10个字符串的SHA256哈希生成了密码。这10个字符由两部分组成:1)可变文档ID和第二固定盐。

目前在电子内部的客户端上,我有一个本机节点模块,该模块用C编写并使用node-gyp进行编译。我对该模块进行了调用,该模块包含使用密码的两个部分生成相同密码的代码。在客户端上具有此本机节点模块的全部目的是,由于该模块是已编译的二进制文件,因此无法进行逆向工程,并且没有人可以访问我的秘密。如果发现了盐,则很容易找到另一部分,因此攻击者可以访问所有文档。

我了解了WebAssembly以及如何将较低语言的代码编译为wasm,然后可以将其加载到浏览器中。这实际上意味着我可以使用与本机模块中相同的C代码,但现在可以通过Web而不是电子方式使用。

我对所生产的wasm模块的安全性和逆向工程部分有疑问。我读到可以逆向工程并从wasm取回C文件,但是它提供的格式与源代码并不完全相同,它对攻击者有多大帮助又是一个问题。

一些我读过的线程

除了安全方面的问题,我认为我可能在一个开放的Web上将wasm用于错误的目的,因为如果存在无法查看和审核的源代码,则总体上会带来很大的安全问题。

任何评论/建议都会有所帮助。

1 个答案:

答案 0 :(得分:3)

首先回答您的问题。不,WASM不安全地存储您所描述的方案的客户端机密。

从可用的有限信息来看,您当前的实现似乎也不安全。

如果您只是将代码编译为二进制文件,以使攻击者无法找到您的定盐,那么我对您来说是个坏消息。很有可能从二进制文件中提取数据。

想一想将盐作为变量存储在c程序中的情况。

int main() {
 char* mySaltVar = "my salt";
 char* b = "my other string";
}

,然后使用gcc进行编译并创建二进制文件。您可能会认为这些字符串无法在二进制文件中读取,但是您可以在二进制文件上运行strings程序以在二进制文件中获取字符串。

sk$ strings binary.out 
my salt
my other string

这两个字符串是从二进制文件中提取的。

这是一个过于简化的示例,用于显示代码中的所有内容都在二进制文件内部。在大多数情况下,编译器会丢弃一些信息以使二进制文件尽可能高效。在这种情况下,攻击者将使用逆向工程工具找出二进制文件中发生的事情。