Password-protected secrets made easy.
Project description
Privy is a small and fast utility for password-protecting secrets such as seeds for digital signatures or Bitcoin wallets.
Usage
>>> import privy
>>>
>>> secret = b'secret'
>>> password = 'foo'
>>>
>>> hidden = privy.hide(secret, password)
>>> hidden
'1$2$c016b66bd5...'
>>>
>>> privy.peek(hidden, password)
b'secret'
Installation
Privy is available on Linux/macOS and Windows and supports Python 2.7, 3.3+, PyPy, and PyPy3.3-5.5+.
$ pip install privy
Encryption scheme
Secrets are encrypted using the Fernet protocol. Specifically, it uses AES for encryption and has built-in authentication using HMAC. The private key used for encryption is derived from the password using a key derivation function. The key derivation function used is Argon2, the winner of the Password Hashing Competition. Both Argon2i and Argon2d variants are supported.
Secrets encrypted with default settings are unicode strings of length 185.
Encrypted format
ascii(Argon2 algorithm || security level || base64(salt) || base64(Fernet token))
API
There are 2 functions: hide and peek.
hide(secret, password, security=2, salt=None, server=True)
Encrypts secret using password. Returns the hidden secret as unicode.
Parameters
secret (bytes) - The secret to encrypt.
password (bytes or unicode) - The password used to access the secret.
security (int) - A number 0-10 inclusive. Higher values are more secure at the cost of slower computation and greater use of memory. See security levels.
salt (bytes) - The salt used for the password hash. Defaults to os.urandom(32).
server (bool) - If True, it is assumed side-channel attack protection is needed and therefore the Argon2i algorithm will be used. Otherwise, the password will be hashed using the Argon2d algorithm.
Security levels
All expected times were taken from tests on an Intel Core i7-2670QM @ 2.2 GHz.
Levels |
Argon2 settings |
Expected time |
Notes |
---|---|---|---|
0 |
m=8 KiB, t=1 |
600 usec |
Lowest possible |
1 |
m=4 MiB, t=10 |
50 msec |
|
2 |
m=8 MiB, t=10 |
100 msec |
Default |
3 |
m=32 MiB, t=10 |
350 msec |
|
4 |
m=48 MiB, t=10 |
550 msec |
|
5 |
m=96 MiB, t=10 |
1.1 sec |
Good choice |
6 |
m=256 MiB, t=10 |
3 sec |
|
7 |
m=448 MiB, t=10 |
5.3 sec |
|
8 |
m=768 MiB, t=10 |
9.1 sec |
|
9 |
m=1 GiB, t=10 |
12.2 sec |
|
10 |
m=2 GiB, t=20 |
48 sec |
Lots of RAM |
Breaking changes
As of Privy 2.0.1, due to requests, the encrypted format uses url-safe base64 instead of hex.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file privy-2.0.1-py2.py3-none-any.whl
.
File metadata
- Download URL: privy-2.0.1-py2.py3-none-any.whl
- Upload date:
- Size: 12.1 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5b2fd0793d42c72ee16e8434fd3abedee0e69abfc995165527a340f931722a5d |
|
MD5 | 8b6d22fe035e432d747772d10441c959 |
|
BLAKE2b-256 | 2d3e7ae1b42708f450a7bd43d387ed0b306ececc18ef55bf54eb2a177e62ceda |