我正在使用python,flask。我正在使用AES进行加密。它运行良好,我轻松地加密和解密数据。
为了保护加密密钥,我从配置文件中的app表单移动了我的加密密钥。首先我在配置文件中保存了一个变量,我在ENCRYPTION_KEY
中声明了config.cfg
。
[Encryption]
ENCRYPTION_KEY = b'\xbf\xc0\x85)\x10nc\x94\x02)j\xdf\xcb\xc4\x94\x9d(\x9e[EX\xc8\xd5\xbfI{\xa2$\x05(\xd5\x18'
然后在init文件中声明:
app.config['ENCRYPTION_KEY'] = config.get('Encryption', 'ENCRYPTION_KEY')
我尝试从key = flask.config['ENCRYPTION_KEY']
访问它。我在控制台中打印密钥只是为了确保该命令有效:
def encrypt_data(self, form_data):
key = current_app.config['ENCRYPTION_KEY']
print "KEY : " , key
cipher = AES.new(key)
//code...
此消息的出现只是因为我在配置文件中移动了该键,因为正如我之前所说的,我使用相同的密钥进行相同的方法并且它完美地工作? 任何人都可以帮助我,为什么我会收到这个错误?
答案 0 :(得分:2)
您使用ConfigParser
模块是导致问题的原因。鉴于显示的配置文件:
>>> config.get('Encryption', 'ENCRYPTION_KEY')
"b'\\xbf\\xc0\\x85)\\x10nc\\x94\\x02)j\\xdf\\xcb\\xc4\\x94\\x9d(\\x9e[EX\\xc8\\xd5\\xbfI{\\xa2$\\x05(\\xd5\\x18'"
>>> len(config.get('Encryption', 'ENCRYPTION_KEY'))
92
您可以在此处看到ConfigParser
只返回与给定配置变量关联的值 text ,而不是Python字符串。因为配置值包含反斜杠转义序列,所以这些反斜杠会使用额外的反斜杠进行转义。这会打破\x
个字符序列,然后吹出4个字符。
最简单的方法是使用Flask的配置文件:
的config.cfg
ENCRYPTION_KEY = b'\xbf\xc0\x85)\x10nc\x94\x02)j\xdf\xcb\xc4\x94\x9d(\x9e[EX\xc8\xd5\xbfI{\xa2$\x05(\xd5\x18'
>>> import flask
>>> app = flask.Flask('test')
>>> app = flask.Flask('')
>>> app.config.from_pyfile('config.cfg')
True
>>> app.config['ENCRYPTION_KEY']
'\xbf\xc0\x85)\x10nc\x94\x02)j\xdf\xcb\xc4\x94\x9d(\x9e[EX\xc8\xd5\xbfI{\xa2$\x05(\xd5\x18'
>>> len(app.config['ENCRYPTION_KEY'])
32
如果您不想使用Flask的配置文件,您的选项(按优先顺序):
使用ast.literal_eval()
将原始字符串安全地转换为Python字符串:
from ast import literal_eval
app.config['ENCRYPTION_KEY'] = literal_eval(config.get('Encryption', 'ENCRYPTION_KEY'))
Base64对配置文件中的值进行编码,例如
[Encryption] ENCRYPTION_KEY = v8CFKRBuY5QCKWrfy8SUnSieW0VYyNW/SXuiJAUo1Rg=
然后在您访问密钥时对其进行解码:
app.config['ENCRYPTION_KEY'] = config.get('Encryption', 'ENCRYPTION_KEY').decode('base64')
使用eval()
将原始字符串转换为Python字符串:
app.config['ENCRYPTION_KEY'] = eval(config.get('Encryption', 'ENCRYPTION_KEY'))
虽然这被认为是不好/危险的做法,但您最好使用literal_eval()
或base64编码。
将密钥存储为文件中的二进制值:
[Encryption] ENCRYPTION_KEY = ¿À<85>)^Pnc<94>^B)jßËÄ<94><9d>(<9e>[EXÈÕ¿I{¢$^E(Õ^X
但这很难维持。