断网环境的软件加密策略
对软件进行加密管理的方案有很多种,大型商业软件通常会自己做License管理器来做软件授权。而一般的中型项目,则会使用商业加密软件进行加密与授权管理,例如深思数盾等。
对于小型的软件,不想付费使用商业加密软件,就只能自己做加密。
在最近的项目种遇到了需要对软件加密的需求,以下是我对软件加密的一些思考。
1.如何做许可验证
在需要考虑许可时长的情况下,通常使用时间戳验证。也就是许可生效时间和当前机器时间相减之后做验证。
如果在联网环境下,我们能够通过API保证拿到的时间是互联网时钟。但如果在断网环境下,用户是可以随意修改系统时间的,这样验证就很可能被篡改。
2.断网情况下的验证
如何保证软件断网情况下,不被用户篡改时间而通过验证?
有以下几个步骤。
- 在软件初次启动时,把【使用信息】写进注册列表。包括
机器码(CPU或者硬盘ID) ,初次注册时间 、许可时长 等信息。同时,写入是否【初次注册】的记录,写到另一条注册列表里面。 - 软件启动后,每隔N分钟更新一次【最后使用时间戳】,用于校验。(作用在于用户不可能每隔N分钟改一次时间,这样他的最后使用时间戳必定会正向更新。如果篡改了比注册时间还早的时间,也能够发现)
- 在软件再次启动时,先检查注册列表里面是否有【使用信息】。
- 如果有,则校验信息。验证【最后使用时间戳】减去【初次注册时间】是否超过了许可时长(若超过,拒绝验证)。如果没有,则检查是否有【初次注册】的记录(如果存在记录,则证明用户篡改了注册列表,拒绝验证)。
- 其他情况下,通过验证。
注:所有写入注册列表的信息都要通过加密算法来隐藏信息,加密算法必须要使用密钥 加密。
3.如何延长许可授权
为了隐藏加密逻辑,软件许可授权的延长,需要客户端和授权器两个工具配套实现。
-
客户端获取机器码、当前日期,并通过加密算法生成延长申请码 ,并发送给授权管理员 -
授权管理员使用授权器,解析延长申请码 ,获得时间和机器码。验证时间是否和本地时间在同一段范围内(比如1天),防止用户篡改了日期 -
授权管理员根据机器码和本地时间,加密生成一个延长码 ,发送给客户 -
客户拿到授权码 ,在客户端里输入。客户端解析并验证。验证要素:
1.机器码正确,防止授权码 给到其他人使用。 2.时间段正确(1天内),防止以前的机器码重复使用
-
更新注册列表,把许可时长更新 ,其他信息不变 -
把当前授权码 记录到注册列表种,防止重复使用
这里面的核心在于
>所有信息加密存储,并且要使用密钥加密
>即使算法泄露,在密钥未泄露的情况下,也能保证不会加密的信息不被解析
写在最后:
当然,对于熟悉软件工程的程序员来说,这种加密都是小儿科. 通过抓包工具或者是内存检测工具,很容易就能找到什么时候修改了注册列表,修改了什么注册列表 甚至360等杀毒软件拦截时候会标记出来
针对这种情况,干脆一不做二不休,把信息加密写在运行环境下,用二进制流的形式存储起来,并且改文件名后缀(比如改成.sys),掩人耳目
对于不清楚加密逻辑的人来说,自然是不敢随便动这个.sys文件
但如果你读了这篇文章,并且用的软件正好是使用类似的逻辑,那就可以通过替换初始sys文件,来达到清空注册信息,而达到无限续杯的效果
如果将一些辅助信息,比如初次注册信息,加密存储到其他地方,例如注册列表,syswow64等文件夹下,那也没那么好找.
总而言之,这是一个和用户斗智斗勇的过程,对于大多数客户来说,根本不会花那么时间去研究你的加密逻辑,因此在小型项目种,使用上述的加密思路,也够用了
|