注册码加密方式

2021-10-21  本文已影响0人  一个摸鱼AI喵
image-20210810103357261-16285628389561.png

1.生成机器码

机器码生成规则:MD5(CPU序列号 + 主板序列号 + 硬盘序列号)

import os
import hashlib
def generate_machine_code(self):
    """
        生成机器码
        MD5(CPU序列号 + 主板序列号 + 硬盘序列号)
        :return machine_code: 机器码
        """
    # 获取CPU序列号
    cpu_id = os.popen("dmidecode -t 4 | grep ID").readline().replace('\tID:', '') \
    .replace('\n', '').replace(' ', '').upper()
    # 获取主板序列号
    board_id = os.popen("dmidecode -s system-serial-number").readline().replace('\n', '') \
    .replace(' ', '').upper()
    # 获取硬盘序列号
    disk_id = os.popen('fdisk -l | grep identifier').readline().replace('Disk identifier:', '') \
    .replace('\n', '').replace(' ', '').upper()
    if disk_id =='':  # 不能用None来判断
        print("English disk_id is None,search for chinese")
        disk_id = os.popen("fdisk -l | grep 磁盘标识符").readline().replace('磁盘标识符:', '').replace('\n', '').replace(' ', '').upper()   # 注意冒号也要改为中文
    # 拼接硬件序列号
    machine_id = cpu_id + board_id + disk_id
    # 硬件信息转MD5码,生成机器码
    m = hashlib.md5()
    m.update(machine_id.encode())
    machine_code = m.hexdigest()
    return machine_code

序列号样式:

cpu_id= 57060500FFFBEBBF
board_id= 4TPJJ33
disk_id= 5AF82805-4ACD-4E30-B242-1403A4499C3C

md5+encode后,machine_code为

aec8bd44dbd341e9d1e855b59e645724

问题1: cpu_id跟board_id无法获得

RUN apt-get install -y dmidecode

问题2: disk_id无法获得

由于容器或者宿主机有可能被汉化,故获取硬盘序列号的搜索可能为中文,如下:

root@photo_qa:/dev# fdisk -l
Disk /dev/sda:3.7 TiB,4000225165312 字节,7812939776 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
磁盘标识符:5AF82805-4ACD-4E30-B242-1403A4499C3C

设备          起点       末尾       扇区  大小 类型
/dev/sda1     2048       4095       2048    1M BIOS 启动
/dev/sda2     4096    2101247    2097152    1G Microsoft 基本数据
/dev/sda3  2101248 7812937727 7810836480  3.7T Linux LVM

2.生成公私钥

from Crypto import Random
from Crypto.PublicKey import RSA   # 注意Crypto安装为: pip install pycrypto==2.6.1

# 生成私钥

random_generator = Random.new().read
rsa = RSA.generate(3072, random_generator)
private_key = rsa.exportKey()
print(private_key)

# 生成公钥
public_key = rsa.publickey().exportKey()
print(public_key)

私钥:

b'-----BEGIN RSA PRIVATE KEY-----\n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\n-----END RSA PRIVATE KEY-----'

公钥:

b'-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA0kDu0ucQ11QfRyN8ujqa\nINBJjBL5oafpw6//kynAnP+x5sdiCUilGYfGVgbR5EbVvOpoYy+hBOSb1ugpx8kh\nT4OUEVH8Sc0uQTwb37AqD6aGkGtm7K6NHssgduxqZ7GsuftZYXqS+7jPLvNyd1Sv\nIVdmqTSTSYlXJlS7PuLJxjhM8/rDl5zFl8L4VIC+kRbR6M1BHQmc8/+cddKzJwNd\ncSdSDHQ54ZEReTCDYW2pg8Bxro+kORdkMrKE4nHwCttZBI3QtQxxV+NXX0jdAsSA\nOSi9eW/J7Xb2K3nKgSIhpcaK321nLdZy4j+xwagSO2Lx21LoLVoKsrs8YESs+UEb\nCIXOR5KAFu0b/9Vpfm9fSq81oc2/rjlVsDRsmUjR3hJLQdJHg6T2eLbIwhiSRsSk\npXt2EGmXJiafEizf6uKa1hmzef9QfoNVx39YlNuQEre08EcZnkwhe3cvhoyT7Nge\nRLvg/BP4dzV2jWmsd8DlopBzD5nBHv3C28qzLXxNiPsfAgMBAAE=\n-----END PUBLIC KEY-----'

3.生成注册码

注册码生成规则:RSA(机器码),使用公钥进行加密,私钥进行解密校验

import base64

from Crypto.Cipher import PKCS1_OAEP
from Crypto.PublicKey import RSA

def rsa_encrypt(message, public_key):
    """
    校验RSA加密 使用公钥进行加密
    :param message: 需要加密的信息
    :param public_key: 公钥
    :return encryption_text: 加密后的信息
    """
    cipher = PKCS1_OAEP.new(RSA.importKey(public_key))
    encryption_text = base64.b64encode(cipher.encrypt(message.encode())).decode()
    return encryption_text

if __name__ == '__main__':
    public_key = '''-----BEGIN PUBLIC KEY-----\nMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAy7AOgjAoWNFbP680sh8C\nODk/F5YV2E5EWG/HMJPyVVzW5r0hN+fQ5vxyik+6n+7dYDxBAzhWF7DyASQ6rRjM\nrG2my6win8tzwM+zddykfcxt75Vav05XvN/G+G12QZq8GK+TfbNyrjw7ol1+cOPe\nSHFwnuWzL9DltrH1I0VRp5pEhLamYxLJL4TRsKVk/gVKoj3cCo3CO6e0m9OamcLS\neDcinmIjWYg3z14Yrq5e7KmNTFgelZM9o0cFixr7r5MdWU+vQYxmkc2bNRBFOuDW\nBrbLK9j+XHzdt2ANqv9qLWVnUSBZh8pecx86TNQjjZ8Zi0S52XsOmpl6Bc1uyocu\nBIkmQ2N47VEFdwydo7p3ZD/BcJAU4rCz+at33WNdZRkQQIg2ATJqw+TF97zEHFFL\n5VfMWxUgLUTfaZnebxW6JH4ZK3HAxNU1sOZlZ3SCix4bi4+XghAFQ12YyczS7Sp7\nczzEkT7ESf8whUy2MDaCGnnGaofYYyYTpX3aFWAy2raNAgMBAAE=\n-----END PUBLIC KEY-----''
    machine_code = "70097b94a3ecaf54e9f83b78c40055f1" 
    license = rsa_encrypt(machine_code, public_key)
    print(license)

4.注册码验证

设置环境变量文件model.env,在文件中配置已经生成好的注册码

# License 配置
LICENSE_VALUE=oEZJv5IHpkn9AdEDHV5Wy5VZbOql6Mkrqjj4O6XXLjMo3ajdaw0ADPatfIo/NjOwTB0oOhBklQSTUxik1TS3RRaM/mdI6U8HfAZqcGRNSNGCS//ruJSkXJXkSeFloENDgZIMQkFJm2cGvX9NkqnoXbtmAA9WvOtLiAPxH76ANamaSgx8kgSYyapkeWMk1FinZ9UvS1u1IyQ4S3WThNOkadovbu4wzZmhWqXkIJDbksnkauI34cgKK2fcOSlscLY5/gRGUMs8CCdSyorj/thmVdSwpkTXYc1GwAmndZosJnUIvb64IL2VKDte4lPexvPo1Lp66TDwR2DhCuK2445cX2d9UXNAknU+tNr6PRAa0zCyzzL61LNYe9Gw/0eV8uxLPBw8W+uyHU28c3RrFDU9v70kZTngwFbKJLGnikdNYzDu1XWcfRAEnQ5hH1ial8vfF7NmlUaM9etl4pf3HrhU5qygfr5vL4Ex1k2dFjagINIEvYdfClSRFmpMwbKH4J+7

运行代码hardware_license.py,进行注册码验证

# -*- coding: utf-8 -*-

"""
@File : hardware_license.py
@Description : 硬件license加密验证
@Author: Candice Zhang
@Contact : zhangyao3622@163.com
@Time : 2021/3/14 上午11:31
@IDE: PyCharm Community Edition
@REFERENCE:

"""

import os
import hashlib
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64


class HardwareLicense(object):
    """
    硬件加密,生成机器注册码
    """
    def generate_machine_code(self):
        """
        生成机器码  需要安装 RUN apt-get install -y dmidecode
        MD5(CPU序列号 + 主板序列号 + 硬盘序列号)
        :return machine_code: 机器码
        """
        # 获取CPU序列号
        cpu_id = os.popen("dmidecode -t 4 | grep ID").readline().replace('\tID:', '') \
            .replace('\n', '').replace(' ', '').upper()
        # 获取主板序列号
        board_id = os.popen("dmidecode -s system-serial-number").readline().replace('\n', '') \
            .replace(' ', '').upper()
        # 获取硬盘序列号
        disk_id = os.popen('fdisk -l | grep identifier').readline().replace('Disk identifier:', '') \
            .replace('\n', '').replace(' ', '').upper()
        # 拼接硬件序列号
        machine_id = cpu_id + board_id + disk_id
        # 硬件信息转MD5码,生成机器码
        m = hashlib.md5()
        m.update(machine_id.encode())
        machine_code = m.hexdigest()
        return machine_code

    def rsa_encrypt(self, message, public_key):
        """
        校验RSA加密 使用公钥进行加密
        :param message: 需要加密的信息
        :param public_key: 公钥
        :return encryption_text: 加密后的信息
        """
        cipher = PKCS1_OAEP.new(RSA.importKey(public_key))
        encryption_text = base64.b64encode(cipher.encrypt(message.encode())).decode()
        return encryption_text

    def rsa_decrypt(self, license_value, private_key):
        """
        校验RSA加密 使用私钥进行解密
        :param license_value: 需要解密的信息
        :param private_key: 私钥
        :return decrypt_text: 解密后的信息
        """
        cipher = PKCS1_OAEP.new(RSA.importKey(private_key))
        decrypt_text = cipher.decrypt(base64.b64decode(license_value)).decode('utf-8')
        return decrypt_text

    def registration_code_verification(self):
        """
        注册码核验
        从环境变量中获取LICENCE_VALUE,用私钥解密,获取x1,将x1和机器码进行比对;
        :return verification_result: 核验结果
        """
        private_key = '''-----BEGIN RSA PRIVATE KEY-----\n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\n-----END RSA PRIVATE KEY-----
'''
        license_value = os.environ.get("LICENSE_VALUE")  #获取注册码
        machine_code = self.generate_machine_code()  # 从系统中生成机器码
        registration_code = self.rsa_decrypt(license_value, private_key)  #注册码解密
        if registration_code == machine_code:
            result = True  #校验通过
        else:
            result = False   #校验失败
        return result

if __name__ == '__main__':
    hl = HardwareLicense()
    result = hl.registration_code_verification()
    print(result)


5.Docker镜像启动引入环境变量文件

在启动docker镜像时,引入环境变量文件"--env-file /etc/envfile/model.env ", 此地址为宿主机地址

docker run --name name \
            --hostname hostname \
            -tid \
            --restart=on-failure:10 \
            --privileged \
            --env-file /etc/envfile/model.env \   
            -p 10001:5000 \
            name:v1.0.0 

--privileged 必须要有,不然获取不到cpu_id跟board_id,这两个信息在dev/mem中,没有此命令,将不创建此文件

上一篇下一篇

猜你喜欢

热点阅读