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].


Features
--
* Uses system libscrypt[2] as the first choice.
* If that isn't available, tries the scrypt Python module[3].
* Offers a pure Python scrypt implementation for when there's no C scrypt.
* Not unusably slow, even in pure Python... at least with pypy[4].

With PyPy as the interpreter the Python implementation is around one fifth the
speed of C scrypt. With cPython it is one fiftieth if libsodium[5] is available,
one two-hundredth if not.



Requirements
--
* Python 2.7 or 3.4 or so. Pypy 2.2 also works. Older versions may or may not.
* If you want speed: libscrypt 1.8+ (older may work) or py-scrypt 0.6+ or pypy



Usage
--
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.


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].
Releases are tagged vX.Y.Z and release branches bX.Y.x when they differ from
master.


Development
--
Development happens on GitHub[2]. 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. The best way to
report a bug is to also provide a new test that fails, but that is not required.

The run_coverage.sh script calls coverage.py[7] to report test coverage. If you
would like to include a new feature, it should be adequately covered with tests.


[1]:https://xkcd.com/927/
[2]:https://github.com/technion/libscrypt
[3]:https://bitbucket.org/mhallin/py-scrypt/src
[4]:http://pypy.org/
[5]:https://github.com/jedisct1/libsodium
[6]:http://semver.org/spec/v2.0.0.html
[7]:http://nedbatchelder.com/code/coverage/

