【发布时间】:2019-04-24 21:50:46
【问题描述】:
我有一个读取配置文件的 python 应用程序。我需要加密配置文件,所以它在磁盘上不是普通的。然后我需要在我的应用程序中解密它并读取值。我看到有一个库 Secureconfig 但它仅适用于 python 2。python 中是否有类似的库可以帮助我做到这一点?
【问题讨论】:
标签: python encryption configuration-files
我有一个读取配置文件的 python 应用程序。我需要加密配置文件,所以它在磁盘上不是普通的。然后我需要在我的应用程序中解密它并读取值。我看到有一个库 Secureconfig 但它仅适用于 python 2。python 中是否有类似的库可以帮助我做到这一点?
【问题讨论】:
标签: python encryption configuration-files
由于您的程序必须包含解密密钥,因此您将无法保护确定的用户的数据,只会使解密变得更加困难。
根据Cryptographic Services — Python 3.7.3 documentation,Python 不包含任何开箱即用的真正密码。只有 codecs 具有 Caesar's cipher 和标准编码,可以像 UUEncode 和 Base64 那样可恢复地破坏数据。
因此,如果以上内容对您来说还不够好,您需要自己实现对称密码或使用库。参见例如Python AES encryption without extra module.
由于这里不可能实现真正的安全性,因此取决于您想为黑客用户制作它的难度将是security through obscurity:使用非标准密码,不要一次解密所有文件,制作很多加密/解密发生的不同位置,使用混淆代码,添加隐藏校验和以防止篡改,使用存储在其他意外位置的文件之外的数据位等。
如果您只是想让普通用户无法理解文件,那么在使用文本编辑器查看时,像 Base64 与 XOR cipher 的组合已经使数据完全无法理解。
【讨论】:
@H.Z. - 正如 Ivan 指出的那样,有许多选项取决于您想要的安全级别。
我正在从事与您所描述的类似的项目,并且我正在使用 cryptogrophay 库 (https://cryptography.io/en/latest/)
您可以使用 pip 轻松安装它。
我在一步过程中使用它来加密我的配置文件 - 然后在我的主 Python 文件中使用单独的脚本来解密。解密脚本将包含从加密脚本生成的密钥。
如果您尚未解决此问题,希望此信息对您有所帮助。
【讨论】:
打算稍微挖掘一下这个线程。 我编写了一个 ConfigParser 继承类,它将 AES-256 对称加密添加到 ConfigParser 配置文件。 该类本身及其底层加密已经为几个项目投入生产,并且经过了很好的测试。
用法与 ConfigParser 非常相似,不同之处在于您使用 AES 密钥并编写二进制文件而不是文本。
使用pip install configparser_crypt安装
如何使用 ConfigParserCrypt 创建加密的 ini 文件
from confiparser_crypt import ConfigParserCrypt
file = 'config.encrypted'
conf_file = ConfigParsercrypt()
# Create new AES key
conf_file.generate_key()
# Don't forget to backup your key somewhere
aes_key = conf_file.aes_key
# Use like normal configparser class
conf_file.add_section('TEST')
conf_file['TEST']['foo'] = 'bar'
# Write encrypted config file
with open(file, 'wb') as file_handle:
conf_file.write_encrypted(file_handle)
如何读取加密的ini文件
from confiparser_crypt import ConfigParserCrypt
file = 'config.encrypted'
conf_file = ConfigParsercrypt()
# Set AES key
conf_file.aes_key = my_previously_backed_up_aes_key
# Read encrypted config file
conf_file.read_encrypted(file)
print(conf_file['TEST']['foo'])
【讨论】: