成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我做了一個App,如何讓別人限時使用?

開發 前端
私鑰不能泄露,因此放到軟件里面的只能是公鑰。但是難道能使用私鑰加密,用公鑰解密?

假設有這樣一個場景,你接了一個私活,幫別人做一個軟件,軟件沒有聯網功能。東西做好以后,客戶還沒有給錢,說要先試用一下。你選擇了相信客戶,把軟件發送給了他。然后他就把你拉黑了。

為了避免這種情況發生,你首先想到的辦法,肯定是把過期時間寫死到代碼里面,時間到了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的內容,那么驗證就會失敗,如下圖所示:

軟件第一次驗證通過以后,就可以把這個過期時間的字符串和簽名字符串一起用文件的形式存到硬盤上,每次啟動軟件的時候都檢查一遍。發現合法并且沒有過期就正常運行。發現過期了或者不合法就就重新彈出輸入注冊碼的對話框。


責任編輯:武曉燕 來源: 未聞Code
相關推薦

2020-05-08 13:28:53

新擬物UI設計

2018-06-11 17:31:00

俄羅斯P20手機

2025-03-06 13:10:32

2022-12-05 18:17:06

技術

2023-11-28 12:00:22

應用程序API

2020-07-15 15:09:21

Python掃雷游戲Windows

2018-01-15 15:00:06

工程師項目設計師

2020-11-16 09:02:38

Python開發工具

2021-04-29 15:53:21

AI 數據人工智能

2022-03-18 22:39:57

動態內存malloc

2022-05-31 08:35:05

RocketMQACK客戶端

2017-05-02 10:13:46

2016-12-14 10:00:44

數據結構編譯器

2020-10-13 10:49:23

APPAndiroid終端

2018-10-11 21:00:18

2018-01-08 14:31:09

Electron桌面APP前端

2014-07-02 10:03:42

App推廣渠道

2015-11-06 10:14:36

APP虛擬服務器

2015-05-21 15:46:20

2022-07-26 08:14:16

注冊中心ProviderConsumer
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久一区二区三区 | 国产成人网 | 日韩久久久久 | 精品国产乱码久久久久久a丨 | 精品无码久久久久久国产 | 最新国产福利在线 | 久久大陆| 91在线一区二区三区 | 一级毛片色一级 | 美女天天干天天操 | 欧美激情一区二区三级高清视频 | 中文字幕第一页在线 | 亚洲国产精品久久久久秋霞不卡 | 一区二区中文字幕 | 色在线免费 | 精品国产免费人成在线观看 | 精品av久久久久电影 | av手机免费在线观看 | 中文字幕人成人 | 国产区高清 | 国产精品亚洲一区二区三区在线 | 日韩不卡视频在线观看 | 欧美一区二区 | av网站免费看 | 中文字幕亚洲一区二区三区 | av一级久久 | 九九综合九九 | 一区二区三区国产精品 | 久久亚洲一区二区三 | 欧美aa在线 | 欧美xxxx网站| 三级黄色片在线观看 | 做a视频| 午夜色播 | 精品视频一区二区三区在线观看 | 国产线视频精品免费观看视频 | 国产极品91 | 在线播放中文字幕 | 国产xxxx搡xxxxx搡麻豆 | 久久香蕉精品视频 | 国产成人久久精品 |