我做了一个App,如何让别人限时使用?

简介: 我做了一个App,如何让别人限时使用?

假设有这样一个场景,你接了一个私活,帮别人做一个软件,软件没有联网功能。东西做好以后,客户还没有给钱,说要先试用一下。你选择了相信客户,把软件发送给了他。然后他就把你拉黑了。


为了避免这种情况发生,你首先想到的办法,肯定是把过期时间写死到代码里面,时间到了App自动销毁。对方付钱以后,你再把这个写死的时间延长或者去掉。再重新编译后发给客户。


但问题是,每次重新编译代码并发给用户是非常麻烦的事情,有没有更简单的办法呢?能不能软件始终是一个软件,但是给用户一个注册码,这个注册码里面标记了有效时间。等到过期以后,只需要给用户一个新的注册码,就可以继续使用了。


看到这里,有同学肯定会想,怎么在注册码指定有效期呢?首先这个时间肯定不能是明文的,否则用户把它一改,岂不是就可以自行延长了。


但如果加密的话,就必须把解密算法放到软件里面,一旦用户对程序进行初步的反编译,就能拿到解密算法或者对称加密的密钥。


因此,我们只能使用非对称加密。而非对称加密里面,通过公钥加密,使用私钥解密。如果我们要让软件从注册码里面解码出有效时间,难道要在软件里面放私钥?


私钥不能泄露,因此放到软件里面的只能是公钥。但是难道能使用私钥加密,用公钥解密?


实际上,真的可以这样做,但这不叫做私钥加密公钥解密,这叫做私钥签名(sign),公钥验证(verify)。并且,使用这个方法有一个好处,就是有效时间可以直接明文存放,不怕用户修改。因为一旦修改了,签名就匹配不上。


假设我们有一个字符串message,使用私钥,可以对这个字符串进行签名,获得一个签名字符串signature。而我们用公钥,可以验证message是否能够生成签名字符串signature。如果message发生了修改,或者signature发生了修改,或者messagesignature同时发生了修改,公钥验证都会失败。


各个语言都有非对称加密相关的第三方库。我们用Python中的PyCryptodome来进行演示。


首先,我们在macOS下面,生成一对公钥和私钥:


ssh-keygen -t rsa


根据提示输入密钥的储存路径就可以了,如下图所示:


640.png


image.gif

在当前文件夹,生成了私钥sign和公钥sign.pub


接下来,使用pip安装PyCryptodome:


pip install pycryptodome


接下来,导入公钥和私钥:


>>> from Crypto.PublicKey import RSA
>>> with open('sign') as f:
...  private = f.read()
...
>>> with open('sign.pub') as f:
...  public = f.read()
...
>>> private_key = RSA.import_key(private)
>>> public_key = RSA.import_key(public)


由于我们之前生成密钥使用的是SHA256算法,因此我们需要用SHA256算法对需要签名的数据生成摘要。这一步在签名和验证签名的时候都需要做。


>>> from Crypto.Hash import SHA256
>>> digest = SHA256.new()
>>> message = 'expire: 2022-03-01'
>>> digest.update(message.encode())


接下来,对这个数据进行签名:


>>> import base64
>>> from Crypto.Signature import PKCS1_v1_5
>>> signer = PKCS1_v1_5.new(private_key)
>>> code = signer.sign(digest)
>>> signature = base64.b64encode(code)
>>> print(signature.decode())


运行效果如下图所示:


640 (1).png


现在,你只需要把字符串expire: 2022-03-01和签名字符串xbelbTNpq8M...很长一串...发送给客户就可以了。


客户把过期时间的字符串和签名字符串输入到软件以后,软件使用公钥来验证这个字符串是不是由自己对应的私钥签名的:


>>> message = 'expire: 2022-03-01'
>>> signature = 'xbelbTNpq8MCFkSxGBoTq7SwQ+oqHRAObrj5p8K2gyY+7uWs5dXGjsQ+GP2XTS5YskCtGjYIBZmAmeM5ey69lRQyk5S1m7t68pYNbUvf3o39Ym0rcmK7XGkBh3euZzVeRErs4JCl7ffTbfcqM4aAsWldDKESrZvaDNQ5DkC8VRYHPBfZfScHqPw/zcHCMRhC9Dch8j9eQlnk8/UKY0MM92jXT4map94PzZRfMLkD4vsciZTtMJm4a42UiiWDUpA6zIgQCYru2YyKspS1uZFE51atYP5DcgPWvJUVRDJS/ZjdPfi9chRjx0dS/Df1sFEreZ7myzXAJP7Y8FA6rvi7EZLlHZ1ViM9tTJp9ut/ZlKgnPAuDCp1JSyKMUk/doVqzUjTqTNHuORe+p3Hhb+xkCASyD8eUH+CyEDVLRcDkSMH5U3o/uONnOQao2o9dbkGiSYNkToElQJ2v20S3MnncPciij8H7iI2dDp1dwt8bkcZOD+E1Tf88LMvRaxB7YnhJ'
>>> digest = SHA256.new()
>>> digest.update(message.encode())
>>> reader = PKCS1_v1_5.new(public_key)
>>> reader.verify(digest, base64.b64decode(signature.encode()))
True


但如果你篡改了message的内容,那么验证就会失败,如下图所示:


640 (2).png


软件第一次验证通过以后,就可以把这个过期时间的字符串和签名字符串一起用文件的形式存到硬盘上,每次启动软件的时候都检查一遍。发现合法并且没有过期就正常运行。发现过期了或者不合法就就重新弹出输入注册码的对话框。


请关注微信公众号【未闻Code】获取更多精彩文章。

目录
相关文章
|
11天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1243 5
|
10天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1220 87
|
11天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1800 13
|
20天前
|
人工智能 运维 安全
|
4天前
|
资源调度
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
235 127
|
4天前
|
前端开发
Promise的then方法返回的新Promise对象有什么特点?
Promise的then方法返回的新Promise对象有什么特点?
180 2