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

本文探讨了一种利用非对称加密(RSA)技术,通过私钥签名确保软件试用期的有效性的方法。通过公钥验证过期时间和签名,避免了直接在代码中写死时间导致的麻烦。Python示例展示了如何生成并验证签名,使得软件更新仅需提供新的注册码,提高了灵活性和安全性。
摘要由CSDN通过智能技术生成

假设有这样一个场景,你接了一个私活,帮别人做一个软件,软件没有联网功能。东西做好以后,客户还没有给钱,说要先试用一下。你选择了相信客户,把软件发送给了他。然后他就把你拉黑了。
为了避免这种情况发生,你首先想到的办法,肯定是把过期时间写死到代码里面,时间到了App自动销毁。对方付钱以后,你再把这个写死的时间延长或者去掉。再重新编译后发给客户。

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

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

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

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

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

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

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

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

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

ssh-keygen -t rsa

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

在这里插入图片描述
在当前文件夹,生成了私钥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())

运行效果如下图所示:

在这里插入图片描述

现在,你只需要把字符串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的内容,那么验证就会失败,如下图所示:

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

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。


这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值