欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python授權(quán)加密的幾種常見方案

 更新時間:2025年03月21日 09:32:18   作者:三塊錢0794  
文章介紹了幾種提高軟件授權(quán)碼安全性的方法,包括使用非對稱加密、硬件綁定、時間限制、HMAC或?qū)ΨQ加密以及使用在線授權(quán)服務(wù)器,建議企業(yè)級產(chǎn)品采用服務(wù)器+本地加密結(jié)合的方式,感興趣的朋友一起看看吧

要讓軟件授權(quán)碼(License Key)更安全,并能限定服務(wù)器和使用時間,通??梢越Y(jié)合加密、硬件綁定和時間限制等方式來增強安全性。以下是幾種常見的方案:

1. 采用非對稱加密(RSA、ECC)

使用非對稱加密(如 RSA、ECC)來生成和驗證授權(quán)碼,避免私鑰泄露:

  • 生成授權(quán)碼時:服務(wù)器用私鑰加密生成帶有使用時間和設(shè)備信息的授權(quán)碼;
  • 客戶端驗證:客戶端軟件用公鑰解密并校驗授權(quán)碼的有效性。

示例

  • 授權(quán)碼內(nèi)容:
  • 用 RSA 私鑰加密并生成授權(quán)碼
  • 客戶端用 RSA 公鑰解密并驗證有效性

2. 綁定服務(wù)器(機器)信息

防止授權(quán)碼在多個設(shè)備上使用,可以綁定 硬件 ID(如 CPU ID、MAC 地址、硬盤序列號等)。

  • 生成授權(quán)碼時,記錄服務(wù)器的唯一硬件標(biāo)識
  • 客戶端運行時校驗當(dāng)前設(shè)備信息是否匹配授權(quán)碼

實現(xiàn)方法

  • 獲取設(shè)備唯一 ID,例如:
    • Windows: wmic cpu get ProcessorId
    • Linux: cat /etc/machine-id
  • 生成授權(quán)碼時,把硬件 ID加入授權(quán)信息
  • 在客戶端解密授權(quán)碼后比對當(dāng)前設(shè)備 ID

3. 設(shè)置時間限制(防止永久使用)

授權(quán)碼應(yīng)包含有效期,并防止用戶篡改系統(tǒng)時間:

  • 在授權(quán)碼中嵌入到期時間,如 expire: "2025-12-31"
  • 服務(wù)器定期驗證授權(quán)碼,或者客戶端檢查到期時間
  • 防止修改系統(tǒng)時間:
    • 可使用 NTP 服務(wù)器獲取時間
    • 記錄本地第一次使用的時間戳,并在下次啟動時對比是否倒退

4. 使用 HMAC 或?qū)ΨQ加密(AES)防篡改

為了防止授權(quán)碼被篡改,可以使用 HMAC(哈希消息認(rèn)證碼)AES 加密

  • HMAC 方式(SHA256):服務(wù)器用密鑰簽名授權(quán)碼,客戶端驗證簽名
  • AES 方式:用對稱密鑰加密整個授權(quán)碼,客戶端解密后校驗

驗證授權(quán)碼時,客戶端用相同的 secret_key 計算簽名并校驗。

5. 結(jié)合在線授權(quán)服務(wù)器

為了更安全,可以使用在線授權(quán)服務(wù)器,客戶端每次啟動時需向服務(wù)器驗證:

  • 授權(quán)服務(wù)器存儲授權(quán)碼和綁定的設(shè)備信息
  • 客戶端每次啟動時請求服務(wù)器驗證授權(quán)碼
  • 服務(wù)器返回結(jié)果,是否授權(quán)、是否過期、是否被盜用

額外措施

  • 允許離線模式(如本地緩存授權(quán)信息)
  • 服務(wù)器可吊銷授權(quán)碼(如檢測到異常使用)

最佳方案推薦

  • 本地校驗:使用RSA(公私鑰加密)+ HMAC(防篡改)
  • 綁定設(shè)備:獲取 CPU ID 或 MAC 地址,存入授權(quán)碼
  • 限制時間:內(nèi)嵌到期時間,并校驗系統(tǒng)時間防修改
  • 服務(wù)器驗證(可選):定期檢查授權(quán)碼狀態(tài),支持遠(yuǎn)程吊銷

如果是企業(yè)級產(chǎn)品,建議采用服務(wù)器+本地加密結(jié)合的方式,避免破解和濫用。

上代碼

管理員:

1.生成公鑰私鑰

import rsa
# 生成 2048 位密鑰
(public_key, private_key) = rsa.newkeys(2048)
# 保存私鑰(供授權(quán)中心使用)
with open("private.pem", "wb") as priv_file:
    priv_file.write(private_key.save_pkcs1())
# 保存公鑰(供客戶端使用)
with open("public.pem", "wb") as pub_file:
    pub_file.write(public_key.save_pkcs1())
print("RSA 密鑰對已生成:private.pem(私鑰) 和 public.pem(公鑰)")

2.生成授權(quán)文件

import rsa
import json
import base64
import os
from datetime import datetime
# 讀取私鑰
with open("private.pem", "rb") as priv_file:
    private_key = rsa.PrivateKey.load_pkcs1(priv_file.read())
