我的桌面应用程序被客户使用。客户是拥有许可证密钥和计算机MAC地址的用户。桌面应用程序只能在一个实例上使用。
因此,当用户购买并注册许可(意思是他下载、打开桌面应用程序、输入并提交许可证密钥)时,我将首先检索他的MAC地址,然后对我的API,/user进行POST请求,并以这种方式将参数{license-key: "license_here", mac-address: "mac_here"}保存到我的数据库中。
现在,一旦用户注册,我应该如何保护桌面应用程序中的API调用?
假设一个用户想访问他的设置选项卡,我是否应该将{license-key: "license_here", mac-address: "mac_here"}作为参数提供给GET请求,并检查它是否与我的数据库中的许可密钥和MAC地址相匹配,如果匹配,则在Let选项卡上显示从数据库检索到的所有设置?
还是有更安全的方法来做到这一点?
我想的另一种方法是,例如,hash许可密钥和MAC地址,concat,并使用用于每个请求的身份验证令牌。
我使用的是API而不是本地保存,因为我将创建一个移动应用程序,一旦我完成了桌面应用程序,我将需要在两个应用程序之间共享信息。
将NodeJS与Express和MongoDB/Mongoose结合使用。
发布于 2019-07-17 14:26:24
您所做的是尝试使用某些数据/知识来验证计算机的身份,而这些数据/知识只有计算机才有(其MAC和许可密钥)。这样做很容易,因为一台未经许可的计算机可以伪造数据,并欺骗您,使您认为请求来自授权计算机。如果您只传输许可/MAC数据,那么任何其他具有此知识的计算机也可以通过拦截单个请求来模拟授权计算机--模拟所需的所有信息都包含在请求中。
如果没有专门的硬件,就不能强制执行计算机的唯一性。这通常采用包含密钥或证书的专用微芯片的形式。数据不能从芯片中读取,但是芯片可以用来创建数字签名。
如果没有专用硬件,最好的做法是在每台计算机上使用唯一的许可证密钥,并要求所有请求都是使用此密钥签名。这依赖于密钥是私有的(签名是与消息一起发送的,而不是密钥本身),并且无法保证您不控制客户端计算机。
编辑-这是如何工作的:
向每个客户端颁发许可证密钥。在您的服务器上,记录您根据分配给它的计算机的MAC地址发出的每个密钥。你可能应该在发放牌照时收集MAC地址。不要让客户“注册”他们的执照。客户端必须使用密钥对他们发送的每个请求进行签名,并在每个请求中包含签名和MAC。在服务器上,通过使用MAC地址查找密钥并自己重新创建签名来验证每个传入请求。如果签名与客户端提供的签名相匹配,那么您就知道它是真实的。记住-这还不是万无一失的!我可以从你那里购买一个许可证,并安装在任何数量的计算机上,只要我让他们全部伪造已批准的MAC地址。我也可以把我的钥匙给我的朋友,让他们伪造MAC地址。
https://stackoverflow.com/questions/57074805
复制相似问题