Skip to main content

Scrypt for Python

Project description

Scrypt for Python
=================

There are a lot of different scrypt modules for Python, but none of them
have everything that I'd like, so here's One
More\ `1 <https://xkcd.com/927/>`__.

Features
--------

- Uses system libscrypt\ `2 <https://github.com/technion/libscrypt>`__
as the first choice.
- If that isn't available, tries the scrypt Python
module\ `3 <https://bitbucket.org/mhallin/py-scrypt/src>`__ or
libsodium\ `4 <https://github.com/jedisct1/libsodium>`__.
- Offers a pure Python scrypt implementation for when there's no C
scrypt.
- Not unusably slow, even in pure Python... at least with
pypy\ `5 <http://pypy.org/>`__.

With PyPy as the interpreter the Python implementation is around one
fifth the speed of C scrypt. With CPython it is between about 50x and
250x slower.

Requirements
------------

- Python 2.7 or 3.4 or so. Pypy 2.2 also works. Older versions may or
may not.
- If you want speed, you should use one of:
- libscrypt 1.8+ (older may work)
- py-scrypt 0.6+ (pip install scrypt)
- libsodium 0.6+

Usage
-----

You can install the most recent release from PyPi using:

::

pip install pylibscrypt

You most likely want to create MCF hashes and store them somewhere, then
check user-entered passwords against those hashes. For that you only
need to use two functions from the API:

::

from pylibscrypt import *
# Generate an MCF hash with random salt
mcf = scrypt_mcf('Hello World')
# Test it
print(scrypt_mcf_check(mcf, 'Hello World')) # prints True
print(scrypt_mcf_check(mcf, 'HelloPyWorld')) # prints False

For full API, you can try help(pylibscrypt) from python after importing.

It is highly recommended that you use a random salt, i.e. don't pass
one.

Additionally, using the :math:`7` MCF format by calling with
prefix=\ :math:`7` is recommended because it may be made the default in
a future release.

Versioning
----------

The package has a version number that can be read from python like so:

::

print(pylibscrypt.__version__)

The version number is of the form X.Y.Z, following Semantic
Versioning\ `6 <http://semver.org/spec/v2.0.0.html>`__. Releases are
tagged vX.Y.Z and release branches bX.Y.x when they differ from master.

Development
-----------

Development happens on
GitHub\ `2 <https://github.com/technion/libscrypt>`__. If you find a
bug, please open an issue there.

tests.py tests both implementations with some quick tests. Running
either implementation directly will also compare to scrypt test vectors
from the paper but this is slow for the Python version unless you have
pypy.

fuzz.py runs some basic fuzz tests with semi-randomly chosen inputs.

Project details


Release history Release notifications

History Node

1.7.1

History Node

1.7.0

History Node

1.6.1

History Node

1.6.0

History Node

1.5.3

History Node

1.5.2

History Node

1.5.1

History Node

1.5.0

History Node

1.4.1

History Node

1.4.0

This version
History Node

1.3.0

History Node

1.2.1

History Node

1.2.0

History Node

1.1.3

History Node

1.1.2

History Node

1.1.1

History Node

1.1.0

History Node

1.0.3

History Node

1.0.2

History Node

1.0.1

History Node

1.0.0

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
pylibscrypt-1.3.0.tar.gz (20.0 kB) Copy SHA256 hash SHA256 Source None Jul 8, 2014

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging CloudAMQP CloudAMQP RabbitMQ AWS AWS Cloud computing Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page