加密文件密钥环后端

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-cffikeyringpycryptodome 以及它们与 系统包管理,或使用本地venv,但这将取决于 正确运行c编译器并安装了一些开发包 (至少python-developenssl-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不知道密码。由于价值观的关联 引用(serviceuser)经过身份验证的加密, 对参考值的修改也会被检测/拒绝。

类层次结构是从keyrings.alt项目继承的,它不是 很容易理解。最有趣的部分是 keyrings/cryptfile/cryptfile.py,它本身非常简洁,即使您 不精通python。

为了进一步控制这个过程,您可能需要 CryptFileKeyring和/或PlaintextKeyring

您可以通过以下方法避免对keyring密码的交互式getpass()请求 在调用任何其他 钥匙圈上的方法。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
基于Java的遗传算法确定最优交易行为   java改型2.0无法解析Json嵌套对象   java在数组中查找最大额定值(数字),我们不能跳过数组中的一个或多个连续数字   java在spring boot中从命令行设置活动概要文件和配置位置   JavaAxis2:传输错误:404错误:未找到帮助理解其真正含义   java使用Play2WAR和Play2.2.1   java理解函数运算符:Lambda   在代理java后面读取https网页数据   java应用程序。Android单元测试中的类mock   java为什么onClick布局XML引用的方法需要是公共的?   从SMTLIB2文件解析的java显示声明   java重写给定的类以使用组合而不是继承   HTMLUnit和Java:NoSuchMethodException:createDefaultSSLContext()   java如何使用Spring和ThymeLeaf从前端正确更新后端中的对象?   来自init()Java的方法调用   使用cellrendering从数据库向JTable动态添加数据后,java无法使用JTable执行排序操作   java Android Studio 1.5.1。渲染错误(浮动操作按钮)   web服务如何使用UsenameToken和PasswordDigest为JAVA中的SOAP客户端附加wsse安全头   java为什么要在局部变量和myApplicationClass中同时删除“ArrayList.remove”?