【问题标题】:Store the state inside golang binary将状态存储在 golang 二进制文件中
【发布时间】:2020-01-05 05:02:26
【问题描述】:

我正在为没有任何控制和互联网连接的机器上的客户端开发本地解决方案。

解决方案是根据购买的许可证允许的请求(REST API 调用)数量来获利。因此,目前我们将请求计数存储在文件系统本身的加密文件中。但是这个解决方案并不完美,因为文件可以复制到某个地方,然后在请求配额结束时替换。此外,如果文件被删除,则需要支持人员进行手动干预。

我正在寻找一种以二进制形式存储状态/数据并在运行时更新它的解决方案(考虑以二进制本身更新的使用计数)

寻找更好的方法。

二进制也应该从之前存储的状态开始

有办法吗?

附:我知道写入二进制文件不会解决问题,但我认为它会通过增加可以存储状态的位置的排列和组合的数量来增加难度,并且因为您可以更改可执行文件这不是常识如果有人试图弄乱系统,请成为最后一个寻找状态的地方(通过默默无闻来保证安全)

【问题讨论】:

  • 我不确定您在这种情况下的请求是什么意思,您是指对服务器的物理请求,因为那将是持有此许可证的更好地方。你能更好地定义请求的概念是什么意思吗?
  • 这是一个有趣的问题。 (我认为它被否决了,因为不太清楚你在问什么,因为你所说的“二进制”是什么意思不清楚,还因为如果你的加密文件可以保存和恢复,那么你的二进制文件或任何文件也可以那件事。)如果您有兴趣,我有一些想法,但正如沃尔克暗示的那样,没有万无一失的解决方案。
  • @ajr 就像问题说的那样,我实际上正在寻找更好的方法。很想听听你的想法。我同意没有万无一失的解决方案。这里的二进制是 Golang 可执行文件
  • Volker 的答案是正确的(您不能仅在软件中做到这一点)。另一方面,您可以使用良好的 ol 软件保护加密狗,它是硬件(仍然不是 100% 安全,但比软件好得多,如果您的商业模式允许在产品中放置加密狗)。现在有 USB 加密狗。作为起点,请参阅en.wikipedia.org/wiki/Software_protection_dongle

标签: go binaryfiles binarywriter


【解决方案1】:

有办法吗?

没有。

(至少没有官方的、可移植的方式。当然您可以修改二进制文件并更改例如数据或 BSS 段,但这是 hard,依赖于操作系统并且不能解决您的问题它与外部文件有相同的问题:您可以保留原始可执行文件并从该文件重新开始。有些事情根本无法从技术上解决。)

【讨论】:

    【解决方案2】:

    如果您的其余 API 在您的控制范围内并且是您正在获利的部分,那么这就是您过滤许可的点,也许是某种证书身份验证或 API 的密钥,然后您可以继续计数在您可以控制的 API 方面,然后它是在平面文件还是数据库等中无关紧要,因为您可以控制它。

    【讨论】:

    • 它是一个内部部署。在客户的基础设施上。没有控制权。
    • 我知道这是一个本地解决方案,这就是我要求澄清请求的原因。实际上,如果您想要控制,那么您需要保留对许可方面的控制,我认为最好的选择是构建一个可以从您控制的服务器中提取许可的服务。通过这种方式,您可以收回许可证并拥有完全控制权,尝试完全在本地构建此系统会使您容易失去控制权,正如您所发现的那样。
    【解决方案3】:

    这是您尝试执行的操作(而不是写入可执行文件)的解决方案,该解决方案将阻止随意复制文件。

    一种可能的方法是定期将请求计数和当前系统时间写入文件。该文件甚至不必加密 - 您只需生成数据的哈希值(例如使用 SHA2)并使用私钥对其进行签名,然后附加到文件中。

    然后,当您(重新)启动服务时,使用您的公钥读取并验证文件,并检查自写入文件以来的时间是否太长。请注意,必须在安装时编写一些初始文件,并且您的服务需要持续运行 - 仅允许短暂重启。您也可能会验证时间不在未来,因为这表明有人试图绕过系统。

    当然,这种方法存在问题,例如客户端摆弄系统时间,甚至调试您的代码以找到私钥和可能的其他问题。希望这些足以起到威慑作用。此外,如果服务或系统长时间关闭,则需要某种手动干预。

    【讨论】:

      猜你喜欢
      • 2018-04-17
      • 2022-11-29
      • 1970-01-01
      • 2011-08-07
      • 2019-04-29
      • 2013-10-14
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      相关资源
      最近更新 更多