我们经常使用各种开发软件,比如IntelliJ IDEA、Navicat、Visual Studio等,这些软件都有一个特点,就是要收费。一般是我们需要去购买一个许可,然后输入这个许可到软件里就能够使用软件。
于是有的小伙伴就开始好奇这个许可是怎么实现的,特别是在离线情况下它是怎么给软件授权,同时又能避免被破解的。
 
许可内容
一个许可应该包含以下基本内容:
  • 授权用户(用户编号、MAC地址、IP地址等)
  • 授权期限(开始结束时间、无限期等)
  • 授权功能(应用版本、应用功能)
基本原理
数字签名:一种防伪造技术,能够通过公钥验证的数据一定是私钥拥有者所签发的。因此除非私钥泄露(一般放在服务器),否则没有人能够伪造。
许可生成就是服务器使用非对称加密私钥对许可进行数字签名,客户端使用对应的公钥对许可进行数字签名校验,校验通过再校验许可的内容。
 
 
提高破解难度
应用带上时间戳
应用带上发布时间戳,如果License允许时间小于这个时间戳就算系统时间大于也不能使用(避免修改系统时间情况),这样就限制了过期License没办法使用新版本应用。
加大反编译难度
不要用Java等容易被反编译的代码去校验,特别是校验许可的代码(避免直接改为True),存放公钥字符串的代码(避免直接替换公钥)。
尽量把校验代码放到二进制代码里面去,同时可以对代码进行混淆,增加破解难度。
 
以上是软件License授权的标准做法。当然也有一些比较low的做法,大致思路如下:
1.NET Winform程序逐个去读取在线设备的CPU,MAC地址,更有甚者还有读取主板信息
2.在程序中再去验证上面读取到的信息是否是当前设备的。
 
此处,并没有任何鄙视Winform开发者的的意思,那些在自动化领域的专家很多都是用Winform做开发,只是觉得这种做法真的有点土了。
 
部分内容参考链接:https://juejin.cn/post/7140328102709690398

最新文章

  1. MBTiles
  2. 彻底理解js中this的指向,不必硬背。
  3. IIS出现问题时修改配置文件的几项说明
  4. Python基础 练习题
  5. 纯css3写的仿真图书翻页效果
  6. SKPhysicsJointSpring类
  7. SRM 586 DIV1
  8. BZOJ 3514 (动态树)
  9. 怎样为ubuntu eclipse 添加 GBK字符集
  10. Qt 释放新建窗口资源
  11. dvtm: 平铺式终端管理器 — LinuxTOY
  12. ARM架构解析
  13. 加载window事件
  14. 新建VS工程与填坑:解决方案与项目不在同一目录
  15. 【aardio】如何对listview中某一列,某一行的特定值进行修改?
  16. 谷歌浏览器提示Adobe flash player不是最新版本的解决方法
  17. JavaScript 里,$ 代表什么?/JQuery是什么语言?/html中用link标签引入css时的中 rel="stylesheet"属性?/EL表达式是什么?
  18. CF1114E Arithmetic Progression(交互题,二分,随机算法)
  19. 项目冲刺Third
  20. hadoopMR自定义输入类型

热门文章

  1. Linux 第四节(shell脚本,IF,do,for)
  2. springmvc的Interceptor拦截器和servlet的filter过滤器
  3. css背景模糊化
  4. 51电子-STC89C51开发板:目录
  5. python 操作 ES 二、mappings
  6. 了解了一下Cookie
  7. GDB调用
  8. 浅谈Redis大Key与热Key
  9. centos更改java的环境变量
  10. centos7.2下配置DNS服务器