在配置文件中移动的AES密钥生成“AES密钥必须是16,24或32字节长”错误

时间:2015-08-10 11:56:16

标签: python encryption configuration flask aes

我正在使用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...

在控制台键中打印: console

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

此消息的出现只是因为我在配置文件中移动了该键,因为正如我之前所说的,我使用相同的密钥进行相同的方法并且它完美地工作? 任何人都可以帮助我,为什么我会收到这个错误?

1 个答案:

答案 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

    但这很难维持。

相关问题