如何设计一个尽量防止破解的系统激活码

91 天前
 chobits336

系统部署到客户的服务器,全部服务用 docker 启动,如何设计一个激活码机制让这个系统到指定时间不能使用

现在的设计是:

  1. 生成 rsa 公私钥,使用私钥加密 license ,部署时配置 license 文件
  2. 公钥放在系统中,使用公钥解密 license 校验其合法性
  3. license 里有系统 id 、签发人、过期时间属性

部署是离线环境,防止通过修改系统时间来破解授权,就想到了用系统运行时间来校验;将运行时间加密存在文件里,但如果这个时间文件被删除或被克隆,记录的运行时间就会被重置了,请问各位大佬怎么解决这个问题

6061 次点击
所在节点    程序员
48 条回复
newaccount
91 天前
把当前时间和已运行时间一起放到时间文件里,多记录几个差值,增加调整时间的模拟难度
至于文件被删除,那就默认不允许运行好了,让他们找你
chobits336
91 天前
@newaccount 如果服务器有快照,回滚到指定时间点,然后把系统时间也修改到那个时间,时间差是一样的,就破解了
chobits336
91 天前
@chobits336 但也记录了恢复快照前的时间,用这个来对比当前时间,好像可以防止
dmitsc
91 天前
数据上埋呢 加上数据库内容。他们总不能把历史数据清了吧
ysc3839
91 天前
非对称加密是基础操作,但是可能遇到 hook OpenSSL (如果公钥验证用了 OpenSSL 等外部库的话),或者直接替换可执行文件内的公钥。
建议加解密部分静态链接进可执行文件,同时做好自校验。
InDom
91 天前
发硬件,一年后收回硬件。USBkey 也是。
ysc3839
91 天前
至于修改系统时间,没有好的解决办法,一般的思路是尽可能多的把最后时间存在各种文件中。比如某绘图软件会把试用时间存在源文件里,过了试用期之后,那个源文件就只能用付费版打开,任何其他试用版都打不开。还可以考虑把时间写到配置文件里面,要重置就只能删配置文件。
janus77
91 天前
硬件+1 ,PC 端网银软件不就是这么解决的吗
rekulas
91 天前
离线
到指定时间不能使用

这两者本身就冲突了,从技术上无法完美解决,只有参考那些工业机器授权过期的解决方案,附带一个加密硬件/设备作为钥匙,你的授权强度就看你硬件破解难度了
chobits336
91 天前
@ysc3839 把时间写在源文件或配置文件里,回滚磁盘快照就重置时间了
wfhtqp
91 天前
@chobits336 存数据库,数据库还能重置?
msg7086
91 天前
只有完全可信设备才能做到,比如带时钟的加密狗。

还有一种做法就是把时间戳合并到永久存储的数据中,比如类似区块链这样每一条数据写入的时候同时写入时间戳,每条数据都可以向上回溯校验数据完整性,这样用户如果要回滚就要连同数据一起回滚。
GeekGao
91 天前
做一个发号器机制:运行时长超过特定时间后自动降频(能用,但是会很卡顿,以至于无法继续商用)
815979670
91 天前
如果对时间要求特别严格,可以提供一个带内置时钟的加密狗(淘宝好像就几十块钱)
chobits336
91 天前
@wfhtqp 数据库也是部署到同一台服务器上的,快照恢复数据库也会影响到吧
chobits336
91 天前
@msg7086 和数据绑定校验的话,完全可以将数据先导出来再回滚,在把数据导进去(数据库也是在客户的服务器部署的,环境变量里有密码)
thevita
91 天前
把授权信息和业务数据混在一起

比如对历史业务数据 进行分区块签名, 把所有业务操作和结果都记账,也能防止某些时钟回拨

虽然可以通过不停恢复快照继续使用,但是业务功能也就没意义了
sn0wdr1am
91 天前
道高一尺,魔高一丈。
有意思。
msg7086
91 天前
@chobits336 数据导出来有什么用,你把时间戳嵌入进去,数据导回去不还是能检查出时间不对吗。
yuankui
91 天前
电子签名

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1085655

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX