使用繁體中文,在w11下,使用python語言,打包成單一執行檔,要如何利用建立key來管理檔案使用期限?
在 Windows 11 下,使用 Python 打包成單一執行檔並管理檔案的使用期限,可以透過幾個步驟來達成。以下是如何使用密鑰 (Key) 來管理檔案的使用期限的基本方法:
首先,你需要將 Python 程式打包成單一執行檔,可以使用 pyinstaller。以下是安裝和使用 pyinstaller 的步驟:
安裝 pyinstaller:
bash
複製程式碼
pip install pyinstaller
打包程式成單一執行檔:
bash
複製程式碼
pyinstaller --onefile your_script.py
這樣會生成一個可執行的 .exe 檔案,位於 dist 資料夾內。
為了控制檔案的使用期限,你可以利用一些方法來產生並驗證密鑰。這些密鑰可以基於當前的日期來限制程式的有效期。
2.1 產生密鑰的基本方法
可以使用當前日期來生成一個密鑰,並將這個密鑰寫入到你的程式內,程式啟動時檢查這個密鑰來確定是否過期。
python
複製程式碼
import hashlib
import datetime
# 產生一個簡單的密鑰,基於當前的日期
def generate_key():
today = datetime.date.today()
date_str = today.strftime('%Y%m%d') # 使用日期作為密鑰的一部分
key = hashlib.sha256(date_str.encode()).hexdigest() # 用SHA-256產生密鑰
return key
# 設定過期日期
def is_key_expired(key, expiration_date):
# 取得當前日期
today = datetime.date.today()
if today > expiration_date:
return True
return False
# 主程序
if __name__ == "__main__":
# 設定過期日期
expiration_date = datetime.date(2024, 12, 31)
# 產生密鑰
key = generate_key()
print(f"Generated key: {key}")
# 檢查密鑰是否過期
if is_key_expired(key, expiration_date):
print("The key has expired.")
else:
print("The key is valid.")
在這個範例中,我們使用 datetime.date.today() 來獲得當前日期,並將其轉換為字串,再用 SHA-256 加密算法來產生密鑰。你也可以將過期日期設定為任意時間。
2.2 產生和儲存密鑰
可以將這個密鑰儲存為檔案或直接嵌入到程式中。在程式啟動時,讀取這個密鑰並檢查其有效性。如果密鑰過期,可以讓程式終止或顯示錯誤訊息。
當你執行這個程式時,可以檢查用戶輸入的密鑰或檢查程式內嵌的密鑰是否有效。
以下是如何讓程式檢查並驗證密鑰過期的方法:
python
複製程式碼
import hashlib
import datetime
# 假設這是用戶輸入的密鑰
user_input_key = input("Please enter the key: ")
# 產生預設的密鑰
def generate_key():
today = datetime.date.today()
date_str = today.strftime('%Y%m%d')
key = hashlib.sha256(date_str.encode()).hexdigest()
return key
# 檢查密鑰是否過期
def is_key_expired(expiration_date):
today = datetime.date.today()
if today > expiration_date:
return True
return False
# 主程序
if __name__ == "__main__":
expiration_date = datetime.date(2024, 12, 31) # 設定過期日期
generated_key = generate_key()
# 檢查用戶輸入的密鑰是否與預設密鑰匹配,並檢查是否過期
if user_input_key == generated_key:
if is_key_expired(expiration_date):
print("The key has expired.")
else:
print("The key is valid.")
else:
print("Invalid key.")
在這個範例中,使用者需要輸入一個密鑰,然後程式會檢查該密鑰是否與預設的密鑰相符,並進一步檢查密鑰是否過期。
當你打包成單一執行檔後,程式內嵌的密鑰會依然有效。使用者無法輕易修改程式碼或過期日期來繞過過期檢查,這可以有效防止未經授權的使用。
這樣,你就能夠根據當前日期或設定的到期日期,利用密鑰來管理程式的使用期限。
使用 pyinstaller 將 Python 程式打包成單一執行檔。
利用 datetime 模組和 hashlib 生成基於日期的密鑰。
在程式中驗證密鑰是否有效以及是否過期。
這樣就能有效地控制程式的使用期限,並且能夠保護你的軟體不被非法使用。
當然,除了簡單的基於日期的密鑰驗證之外,還有一些更進階的方式來增強你程式的安全性、加密保護和使用期限管理。以下是一些進一步的方法,能夠提升你的應用程式的保護:
你可以讓密鑰與特定的硬體設備(例如,CPU 的序號、硬碟的序號、網路卡的 MAC 地址等)綁定。這樣,即使有人嘗試複製你的程式,密鑰也會因為硬體變化而無效。
1.1 硬體識別方法(如 MAC 地址)
例如,你可以通過 psutil 或 uuid 等 Python 模組來獲取系統的唯一識別碼。
python
複製程式碼
import psutil
import hashlib
import datetime
import uuid
# 獲取硬體識別碼(這裡使用 MAC 地址作為例子)
def get_mac_address():
mac = None
for interface, addrs in psutil.net_if_addrs().items():
for addr in addrs:
if addr.family == psutil.AF_LINK:
mac = addr.address
break
return mac
# 生成與硬體綁定的密鑰
def generate_key():
mac_address = get_mac_address()
today = datetime.date.today()
date_str = today.strftime('%Y%m%d') # 日期部分
unique_str = f"{mac_address}{date_str}"
key = hashlib.sha256(unique_str.encode()).hexdigest() # SHA-256 生成硬體綁定的密鑰
return key
# 主程式
if __name__ == "__main__":
expiration_date = datetime.date(2024, 12, 31)
user_input_key = input("Please enter the key: ")
generated_key = generate_key()
if user_input_key == generated_key:
if datetime.date.today() > expiration_date:
print("The key has expired.")
else:
print("The key is valid.")
else:
print("Invalid key.")
這樣,密鑰不僅基於日期生成,還與設備的 MAC 地址(或其他硬體屬性)綁定,這樣即使密鑰被偷取,也無法在其他設備上使用。
使用對稱加密(例如 AES 加密)來保護密鑰和敏感資料。將密鑰加密存儲在程式內部,在需要時解密並驗證。
2.1 使用 cryptography 庫來加密密鑰
你可以使用 cryptography 库來加密存儲密鑰或其它敏感資料,從而提升程式的安全性。
bash
複製程式碼
pip install cryptography
2.2 加密密鑰的範例
python
複製程式碼
from cryptography.fernet import Fernet
import datetime
import hashlib
# 生成對稱加密密鑰
def generate_fernet_key():
return Fernet.generate_key()
# 使用對稱密鑰加密密鑰
def encrypt_key(key, fernet_key):
f = Fernet(fernet_key)
encrypted_key = f.encrypt(key.encode())
return encrypted_key
# 解密加密的密鑰
def decrypt_key(encrypted_key, fernet_key):
f = Fernet(fernet_key)
decrypted_key = f.decrypt(encrypted_key).decode()
return decrypted_key
# 生成並加密密鑰
def generate_and_encrypt_key():
today = datetime.date.today()
date_str = today.strftime('%Y%m%d')
key = hashlib.sha256(date_str.encode()).hexdigest()
fernet_key = generate_fernet_key()
encrypted_key = encrypt_key(key, fernet_key)
return encrypted_key, fernet_key
# 主程式
if __name__ == "__main__":
expiration_date = datetime.date(2024, 12, 31)
encrypted_key, fernet_key = generate_and_encrypt_key()
# 模擬用戶輸入密鑰
user_input_key = input("Please enter the key: ")
# 解密密鑰
decrypted_key = decrypt_key(encrypted_key, fernet_key)
if user_input_key == decrypted_key:
if datetime.date.today() > expiration_date:
print("The key has expired.")
else:
print("The key is valid.")
else:
print("Invalid key.")
這樣即便有使用者能夠破解執行檔,也無法直接取得密鑰,因為密鑰是加密的,並且需要特定的解密密鑰才能還原。
如果你希望更高級的密鑰驗證與使用期限管理,可以考慮建立一個線上授權系統,這樣你可以在伺服器端管理所有的密鑰和使用期限,並在每次啟動程式時與伺服器進行驗證。
3.1 網路授權的基本原理
當使用者執行程式時,程式會向伺服器發送請求(例如:包含密鑰、硬體信息、IP 地址等)。
伺服器驗證密鑰是否有效,並回應結果(如是否過期、是否被禁用等)。
根據伺服器回應,程式決定是否繼續執行或退出。
3.2 實現方式
你可以使用 requests 模組與伺服器進行通信。以下是一個簡單的例子:
bash
複製程式碼
pip install requests
python
複製程式碼
import requests
import json
def check_key_online(user_key):
server_url = "https://your-authorization-server.com/validate"
data = {"key": user_key}
response = requests.post(server_url, data=json.dumps(data), headers={"Content-Type": "application/json"})
if response.status_code == 200:
result = response.json()
if result["status"] == "valid":
print("The key is valid.")
else:
print("The key is invalid or expired.")
else:
print("Error: Unable to contact the server.")
if __name__ == "__main__":
user_input_key = input("Please enter the key: ")
check_key_online(user_input_key)
這樣,你的程式不再只是依賴本地密鑰,而是依賴伺服器進行動態授權。這不僅能增強安全性,還能方便地管理用戶和過期日期。
你可以讓你的程式定期檢查是否已經過期,並提醒用戶更新密鑰。這樣可以減少用戶因為忘記更新密鑰而造成的問題。
4.1 提示用戶更新密鑰
你可以在程式過期前提示用戶,並提供一個更新途徑。
python
複製程式碼
import time
def check_and_notify_expiration():
expiration_date = datetime.date(2024, 12, 31)
today = datetime.date.today()
if today >= expiration_date:
print("Your key has expired. Please contact support to get a new key.")
else:
days_left = (expiration_date - today).days
print(f"Your key is valid. {days_left} days left until expiration.")
if __name__ == "__main__":
while True:
check_and_notify_expiration()
time.sleep(86400) # 每日檢查一次
進一步的方法可以顯著增加程式的安全性和防止非法使用,包括:
硬體綁定:使密鑰與特定硬體設備綁定。
加密保護:加密敏感資料和密鑰,防止破解。
網路授權系統:利用伺服器驗證密鑰的有效性,進行動態授權。
定期檢查:定期檢查程式的有效期,並提示用戶更新。
這些方法可以幫助你管理和保護應用程式,確保其安全性。