# 獲取目標(biāo)設(shè)備的 CPU ID
# def get_machine_id():
    # try:
        # if os.name == 'nt':
            # machine_id = os.popen("wmic cpu get ProcessorId").read().split()[1]
            # print('授權(quán)設(shè)備的唯一標(biāo)識:'+machine_id)
        # else:
            # return os.popen("cat /etc/machine-id").read().strip()
    # except:
        # return "UNKNOWN"
# 生成授權(quán)文件
def generate_license(user, expire_date, machine_id):
    license_data = {
        "user": user,
        "expire": expire_date,
        "machine_id": machine_id
    }
    print(license_data)
    # 簽名授權(quán)數(shù)據(jù)
    data_str = f"{user}|{expire_date}|{machine_id}".encode()
    signature = rsa.sign(data_str, private_key, 'SHA-256')
    # 添加簽名并保存 JSON
    license_data["signature"] = base64.b64encode(signature).decode()
    with open("license.json", "w") as license_file:
        json.dump(license_data, license_file, indent=4)
    print("? 授權(quán)文件 license.json 生成成功!")
# 示例:為某個客戶生成授權(quán)
generate_license(user="client1", expire_date="2025-12-31", machine_id="機器碼")

3.授權(quán)文件格式

{
    "user": "client1",
    "expire": "2025-12-31",
    "machine_id": "BFE***ED",
    "signature": "R62******8/w=="
}

4.要被授權(quán)控制的軟件

import os
import time
import threading
import json
import tkinter as tk
from tkinter import messagebox, ttk
from datetime import datetime
import boto3
import configparser
from elasticsearch import Elasticsearch
from urllib3.exceptions import InsecureRequestWarning
import warnings
import base64
import logging  # 添加 logging 模塊
import rsa
import hashlib
from botocore.exceptions import ClientError, EndpointConnectionError
warnings.filterwarnings("ignore", category=InsecureRequestWarning)
# ==================== 配置日志 ====================
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    filename=f'logs/file_search_{datetime.now().strftime("%Y%m%d_%H%M%S")}.log',
    filemode='w'
)
logger = logging.getLogger(__name__)
# ==================== 授權(quán)管理 ====================
LICENSE_FILE = "license.json"
PUBLIC_KEY_FILE = "public.pem"
def get_machine_id():
    """ 獲取當(dāng)前設(shè)備的唯一標(biāo)識(CPU ID)"""
    try:
        if os.name == 'nt':
            machine_id = os.popen("wmic cpu get ProcessorId").read().split()[1]
            print('獲取當(dāng)前設(shè)備的唯一標(biāo)識:'+machine_id)
            return machine_id
        else:
            return os.popen("cat /etc/machine-id").read().strip()
    except:
        return "UNKNOWN"
def load_rsa_public_key():
    """ 加載 RSA 公鑰 """
    try:
        with open(PUBLIC_KEY_FILE, "rb") as f:
            return rsa.PublicKey.load_pkcs1(f.read())
    except Exception as e:
        logger.error(f"無法加載公鑰: {e}")
        messagebox.showerror("授權(quán)錯誤", "授權(quán)系統(tǒng)異常,無法加載公鑰")
        exit(1)
def verify_license():
    """ 驗證授權(quán)碼 """
    if not os.path.exists(LICENSE_FILE):
        messagebox.showerror("授權(quán)錯誤", "未找到授權(quán)文件,請聯(lián)系管理員")
        exit(1)
    try:
        with open(LICENSE_FILE, "r") as f:
            license_data = json.load(f)
        user = license_data.get("user")
        expire = license_data.get("expire")
        machine_id = license_data.get("machine_id")
        signature = base64.b64decode(license_data.get("signature"))
        if not all([user, expire, machine_id, signature]):
            messagebox.showerror("授權(quán)錯誤", "授權(quán)文件損壞")
            exit(1)
        # 校驗過期時間
        if datetime.strptime(expire, "%Y-%m-%d") < datetime.now():
            messagebox.showerror("授權(quán)錯誤", "授權(quán)已過期,請聯(lián)系管理員續(xù)費")
            exit(1)
        # 校驗機器碼
        if machine_id != get_machine_id():
            print(machine_id)
            print(get_machine_id())
            messagebox.showerror("授權(quán)錯誤", "設(shè)備不匹配,授權(quán)無效")
            exit(1)
        # 驗證簽名
        public_key = load_rsa_public_key()
        data_str = f"{user}|{expire}|{machine_id}".encode()
        try:
            rsa.verify(data_str, signature, public_key)
        except rsa.VerificationError:
            messagebox.showerror("授權(quán)錯誤", "授權(quán)碼無效或被篡改")
            exit(1)
        logger.info("授權(quán)驗證成功")
    except Exception as e:
        logger.error(f"授權(quán)驗證失敗: {e}")
        messagebox.showerror("授權(quán)錯誤", "授權(quán)文件無效")
        exit(1)

 5.將公鑰和授權(quán)json文件放在要授權(quán)的程序下

6.運行效果

python main.py
獲取當(dāng)前設(shè)備的唯一標(biāo)識:178B****F10

7.修改授權(quán)文件任性信息授權(quán)報錯

到此這篇關(guān)于python授權(quán)加密的文章就介紹到這了,更多相關(guān)python授權(quán)加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論