场景说明

小明使用.NET 或者 Java Fx 或 Electron、 Android等桌面客户端或移动客户端技术开发的一个桌面软件,准备实现付费授权,但是客户场景比较多在线授权无法覆盖全部,现在用户希望可以离线且绑定设备授权软件。

方案一:读取设备唯一ID, 根据设备ID授权

设备唯一编码

Github项目地址,是Git 上老牌项目,使用汇编语言执行命令读取Cpu的ID

在实际测试下,读取CPUID 可行行非常低,现在大量的设备同一个品牌、机型读取的CPUID甚至都是一样的

目前兼容的解决方案是:

  1. 读取设备硬盘号
  2. 读取设备CPUID
  3. 创建并读取,加密一个含UUID文件到隐藏目录用与唯一表示

IOS 设备可以创建 keychain Android 取决于各个手机机型存储 Window / Mac / Linux 存储到用户目录下的隐藏目录中 组合以上方法实现一个并不怎么安全的设备唯一


软件授权

在读取了设备唯一编码后,客户可以将设备编码发送给软件管理员生成一个激活秘钥,秘钥内要至少包含

  1. 设备ID
  2. 授权到期时间

客户端读取秘钥后读秘钥进行解密,需要提前将秘钥生产或者秘钥信息放在客户端 (这里也是破解软件)

  1. 客户端通过设备唯一ID生成解密秘钥
  2. 使用RSA解密信息
  3. 写入授权文件到用户目录

授权软件完成

  • 在授权软件过程中最好使用C C++ Rust 等静态编译语言编写有效预防方式反编译
  • 客户端授权的软件并不能保证保证安全软件不被破解

方案二:使用加密狗等外设设备

在很久以前有一个软件叫《金蝶》使用他们的软件必须使用U盘一样的加密狗插入到电脑进行授权,现在金蝶最新版本已经没有这样的授权方式了,都是云上部署或Sass服务了。

软件加密狗,是一种插在计算机并行口上的软硬件结合的加密产品(新型软件加密狗也有usb口的)。一般都有几十或几百字节的非易失性存储空间可供读写,现在较新的狗内部还包含了单片机。

我们举个例子说明单片机算法的使用。 比如一段程序中有这样一句:A=Fx(3)。程序要根据常量3来得到变量A的值。于是,我们就可以把原程序这样改写:A=Fx(DogConvert(1)-12342)。那么原程序中就不会出现常量3,而取之以DogConvert(1)-12342。这样,只有软件编写者才知道实际调用的常量是3。而如果没有软件加密狗,DogConvert函数就不能返回正确结果,结果算式A=Fx(DogConvert(1)-12342)结果也肯定不会正确。

这种使盗版用户得不到软件使用价值的加密方式,要比一发现非法使用就警告、中止的加密方式更温和、更隐蔽、更令解密者难以琢磨。 此外,软件加密狗还有读写函数可以用作对软件加密狗内部的存储器的读写。于是我们可以把上算式中的12342也写到软件加密狗的存储器中去,令A的值完全取决于DogConvert()和DogRead()函数的结果,令解密难上加难。不过,一般说来,软件加密狗单片机的算法难度要低于一些公开的加密算法,如DES等,因为解密者在触及软件加密狗的算法之前要面对许多难关。

自己创建一个加密狗


总结

  • 客户端授权不可靠,代码反编译都能看
  • Rust、C、C++ 等编写代码授权,输出可执行文件更可靠
  • 加密狗安全、可靠、有效但是更用户体验麻烦