IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 断网环境的软件加密策略 -> 正文阅读

[网络协议]断网环境的软件加密策略

断网环境的软件加密策略

对软件进行加密管理的方案有很多种,大型商业软件通常会自己做License管理器来做软件授权。而一般的中型项目,则会使用商业加密软件进行加密与授权管理,例如深思数盾等。

对于小型的软件,不想付费使用商业加密软件,就只能自己做加密。

在最近的项目种遇到了需要对软件加密的需求,以下是我对软件加密的一些思考。

1.如何做许可验证

在需要考虑许可时长的情况下,通常使用时间戳验证。也就是许可生效时间和当前机器时间相减之后做验证。

如果在联网环境下,我们能够通过API保证拿到的时间是互联网时钟。但如果在断网环境下,用户是可以随意修改系统时间的,这样验证就很可能被篡改。

2.断网情况下的验证

如何保证软件断网情况下,不被用户篡改时间而通过验证?

有以下几个步骤。

  1. 在软件初次启动时,把【使用信息】写进注册列表。包括机器码(CPU或者硬盘ID)初次注册时间许可时长等信息。同时,写入是否【初次注册】的记录,写到另一条注册列表里面。
  2. 软件启动后,每隔N分钟更新一次【最后使用时间戳】,用于校验。(作用在于用户不可能每隔N分钟改一次时间,这样他的最后使用时间戳必定会正向更新。如果篡改了比注册时间还早的时间,也能够发现)
  3. 在软件再次启动时,先检查注册列表里面是否有【使用信息】。
  4. 如果有,则校验信息。验证【最后使用时间戳】减去【初次注册时间】是否超过了许可时长(若超过,拒绝验证)。如果没有,则检查是否有【初次注册】的记录(如果存在记录,则证明用户篡改了注册列表,拒绝验证)。
  5. 其他情况下,通过验证。

在这里插入图片描述

注:所有写入注册列表的信息都要通过加密算法来隐藏信息,加密算法必须要使用密钥加密。

3.如何延长许可授权

为了隐藏加密逻辑,软件许可授权的延长,需要客户端和授权器两个工具配套实现。

  1. 客户端获取机器码、当前日期,并通过加密算法生成延长申请码 ,并发送给授权管理员

  2. 授权管理员使用授权器,解析延长申请码,获得时间和机器码。验证时间是否和本地时间在同一段范围内(比如1天),防止用户篡改了日期

  3. 授权管理员根据机器码和本地时间,加密生成一个延长码,发送给客户

  4. 客户拿到授权码,在客户端里输入。客户端解析并验证。验证要素:

    1.机器码正确,防止授权码给到其他人使用。
    2.时间段正确(1天内),防止以前的机器码重复使用

  5. 更新注册列表,把许可时长更新,其他信息不变

  6. 把当前授权码记录到注册列表种,防止重复使用

这里面的核心在于

>所有信息加密存储,并且要使用密钥加密
>即使算法泄露,在密钥未泄露的情况下,也能保证不会加密的信息不被解析

写在最后:

当然,对于熟悉软件工程的程序员来说,这种加密都是小儿科.
通过抓包工具或者是内存检测工具,很容易就能找到什么时候修改了注册列表,修改了什么注册列表
甚至360等杀毒软件拦截时候会标记出来

针对这种情况,干脆一不做二不休,把信息加密写在运行环境下,用二进制流的形式存储起来,并且改文件名后缀(比如改成.sys),掩人耳目

对于不清楚加密逻辑的人来说,自然是不敢随便动这个.sys文件

但如果你读了这篇文章,并且用的软件正好是使用类似的逻辑,那就可以通过替换初始sys文件,来达到清空注册信息,而达到无限续杯的效果

如果将一些辅助信息,比如初次注册信息,加密存储到其他地方,例如注册列表,syswow64等文件夹下,那也没那么好找.

总而言之,这是一个和用户斗智斗勇的过程,对于大多数客户来说,根本不会花那么时间去研究你的加密逻辑,因此在小型项目种,使用上述的加密思路,也够用了

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:40:35  更:2022-04-15 00:42:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:40:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码