AES key moved in config file generate“AES key必须是16、24或32字节长”

2024-04-27 22:40:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用python,flask。我用AES加密。它很好用,我加密和解密数据很容易。 为了保护加密密钥,我将加密密钥从配置文件的app表单中移走。首先我在一个配置文件中保存了一个变量,在config.cfg中声明了ENCRYPTION_KEY。在

[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文件中我声明:

^{pr2}$

我试图从key = flask.config['ENCRYPTION_KEY']访问它。我在控制台中打印key只是为了确保命令正常工作:

def encrypt_data(self, form_data):
        key = current_app.config['ENCRYPTION_KEY']
        print "KEY : " , key
        cipher = AES.new(key)
        //code...

控制台中的按键打印: console

现在,当我试图从配置文件中使用这个密钥时,我有一个错误消息: AES error

这条消息之所以出现是因为我在配置文件中移动了那个键,因为正如我之前所说,我对相同的方法使用了相同的键,而且它工作得很好? 有谁能帮我,为什么我会犯这个错误?在


Tags: keyconfigapp声明消息flaskdata配置文件
1条回答
网友
1楼 · 发布于 2024-04-27 22:40:03

您使用的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字符串。因为config值包含反斜杠转义序列,所以这些反斜杠用附加反斜杠转义。这将中断\x字符序列,然后该序列将爆炸为4个字符。在

最简单的方法是使用Flask的配置文件:

配置.cfg

^{pr2}$
>>> 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的配置文件,您的选项是(按优先顺序):

  • 使用^{}将原始字符串安全地转换为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')
    
  • 使用^{}将原始字符串转换为Python字符串:

    app.config['ENCRYPTION_KEY'] = eval(config.get('Encryption', 'ENCRYPTION_KEY'))
    

    尽管这被认为是不好/危险的做法,但最好使用literal_eval()或base64编码。

  • {p>将pr}存储在二进制文件中$

    但这很难维持。

相关问题 更多 >