<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          我做了一個(gè)App,如何讓別人限時(shí)使用?

          共 2741字,需瀏覽 6分鐘

           ·

          2022-02-26 09:56

          攝影:產(chǎn)品經(jīng)理

          各種刺身

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

          為了避免這種情況發(fā)生,你首先想到的辦法,肯定是把過期時(shí)間寫死到代碼里面,時(shí)間到了App自動(dòng)銷毀。對(duì)方付錢以后,你再把這個(gè)寫死的時(shí)間延長或者去掉。再重新編譯后發(fā)給客戶。

          但問題是,每次重新編譯代碼并發(fā)給用戶是非常麻煩的事情,有沒有更簡單的辦法呢?能不能軟件始終是一個(gè)軟件,但是給用戶一個(gè)注冊(cè)碼,這個(gè)注冊(cè)碼里面標(biāo)記了有效時(shí)間。等到過期以后,只需要給用戶一個(gè)新的注冊(cè)碼,就可以繼續(xù)使用了。

          看到這里,有同學(xué)肯定會(huì)想,怎么在注冊(cè)碼指定有效期呢?首先這個(gè)時(shí)間肯定不能是明文的,否則用戶把它一改,豈不是就可以自行延長了。

          但如果加密的話,就必須把解密算法放到軟件里面,一旦用戶對(duì)程序進(jìn)行初步的反編譯,就能拿到解密算法或者對(duì)稱加密的密鑰。

          因此,我們只能使用非對(duì)稱加密。而非對(duì)稱加密里面,通過公鑰加密,使用私鑰解密。如果我們要讓軟件從注冊(cè)碼里面解碼出有效時(shí)間,難道要在軟件里面放私鑰?

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

          實(shí)際上,真的可以這樣做,但這不叫做私鑰加密公鑰解密,這叫做私鑰簽名(sign),公鑰驗(yàn)證(verify)。并且,使用這個(gè)方法有一個(gè)好處,就是有效時(shí)間可以直接明文存放,不怕用戶修改。因?yàn)橐坏┬薷牧耍灻推ヅ洳簧稀?/p>

          假設(shè)我們有一個(gè)字符串message,使用私鑰,可以對(duì)這個(gè)字符串進(jìn)行簽名,獲得一個(gè)簽名字符串signature。而我們用公鑰,可以驗(yàn)證message是否能夠生成簽名字符串signature。如果message發(fā)生了修改,或者signature發(fā)生了修改,或者messagesignature同時(shí)發(fā)生了修改,公鑰驗(yàn)證都會(huì)失敗。

          各個(gè)語言都有非對(duì)稱加密相關(guān)的第三方庫。我們用Python中的PyCryptodome來進(jìn)行演示。

          首先,我們?cè)趍acOS下面,生成一對(duì)公鑰和私鑰:

          ssh-keygen?-t?rsa

          根據(jù)提示輸入密鑰的儲(chǔ)存路徑就可以了,如下圖所示:

          在當(dāng)前文件夾,生成了私鑰sign和公鑰sign.pub

          接下來,使用pip安裝PyCryptodome:

          pip?install?pycryptodome

          接下來,導(dǎo)入公鑰和私鑰:

          >>>?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算法對(duì)需要簽名的數(shù)據(jù)生成摘要。這一步在簽名和驗(yàn)證簽名的時(shí)候都需要做。

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

          接下來,對(duì)這個(gè)數(shù)據(jù)進(jìn)行簽名:

          >>>?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())

          運(yùn)行效果如下圖所示:

          現(xiàn)在,你只需要把字符串expire: 2022-03-01和簽名字符串xbelbTNpq8M...很長一串...發(fā)送給客戶就可以了。

          客戶把過期時(shí)間的字符串和簽名字符串輸入到軟件以后,軟件使用公鑰來驗(yàn)證這個(gè)字符串是不是由自己對(duì)應(yīng)的私鑰簽名的:

          >>>?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的內(nèi)容,那么驗(yàn)證就會(huì)失敗,如下圖所示:

          軟件第一次驗(yàn)證通過以后,就可以把這個(gè)過期時(shí)間的字符串和簽名字符串一起用文件的形式存到硬盤上,每次啟動(dòng)軟件的時(shí)候都檢查一遍。發(fā)現(xiàn)合法并且沒有過期就正常運(yùn)行。發(fā)現(xiàn)過期了或者不合法就就重新彈出輸入注冊(cè)碼的對(duì)話框。

          瀏覽 198
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲一区福利在线 | 爱爱爱爱爱免费视频 | 国产区99精品 | 欧美日韩毛片 | 国产一级片在线播放 |