为了账号安全,请及时绑定邮箱和手机立即绑定

将状态存储在 golang 二进制文件中

将状态存储在 golang 二进制文件中

Go
鸿蒙传说 2023-07-17 16:35:18
我正在为客户开发一个本地解决方案,机器上没有任何控制和互联网连接。该解决方案是根据所购买许可证允许的请求(REST API 调用)数量进行货币化。因此,目前我们将请求计数存储在文件系统本身的加密文件中。但这个解决方案并不完美,因为文件可以复制到某个地方,然后在请求配额结束时替换。此外,如果文件被删除,则需要支持人员进行手动干预。我正在寻找一种解决方案,以二进制形式存储状态/数据并在运行时更新它(考虑在二进制本身中更新的使用计数)寻找更好的方法。二进制文件也应该从之前存储的状态开始有办法做到吗?PS我知道写入二进制文件并不能解决问题,但我认为它会通过增加可以存储状态的位置的排列和组合数量来增加难度,因为您可以更改可执行文件这不是常识如果有人试图扰乱系统,这将是寻找状态的最后一个地方(默默无闻的安全性)
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

有办法做到吗?

不。

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


查看完整回答
反对 回复 2023-07-17
?
偶然的你

TA贡献1841条经验 获得超3个赞

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

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

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

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


查看完整回答
反对 回复 2023-07-17
?
月关宝盒

TA贡献1772条经验 获得超5个赞

如果您的其余 API 在您的控制范围内,并且是您要货币化的部分,那么您肯定会在此时过滤许可的可能是某种证书身份验证或 API 密钥,然后您可以保留并依赖该 API您可以控制的一面,然后无论它是在平面文件还是数据库等中都没关系,因为您可以控制它。



查看完整回答
反对 回复 2023-07-17
  • 3 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信