基于django实现有效期为三年的软件授权控制(用postman进行接口测试)
1.导入必要的包
import base64 import json import os import time import ntplib from Crypto.Cipher import PKCS1_v1_5, PKCS1_OAEP from Crypto.PublicKey import RSA
2.设置授权开始和结束时间,生成公钥和私钥,存在指定目录下。
class LicenseAuthView(BaseView): def get(self, request): key = RSA.generate(1024) pub_key = key.publickey().export_key() pri_key = key.export_key() start_date = '2023-06-13' end_date = '2026-06-13' time_str = start_date + ',' + end_date cipher_rsa = PKCS1_OAEP.new(RSA.import_key(pub_key)) encrypted_data = cipher_rsa.encrypt(time_str.encode()) encrypted_data_base64 = base64.b64encode(encrypted_data).decode() with open(os.path.join('data', 'rsa_private.pem'), 'wb') as f: f.write(pri_key) # 输出加密后的授权内容和私钥 print('授权内容:', encrypted_data_base64) return Response.json_response(Response.ok, Response.msg.get('ok'), {'license_key': encrypted_data_base64})
3.根据用户输入的lincense_key检查许可证是否有效
def post(self, request): response = ntplib.NTPClient().request('ntp.aliyun.com') ts = response.tx_time _date = time.strftime('%Y-%m-%d', time.localtime(ts)) print("_data的值是:", _date) source_json_str = request.body source_dic = json.loads(source_json_str) license_key = source_dic.get("license_key") pri_key = source_dic.get("pri_key") try: cipher_rsa = PKCS1_OAEP.new(RSA.import_key(pri_key)) decrypted_data = cipher_rsa.decrypt(base64.b64decode(license_key)) decrypted_data_str = decrypted_data.decode() start_date, end_date = decrypted_data_str.split(',') if start_date <= _date <= end_date: context = 'Your license has expired on {}.'.format(end_date) return Response.json_response(Response.valid_license_key, Response.msg['valid_license_key'],context) else: context = 'Your license has expired on {}.'.format(end_date) return Response.json_response(Response.license_has_expired, Response.msg['license_has_expired'], context) except Exception as e: print('异常', e) self.logger.error(e) context = 'Your license is invalid' return Response.json_response(Response.invalid_license_key, Response.msg['invalid_license_key'], context)
这些response的提示信息都是自定义的,可以根据需要修改。
测试结果: