前言
对于收费软件,一般是我们需要去购买一个许可,然后输入这个许可到软件里就能够使用软件。
于是有的小伙伴就开始好奇这个许可是怎么实现的,特别是在离线情况下它是怎么给软件授权,同时又能避免被破解的。
License 内容
一个许可应该包含以下基本内容:
- 授权用户(用户编号、MAC地址、IP地址等)
- 授权期限(开始结束时间、无限期等)
- 授权功能(应用版本、应用功能)
License 授权流程
License授权机制的原理
(1)生成密钥对,包含私钥和公钥。(2)授权者保留私钥,使用私钥对授权信息诸如使用截止日期,mac 地址等内容生成 license 签名证书。(3)公钥给使用者,放在代码中使用,用于验证 license 签名证书是否符合使用条件。
数字签名
:一种防伪造技术,能够通过公钥
验证的数据一定是私钥
拥有者所签发的。因此除非私钥泄露(一般放在服务器),否则没有人能够伪造。
许可生成就是服务器使用非对称加密私钥
对许可进行数字签名
,客户端使用对应的公钥
对许可进行数字签名校验,校验通过再校验许可的内容。
提高破解难度
(1)应用带上时间戳
应用带上发布时间戳,如果License允许时间小于这个时间戳就算系统时间大于也不能使用(避免修改系统时间情况),这样就限制了过期License没办法使用新版本应用。
(2)加大反编译难度
不要用Java等容易被反编译的代码去校验,特别是校验许可的代码(避免直接改为True),存放公钥字符串的代码(避免直接替换公钥)。
尽量把校验代码放到二进制代码里面去,同时可以对代码进行混淆,增加破解难度。
参考:
软件License授权原理 - 掘金
软件离线许可(License)实现原理 - 掘金
https://github.com/sixj0/license
[Crypto] Licensing your software with OpenSSL. Using license keys. Software copy-protection.