最近在做一个python方面的加密项目, 公司要求对加密系统的密钥进行加强保护,目前比较好的方法是混合加密系统 或者PBE 加密系统,前者是使用非对称算法加密密钥,后者一般还是用对称算法加密密钥.
基于口令的密码(PBE),就是一种根据口令生成密钥并用该密钥进行加密的密钥保护方法,其特点在于口令由用户自己掌管,只有合法用户才可以拥有口令信息。它采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性,是一种被广泛应用的密钥加密方法。
利用python 实现一个基于PBE的加密系统,核心是一个加密脚本和解密加载模块的钩子:
针对项目特点变通了传统的保护方案:首先对于每个合法用户,分发产品加密模块代码时会分配给他一个合法的产品使用序列号,将这个序列号经过单向散列函数处理后得到口令,产生序列号的程序仅在服务端使用,在分发给用户时,用户会得到这样一个序列号文件。盐是由随机数发生器产生,产生随机数的种子可以约定为服务器IP地址拼接加上序列号称组成的信息,在钩子程序中解密之前根据约定好的规则生成随机数种子然后再产生盐。
加密过程:
初步设计方案使用Blowfish算法作为加密密文的算法,使用AES算法加密密钥,具体步骤如下:
1) 生成密钥:服务器端使用加密脚本对zip 包中每个文件生成随机不同的对称算法密钥CEK,然后用blowfish算法加密.
2) 加密密钥:使用随机数生成器生成盐,序列号生成程序产生用户的序列号信息输入单向散列函数得到口令信息,再将盐和口令输入到单向散列函数得到散列值,为了加强安全性,将得到的散列值再次输入单向散列函数(使用MD5),经过5至10次单向散列函数(使用SHA-256)得到的值作为加密密钥的密钥KEK来使用,使用KEK对所有的会话密钥进行加密。
3) 保存加密密钥 : 将产生盐的随机数种子信息隐藏在钩子程序中,编译成.so文件
解密过程:
1) 提取加密密钥:读取用户的序列号文件信息,将它输入到之前约定的相同的单向散列函数中得到口令信息,再根据随机数种子信息生成盐,将盐和口令信息输入到单向散列函数重新生成KEK对加密后的会话密钥进行解密得到密钥。
2) 解密密钥:AES对称加密算法使用提取KEK解析密文使用的密钥CEK。
3) 解密密文:blowfish使CEK密钥对密文在内存中进行解密得到明文,然后进行加载。