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

  发布时间:2025-11-04 04:11:04   作者:玩站小弟   我要评论
假设有这样一个场景,你接了一个私活,帮别人做一个软件,软件没有联网功能。东西做好以后,客户还没有给钱,说要先试用一下。你选择了相信客户,把软件发送给了他。然后他就把你拉黑了。为了避免这种情况发生,你首 。

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

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

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

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

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

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

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

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

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

各个语言都有非对称加密相关的第三方库。我们用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的内容,那么验证就会失败,如下图所示:

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

  • Tag:

相关文章

  • 页面设置方法与文章布局技巧(提高文章可读性的关键步骤和注意事项)

    摘要:在撰写一篇文章时,除了内容的质量外,页面的设置和布局也是至关重要的因素之一。通过合理的页面设置和布局,可以提高文章的可读性和吸引力,使读者更容易理解和接受文章的内容。本文将介绍一些...
    2025-11-04
  • 不会编程也能写程序 - Testin AI 新产品iTestin发布

    2019年10月26日,由Testin主办的第二届NCTS峰会,以“AI+未来”为主题,在北京国际会议中心正式召开。峰会上,Testin 总裁徐琨正式发布测试业务Testin云测的全新AI产品iTes
    2025-11-04
  • 小白都能看懂,用Python来实现一个区块链,就这么简单

    最近区块链又开始火起来来啦,翻出一篇我一年前写的文章,其实对于我们码农来说,除了平时埋头苦干,对新技术需要保持一定敏感性!每一种新的技术的出现都和未来的产业发展非常相关,蕴含着巨大的机会,除了干活还要
    2025-11-04
  • 大佬乌镇发言最全汇总:一个都不能错过

    10月20日,第六届世界互联网大会在浙江乌镇如期举行,本次大会以“智能互联 开放合作——携手共建网络空间命运共同体”为主题,对创新发展、网络安全、文化交流、国际合作等议题进行探讨。今年恰逢互联网诞生5
    2025-11-04
  • Ghost全盘教程(用Ghost打造独一无二的网站)

    摘要:在当今数字化时代,拥有一个个性化的网站已经成为许多人的梦想。而Ghost作为一个强大的内容管理系统,可以帮助你轻松实现这一目标。本文将带你深入了解Ghost,并教你如何利用其全盘功...
    2025-11-04
  • 可以编写代码的代码:代码生成的利与弊

    代码生成的当前状态代码生成的当前状态是无处不在的2019年春季)。如今,代码生成发生在软件堆栈的每一层,包括Java库如swagger CodeGen), 最新的交叉编译器/编译器如针对
    2025-11-04

最新评论