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

Posted

技术标签:

【中文标题】如何保护调用我的 API 的桌面应用程序?【英文标题】:How can I secure my desktop app calling my API? 【发布时间】:2019-11-26 05:25:13 【问题描述】:

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

所以当用户购买许可证并注册时(意味着他下载、打开桌面应用程序、输入并提交他的许可证密钥),我将首先检索他的 MAC 地址,然后向我的 API 发出 POST 请求, /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】:

您正在做的是尝试使用一些只有它拥有的数据/知识(它的 MAC 和许可证密钥)来验证计算机。这很容易解决,因为未经许可的计算机可以欺骗数据并欺骗您认为请求来自许可的计算机。如果您只传输许可证/MAC 数据,那么任何其他知道的计算机也可以通过拦截单个请求来模拟许可计算机 - 模拟所需的所有信息都包含在请求中。

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

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

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

【讨论】:

感谢您的回复。许可证密钥必须是唯一的,并且只能在一台计算机上使用。这意味着我必须将它链接到所述计算机的MAC地址,对吗?然后我可以使用这两个信息来签署我的请求? 感谢您在编辑中添加更多信息。我现在明白你的意思了,非常感谢!

以上是关于如何保护调用我的 API 的桌面应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

授权为桌面应用程序时如何设置 Facebook 聊天 API 连接

如何在 JavaFX 桌面应用程序中使用 Google Maps API?

框架 3.5 的桌面应用程序中的“远程服务器返回错误:(404)”

此请求的授权已被拒绝 - 桌面到 ASP.NET Web API

桌面应用程序如何从网站获取信息?

如何防止在我的桌面上启动 TaskManager?