关于明图斯OCR识别工具的授权方案
1、生成密钥对
$ jsign generate-key-pair
在当前目录生成公钥文件(jsign.pub)和私钥文件(jsign.key)。私钥文件请妥善保管,公钥文件可随软件一起下发(出于保密性考虑,建议将公钥内容内嵌到程序中),利用公钥对授权文件进行校验。
2、授权证书格式
授权 license 文件采用 json 格式,内容可随意添加,建议含有如下几项:
- 软件所有者
- 授权开始时间
- 授权结束时间
- 授权对象
样例见:https://github.com/ruitard/jsonsign/blob/development/test/license.json
3、对授权 json 文件进行签名
当创建好原始授权文件后,需对其进行签名,防止信息被篡改伪造。使用私钥(jsign.key)签名:
$ jsign sign --key jsign.key --file license.json
同时也提供了对应的 C++ 接口:
buffer sign(const buffer &content, const fs::path &key_file);
buffer sign(const buffer &content, const std::string_view &key);
在原来的 json 对象中增加了 |signature| 字段保存签名。
4、校验授权 license 是否有效
当客户使用软件时,可以校验软件是否已授权。
授权验证签名是否有效:
$ jsign verify --key jsign.pub --file license.json
对应的 C++ 接口:
bool verify(const buffer &content, const buffer &signature, const fs::path &key_file);
bool verify(const buffer &content, const buffer &signature, const std::string_view &key);
签名有效则代表授权文件里的内容没有被篡改过,可以信任。接下来则可以根据需要判断当前时间是否在有效期内;使用者是否是授权对象等。
风险
方案似乎很完美,简直无懈可击。但其实这是典型的防君子不妨小人,稍微有点逆向经验的程序员应该都知道,程序是可以调试的,程序是可以修改的。完全可以找到程序二进制里嵌入的公钥,然后换成自己的公钥,再用自己的私钥签发一个授权文件,这样便完成了破解。
更简单的方式是用逆向工具找到 verify 函数所在的位置,直接将返回值修改为 true,这样证书校验总能通过。
总的来说该方案只在某些场景下有效,如用户接触不到程序本体。其他场景中授权 license 更像是一个君子协定,只是尽量增加破解难度罢了。
秘钥546151874156360548561

浙公网安备 33010602011771号