我做了一个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】获取更多精彩文章。

目录
相关文章
|
1月前
|
开发工具 数据安全/隐私保护 Android开发
【教程】APP 开发后如何上架?
【教程】APP 开发后如何上架?
|
1月前
|
Android开发 开发者 iOS开发
app如何快速上架,您Get到了吗 ?
上架App前需要准备什么?是否有快速上架App的方法呢?跟小云一起来看看吧~
|
1月前
|
编解码 数据安全/隐私保护 iOS开发
uniapp上架app store详细攻略
uniapp上架app store详细攻略
42 0
|
存储 安全 数据安全/隐私保护
iOS App 上架App Store及提交审核详细教程
前四布我们之前都做了,详见这篇博客: 利用Appuploader在window上申请IOS开发所需要的证书及描述文件,我们主要看后面几步。
|
安全 Linux 数据安全/隐私保护
app如何上架苹果应用商店
Appuploader是一个IOS开发助手,可以快速,轻松地生成ios开发证书,不需要钥匙串助手; appuploader可以批量上传屏幕截图并将ipa文件上传到Apple商店,在windows,linux或mac上,不需要应用程序加载器和mac计算机。
|
存储 安全 数据安全/隐私保护
iOS App 上架App Store及提交审核详细教程
上架App Store审核分7步进行: 1、安装iOS上架辅助软件Appuploader 2、申请iOS发布证书(p12) 3、申请iOS发布描述文件(mobileprovision) 4、打包ipa 5、上传ipa到iTunes Connect 6、TestFlight方式安装到苹果手机测试 7、设置APP各项信息提交审核
|
数据安全/隐私保护 iOS开发 开发者
[苹果APP上架]ios App Store上架详细教程-一条龙顺滑上架-适合小白 如何在 2022 年将您的应用提交到 App Store
您正在启动您的第一个应用程序,或者距离上次已经有一段时间了。作者纸飞机@cheng716051来给你讲讲将应用程序提交到 App Store 并不像按下启动按钮那么简单,但也没有看起来那么复杂。
|
存储 编解码 安全
APP上架需要的准备和流程
APP上架需要的准备和流程
193 0
APP上架需要的准备和流程
|
弹性计算 数据安全/隐私保护
初次使用阿里云App
这篇文章主要是讲 一、我的基本介绍 二、我通过某种途径得到的关于阿里云ESC的使用情况 三、我在操作过程中,实践操作得到的一些小成就展示 四、我在实验当中遇到的问题以及解决方案 五、自己体验的感受,以及以后可能会从事这方面的工作或业余兴趣爱好
初次使用阿里云App
|
开发者
10分钟让你了解应用宝APP上架流程
APP开发完成后,需要上架到各个应用市场,才能供用户下载使用,这篇文章和大家介绍一下应用宝的上架流程,供大家参考,给需要上架的人做参考;
682 0
10分钟让你了解应用宝APP上架流程