加密文件密钥环后端
keyrings.cryptfile的Python项目详细描述
摘要
用于 keyring包。
说明
该项目的主要目标是为纯文本提供足够安全的存储 密码(keyring)在一个简单的可移植文件中,其中默认的keyring存储 普通桌面环境的实现不适合。
加密
密钥环使用密钥环密码进行保护。生的
Argon2($argon2id$v=19$m=65536,t=15,p=2)
哈希是从keyring生成的
密码,它用作加密
支持的经过身份验证的AES加密方案(ccm、eax、gcm、ocb),其中
GCM是默认值。生成的加密数据与
argon2盐,nonce和mac。此值与服务/userid引用一起存储
在文本文件(.ini格式)中。服务/用户id被视为
用于MAC计算的关联数据。
最初,还存储了一个静态引用值,作为密码处理, 此值用于在随后的 进入。
攻击面
静态参考值允许某种形式的攻击,因为它加密了一口井 已知值。希望argon2散列与经过身份验证的aes结合起来 加密方案加大了破解密钥的力度。
argon2参数化是以一种方式选择的,即通常的桌面和服务器 从今天(2017年)起,系统必须处理大量的CPU和内存负载 为了计算散列,这使得暴力攻击不切实际。
经过身份验证的aes加密方案防止篡改加密的 数据及其引用(service/userid)。
快速入门指南
为了让您开始,您需要有一个python3
环境
以及git
可用(最好在Linux系统上)。
您可能需要提供python包argon2-cffi、keyring、pycryptodome
以及它们与
系统包管理,或使用本地venv,但这将取决于
正确运行c编译器并安装了一些开发包
(至少python-devel
和openssl-devel
)。
安装包和环境
$ git clone https://github.com/frispete/keyrings.cryptfile
$ cd keyrings.cryptfile
$ pyvenv env
$ . env/bin/activate
(env) $ pip install -e .
最后一个命令应该成功,没有错误,一些开发包可能 否则就会失踪。
示例会话
创建加密的密钥环,并将测试密码存储到其中。过程要求 对于keyring密码本身,它可以保护存储的keyring值。
(env) $ python3
Python 3.4.5 (default, Jul 03 2016, 12:57:15) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from keyrings.cryptfile.cryptfile import CryptFileKeyring
>>> kr = CryptFileKeyring()
>>> kr.set_password("service", "user", "secret")
Please set a password for your new keyring: ******
Please confirm the password: ******
>>> ^d
现在再次从钥匙圈中检索存储的秘密:
(env) $ python3
Python 3.4.5 (default, Jul 03 2016, 12:57:15) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from keyrings.cryptfile.cryptfile import CryptFileKeyring
>>> kr = CryptFileKeyring()
>>> kr.get_password("service", "user")
Please enter password for encrypted keyring: ******
'secret'
>>> ^d
注意,kdf将{set,get}_password()
操作延迟了几秒钟
(~1秒。在一个有能力的系统上)。
结果
生成的文件可能类似于:
(env) $ cat ~/.local/share/python_keyring/cryptfile_pass.cfg
[keyring_2Dsetting]
password_20reference =
eyJtYWMiOiAiWmVHU2lBalZ5WHd6Vmg3K2Z6TGx2UT09IiwgIm5vbmNlIjogIjB0b2dKa3RYdmdY
TVpEU1F1QkFOZFE9PSIsICJzYWx0IjogInZ2dFYzN2JvWnVLRTQzVHJ6dGd6YVE9PSIsICJkYXRh
IjogIk1UdnRzYUZ6OHdSaUZYbFBHOWZmL2dQZ0dmL3ROOG05In0=
scheme = [Argon2] AES128.GCM
version = 1.0
[service]
user =
eyJtYWMiOiAiaTJ4MWhNVGJ1S0pTZExYSXQwR0dqUT09IiwgIm5vbmNlIjogIlJ5YU1DZmkyZ0JE
NStlNHN6MGpQRWc9PSIsICJzYWx0IjogIjlIM1hJbDVhZmRZaVhkTUZyTWNOV2c9PSIsICJkYXRh
IjogImhNVC9LaTRYIn0=
这些值可以如下解码:
(env) $ python3
>>> import base64
>>> base64.decodebytes(b"""
... eyJtYWMiOiAiaTJ4MWhNVGJ1S0pTZExYSXQwR0dqUT09IiwgIm5vbmNlIjogIlJ5YU1DZmkyZ0JE
... NStlNHN6MGpQRWc9PSIsICJzYWx0IjogIjlIM1hJbDVhZmRZaVhkTUZyTWNOV2c9PSIsICJkYXRh
... IjogImhNVC9LaTRYIn0=""")
b'{"mac": "i2x1hMTbuKJSdLXIt0GGjQ==",
"nonce": "RyaMCfi2gBD5+e4sz0jPEg==",
"salt": "9H3XIl5afdYiXdMFrMcNWg==",
"data": "hMT/Ki4X"}'
讨论
json dict的项构成加密参数和值。在
理论上,它应该足够hard返回到
data不知道密码。由于价值观的关联
引用(service
和user
)经过身份验证的加密,
对参考值的修改也会被检测/拒绝。
类层次结构是从keyrings.alt项目继承的,它不是 很容易理解。最有趣的部分是 keyrings/cryptfile/cryptfile.py,它本身非常简洁,即使您 不精通python。
为了进一步控制这个过程,您可能需要
CryptFileKeyring
和/或PlaintextKeyring
。
您可以通过以下方法避免对keyring密码的交互式getpass()请求 在调用任何其他 钥匙圈上的方法。