[本文出自天外归云的博客园]
自用加盐代码如下:
# coding:utf-8 import uuid from functools import reduce def salt(num): if num<33333: num = 3*(num+3) num = salt(num) return num def encrypt(_str,password): keys = [] for char in _str: if char.isalpha(): key = ord(char)-96 else: key = salt(ord(char)) keys.append(str(key)) return password.join(keys) def dec_mac(get_mac_address): def wrapper(password): password = str(password) return str(reduce(lambda x, y: x*y,[int(one)*3 for one in encrypt(password,password).join(encrypt(get_mac_address(),password)) if int(one)!=0])).strip("0") return wrapper @dec_mac def get_mac_address(): mac=uuid.UUID(int = uuid.getnode()).hex[-12:] ret = ":".join([mac[e:e+2] for e in range(0,11,2)]) return ret.lower() if __name__ == '__main__': key = "kdfhb234kus3" salt_mac = get_mac_address(encrypt(key,"3")) with open("cipher","w") as cipher: cipher.write(salt_mac)
造盐函数,将盐输出到本地cipher文件。
查盐函数,读取cipher文件中的盐并校验,如果和造盐函数产出的盐不一样,则返回False:
def check_salt(): key1 = "dkfjasdlkfj" key2 = "5" salt_mac = get_mac_address(encrypt(key1,key2)) root_path = os.path.dirname(os.path.dirname(__file__)) cipher_path = os.path.join(root_path,"cipher") with open(cipher_path,"r") as cipher: content = cipher.read() if content != salt_mac: return False
用途:本盐是用来与mac地址绑定的,加盐的目的是对程序进行mac地址绑定,非指定机器不能运行。在客户端生成加盐文件后删除加盐程序,程序在该客户端可以运行,在其他客户端不可以运行。
关键:加盐器中的key和查盐器中的key要对上才能返回True,所以即使知道加盐的逻辑不知道查盐函数中的key也是不行的。所以要对查盐函数的代码想通过转编译、复杂逻辑等方法进行保护。如果逆向成本高于正向成本,保护基本可以认为是有效的。