如何保护调用API的桌面应用程序的安全?

时间:2019-07-17 11:29:40

标签: node.js rest api license-key

我的桌面应用程序已被客户使用。客户是具有许可证密钥及其计算机的MAC地址的用户。桌面应用程序只能在一个实例上使用。

因此,当用户购买许可证并进行注册(意味着他已下载,打开桌面应用程序,输入并提交了许可证密钥)时,我将首先检索其MAC地址,然后向我的POST请求API,/user,其参数为{license-key: "license_here", mac-address: "mac_here"},因此将其保存到我的数据库中。

现在,一旦注册用户,我应该如何保护桌面应用程序中的API调用?

假设用户想访问他的设置标签,是否应该向{license-key: "license_here", mac-address: "mac_here"}请求提供GET作为参数,并检查其是否与我的数据库中的许可证密钥和MAC地址匹配,以及会在“设置”选项卡上显示从数据库检索到的所有设置?

或者有更安全的方法吗?

我认为的另一种方式是例如hash许可证密钥和MAC地址concat并使用我将用于每个请求的身份验证令牌。

我使用API​​而不是保存在本地,因为一旦完成桌面应用程序,我将创建一个移动应用程序,并且我将需要在两个应用程序之间共享信息。

NodeJSExpressMongoDB/Mongoose一起使用。

1 个答案:

答案 0 :(得分:0)

您正在做的是尝试使用仅具有其自身的某些数据/知识(其MAC和许可证密钥)对计算机进行身份验证。这很容易解决,因为未授权的计算机可能会欺骗数据,并使您误以为请求来自授权的计算机。如果您仅传输许可证/ MAC数据,则任何其他知道该知识的计算机也可能仅通过拦截单个请求来假冒许可的计算机-假冒所需的所有信息都包含在请求中。

没有专门的硬件,您将无法实现计算机的唯一性。这通常采用包含密钥或证书的专用微芯片的形式。无法从芯片读取数据,但是可以使用芯片创建数字签名。

在没有专用硬件的情况下,最好的办法是每台计算机使用唯一的许可证密钥,并要求所有请求均为signed using this key。这取决于密钥是私有的(签名是随消息发送的,而不是密钥本身),并且不能保证,因为您无法控制客户端计算机。

修改-工作原理:
向每个客户端颁发许可证密钥。在服务器上,将分配给您的每个密钥记录在分配给它的计算机的MAC地址上。您可能应该在颁发许可证时收集MAC地址。不要让客户“注册”他们的许可证。客户端必须使用密钥对他们发送的每个请求进行签名,并在每个请求中包括签名和MAC。在服务器上,您可以通过使用MAC地址查找密钥并自己重新创建签名来验证每个传入请求。如果签名与客户提供的签名匹配,则您知道其真实性。记住-这仍然不是万无一失的!我可以从您那里购买一个许可证,然后将其安装在任意数量的计算机上,只要我能使它们全部伪造批准的MAC地址即可。我还可以将密钥提供给我的朋友,并让他们也伪造MAC地址。