个人软件激活码机制实现 您所在的位置:网站首页 uibot机器码激活码 个人软件激活码机制实现

个人软件激活码机制实现

#个人软件激活码机制实现| 来源: 网络整理| 查看: 265

软件激活码是常见的一种软件购买验证方式,用过 Windows 的同学相比对软件激活码都比较熟悉,Windows 本身就是靠激活码进行激活的软件。

相比于账号登录,扫码激活之类的,激活码的一个优势是实现比较起来比较方便。对于个人开发者来说不需要去折腾付费渠道或者维护一个会员系统等。

当然了,对于 macOS 来说还有个更官方的渠道是 App Store 的购买 & 内购。App Store 的实现和维护成本更低,但是 App Store 有 30% 的抽成,每年 98 刀的年费,比较高的提现门槛,对于用户又有一定的筛选(Mac App Store 的使用率远不如 iOS App Store)。对于 App 也会有一些限制(主要是必须要是 Sandbox App)。所以,很多时候 Mac App Store 这种并非开发者最好的选项。

离线激活码

最简单的思路就是生成一类能够被验证的离线激活码了,例如预设一组规则:

验证码由 6 位数字组成 验证码的数字加起来可以被 5 整除

这样,我们就可以在本地验证

324042 是一个合法的激活码 123232 则不合法

但这样做显然太容易被破解,当然我们可以让规则更加复杂,这样相对来说破解仍有一定的难度。但比较致命的问题在于:同样的验证码一旦泄露可以被多个人使用无限多次。

不少商业软件仍然用得是这种比较简单的激活方法,但破解门槛极低,往往能够直接搜索到现成可用的注册码。

Google直接就能搜到注册码

Google直接就能搜到注册码

联网验证

既然说到离线马上就有人想到是否联网验证就能解决问题,答案是:能解决一部分。

联网验证能够解决多次验证的问题,然而却比较难以防范伪造服务器返回结果。假设你的验证内容就只有一个 {"success": true} 的话很容易被人抓包伪造。

另一方面,大部分软件不适合长时间保持联网验证,除非是本身功能需要网络的软件。否则完全可以直接关掉你的网络权限,然后在本地放一个看起来曾经验证通过的标记,就可以一直维持验证通过的状态。

所以虽然需要联网验证,但是最后我们仍然需要产生一个客户端能够独立离线判断是否有效的激活码。

机器识别码

为了离线状态下仍然能够验证有效且避免被多个人使用,我们需要把激活码和机器进行绑定。可用的机器识别码有很多,例如说 Mac 地址,在 macOS 下执行

> ifconfig en1 | awk '/ether/{print $2}'

就能拿到类似 1e:00:xx:39:d2:01 这样一个跟机器相关的识别码,除了网卡外,蓝牙甚至是雷电口等硬件都有 Mac 地址,除此之外还有硬盘序列号等。

有了机器识别码后,我们就能够生成和机器识别码强绑定的字符串,简单的思路可以直接

MD5('你的一个随便什么key' + 机器识别码) = 验证串

这种做法是对称的,生成验证串的逻辑和验证串的逻辑完全一致(都是这个 MD5),所以如果有人逆向你的客户端程序,仍然能够拿到这个规则。这也是各种”注册机”的原理,通过在同样的机器上运行一段程序,注册机会用和软件一样的验证串生成逻辑来生成有效的码。

注册机

注册机

所以如果想要更高的安全性,则需要把生成逻辑和验证逻辑分离,不能让人通过客户端的逻辑就生成验证码。

证书签名

其实到这里思路就很清晰了,我们可以在服务器端生成验证串的地方使用密钥对机器码进行签名,然后在客户端只需要用公钥进行签名验证,就可以判断验证串是否有效。

而即使客户端的逻辑被人逆向出来,仅凭公钥也是无法签名新的验证串的。

这里不介绍具体的签名和验证算法,具体的信息可以参照:RSA,大致上你只需要知道,通过这种方式,客户端只能验证验证串的有效性,而完全无法生成验证串即可。

收款

到了这里,我们总算是有一个(比较)靠谱的方式能够生成和验证激活码了,那么接下来就是个人开发最头疼的收款问题。

众所周知,个人无法直接申请支付宝或者微信支付作为收款方式,也有一些服务提供个人收款,但大多需要交纳一定的费用。同样我们考虑用一个成本较低的方式进行收款,例如自动购买激活码。

基于 taobao 的自动发码机器人也可以,我使用的是 V2Geek 来销售激活码,成本更低。目前支持直接购买激活码到邮箱,而且可以在后端配置优惠码,支付方式上支持支付宝 & 微信支付。不需要交额外费用,只需要每笔抽成 5% 即可。

相对于很多收款方式,这已经是非常良心的服务价格了。

当然由于在购买后发邮件的时候只支持预先配置好的激活码列表(大部分都是这样,总不能让你 FAAS 写代码不是),无法和用户机器做关联。

这就是为什么我上面说联网激活解决了一半的问题,我们需要先用一次性的静态 token。在用户用 token 联网激活时,服务器端验证 token 有效性然后根据机器识别码生成最后的激活码,并且存在客户端。以后客户端就可以用这个激活码离线验证是否有效。

整体的流程就是:

license-flow

license-flow

其中购买的部分我用的是 V2Geek,服务器的部分用的是免费的 LeanCloud,也可以用其他的免费 FAAS 替代,因为激活的操作一般来说不会有多大的请求量。

其他

虽然我们尽可能的让方案变得安全,但终究是防君子不防小人的(例如各种机器识别码是可能被伪造的)。我们只是在尽量不提高自己的维护成本前提下提高破解的成本,但终究还是要不断提高软件本身的体验,只有在正版用户的支持下个人软件才有可能长远的走下去。

我开发的 xTab 就是按照上面的思路实现的内购功能,具体的激活流程可以下载尝试。

另外,V2Geek 也提供下面这样的购买挂件可以插入到博客中:

By V2Geek

Last

你花的每一分钱,都在为你想要的那个世界投票



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有