Skip to main content
Help us improve Python packaging – donate today!

A Scrypt-enabled password hasher for Django 1.4

Project Description

Django-Scrypt is a Scrypt-enabled password hasher for Django 1.4


The encoded hash format has changed in version 0.2.0. This change is backwards incompatible. Please read the notice in the Caveat section.


This is alpha software under active development. It was tested only on Python 2.7. It probably will not run on Python 2.5 since py-scrypt doesn’t run on interpreters earlier than Python 2.6.



You need to install Django 1.4 and py-scrypt prior to installing Django-Scrypt

Using source tarballs

  1. Download the source tarball for Django-Scrypt from Pypi

  2. Decompress it and make it your working directory:

    $ tar zxvf django-scrypt-0.2.0.tar.gz
    $ cd django-scrypt-0.2.0
  3. Install it into your site-packages (if you install to the system’s site packages you will probably need to be root or you will probably need to use sudo)

    $ python install

  4. Test your installation

    $ python test

Using Pip and Pypi

If you are installing to the system-wide site-packages then you will probably need to be root or you will probably need to use sudo.

  1. Use the pip command to install from Pypi

    $ pip install django-scrypt

Basic Usage


This software depends on py-scrypt version 0.5.5 to reveal the Scrypt hashing function. Unfortunately, py-scrypt contains a bug that can result in incorrect hashing when run on 64-bit Linux systems. View the py-scrypt issue tracker for the latest information on this issue. [1]

[1]See py-scrypt Issue 6

To use Scrypt as your default password storage algorithm in Django 1.4, install it and make the following changes. In your Django 1.4 application file, modify (or add it if it is missing) the PASSWORD_HASHERS tuple to include ScryptPasswordHasher as the first hasher in the tuple. It needs to be at the top.

For example:



You need to keep the other hasher entries in this list or else Django won’t be able to upgrade the passwords!

You have now changed your app to use Scrypt as the default storage algorithm. As users login to your system they will automatically upgrade to use Scrypt hashes.


Hash Format Changes As N Removed

In an attempt to shorten the length of the encoded hash, I removed the N-value and replaced it with an N-exponent value named Nexp. The reason for this is that N must be a power of two {2, 4, 6, … 16384, …etc…} and those digits take up room in a 128 character hash storage space. It makes more sense to me to store the exponent and just make the actual integer on the fly.

N == 16384 == 2 ** 14 therefore Nexp == 14

The bad news is that this introduces a backward incompatible change as of version 0.2.0.

Django Password Field Character Length Limits

By default, Django limits password field lengths to 128 characters. Using the default settings in Django-Scrypt with the Django salting implementation should yield encoded hashes less than 128 characters; however, if you override the ScryptPasswordHasher class variables you might end up overflowing the field.

The solution is to increase the size of the password field using SQL. You should consult your database documentation for the correct commands.

Bugs! Help!!

If you find bugs please report them to the BitBucket issue tracker or send me an email to Any serious security bugs should be reported via email.


Thank-you for taking the time to evaluate this software. I appreciate receiving feedback on your experiences with it and I welcome code contributions and development ideas.

Thanks to Dr Colin Percival for his original Scrypt software [2], also to Magnus Hallin for the py-scrypt Python module [3].


Release history Release notifications

History Node


History Node


History Node


This version
History Node


History Node


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
django-scrypt-0.2.0.tar.gz (6.8 kB) Copy SHA256 hash SHA256 Source None Jul 6, 2012

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