scrypt


Namescrypt JSON
Version 0.9.4 PyPI version JSON
download
home_pagehttps://github.com/holgern/py-scrypt
SummaryBindings for the scrypt key derivation function library
upload_time2025-08-05 05:54:37
maintainerHolger Nahrstaedt
docs_urlNone
authorMagnus Hallin
requires_pythonNone
license2-clause BSD
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            =========================
 Python scrypt_ bindings
=========================

This is a set of Python_ bindings for the scrypt_ key derivation
function.

.. image:: https://img.shields.io/pypi/v/scrypt.svg
    :target: https://pypi.python.org/pypi/scrypt/
    :alt: Latest Version

.. image:: https://anaconda.org/conda-forge/scrypt/badges/version.svg
    :target: https://anaconda.org/conda-forge/scrypt

.. image:: https://anaconda.org/conda-forge/scrypt/badges/downloads.svg
    :target: https://anaconda.org/conda-forge/scrypt


Scrypt is useful when encrypting password as it is possible to specify
a *minimum* amount of time to use when encrypting and decrypting. If,
for example, a password takes 0.05 seconds to verify, a user won't
notice the slight delay when signing in, but doing a brute force
search of several billion passwords will take a considerable amount of
time. This is in contrast to more traditional hash functions such as
MD5 or the SHA family which can be implemented extremely fast on cheap
hardware.

Installation
============

Or you can install the latest release from PyPi::

    $ pip install scrypt

Users of the Anaconda_ Python distribution can directly obtain pre-built
Windows, Intel Linux or macOS / OSX binaries from the conda-forge channel.
This can be done via::

    $ conda install -c conda-forge scrypt


If you want py-scrypt for your Python 3 environment, just run the
above commands with your Python 3 interpreter. Py-scrypt supports both
Python 2 and 3.

From version 0.6.0 (not available on PyPi yet), py-scrypt supports
PyPy as well.

Build From Source
=================

For Debian and Ubuntu, please ensure that the following packages are installed:

.. code:: bash

    $ sudo apt-get install build-essential libssl-dev python-dev

For Fedora and RHEL-derivatives, please ensure that the following packages are installed:

.. code:: bash

    $ sudo yum install gcc openssl-devel python-devel

For OSX, please do the following::

    $ brew install openssl
    $ export CFLAGS="-I$(brew --prefix openssl)/include $CFLAGS"
    $ export LDFLAGS="-L$(brew --prefix openssl)/lib $LDFLAGS"

For OSX, you can also use the precompiled wheels. They are installed by::

    $ pip install scrypt

For Windows, please use the precompiled wheels. They are installed by::

    $ pip install scrypt

For Windows, when the package should be compiled, the development package from https://slproweb.com/products/Win32OpenSSL.html is needed.
It needs to be installed to `C:\OpenSSL-Win64` or `C:\Program Files\OpenSSL`.

It is also possible to use the Chocolatey package manager to install OpenSSL:

```
choco install openssl
```

You can install py-scrypt from this repository if you want the latest
but possibly non-compiling version::

    $ git clone https://github.com/holgern/py-scrypt.git
    $ cd py-scrypt
    $ python setup.py build

    Become superuser (or use virtualenv):
    # python setup.py install

    Run tests after install:
    $ python setup.py test


Changelog
=========
0.9.1
-----
* No notable change

0.9.0
-----
* Update to scrypt 1.3.3

0.8.29
------
* Fix build for OSX using openssl 3.0
* Build Wheel for Python 3.13
* switch to ruff

0.8.24
------
* Building of all wheels works with github actions

0.8.20
------
* Fix #8 by adding missing gettimeofday.c to MANIFEST.in

0.8.19
------
* Use RtlGenRandom instead of CryptGenRandom on windows (Thanks to https://github.com/veorq/cryptocoding/)
* Add check for c:\Program Files\OpenSSL-Win64 and c:\Program Files\OpenSSL-Win32

0.8.18
------
* add wheel for python 3.9

0.8.17
------

* add_dll_directory for python 3.8 on windows, as importlib.util.find_spec does not search all paths anymore

0.8.16
------

* Add additional test vector from RFC (thanks to @ChrisMacNaughton)

0.8.15
------

* Fix missing import


0.8.14
------

* fix imp deprecation warning


0.8.13
------

* improve build for conda forge

0.8.12
------

* Add SCRYPT_WINDOWS_LINK_LEGACY_OPENSSL environment variable, when set, openssl 1.0.2 is linked

0.8.11
------

* fix build for conda feedstock

0.8.10
------

* fix typo

0.8.9
-----

* use the static libcrypto_static for windows and openssl 1.1.1

0.8.8
-----

* setup.py for windows improved, works with openssl 1.0.2 and 1.1.1

0.8.7
-----

* setup.py for windows fixed

0.8.6
-----

* setup.py fixed, scrypt could not be imported in version 0.8.5

0.8.5
-----

* MANIFEST.in fixed
* scrypt.py moved into own scrypt directory with __init__.py
* openssl library path for osx wheel repaired

0.8.4
-----

* __version__ added to scrypt
* missing void in sha256.c fixed

0.8.3
-----

* scrypt updated to 1.2.1
* Wheels are created for python 3.6

Usage
=====

For encryption/decryption, the library exports two functions
``encrypt`` and ``decrypt``::

    >>> import scrypt
    >>> data = scrypt.encrypt('a secret message', 'password', maxtime=0.1) # This will take at least 0.1 seconds
    >>> data[:20]
    'scrypt\x00\r\x00\x00\x00\x08\x00\x00\x00\x01RX9H'
    >>> scrypt.decrypt(data, 'password', force=True) # This will also take at least 0.1 seconds
    'a secret message'
    >>> scrypt.decrypt(data, 'password', maxtime=0.05) # scrypt won't be able to decrypt this data fast enough
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    scrypt.error: decrypting file would take too long
    >>> scrypt.decrypt(data, 'wrong password', force=True) # scrypt will throw an exception if the password is incorrect
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    scrypt.error: password is incorrect

From these, one can make a simple password verifier using the following
functions::

    import os
    import scrypt

    def hash_password(password, maxtime=0.5, datalength=64):
        """Create a secure password hash using scrypt encryption.

        Args:
            password: The password to hash
            maxtime: Maximum time to spend hashing in seconds
            datalength: Length of the random data to encrypt

        Returns:
            bytes: An encrypted hash suitable for storage and later verification
        """
        return scrypt.encrypt(os.urandom(datalength), password, maxtime=maxtime)

    def verify_password(hashed_password, guessed_password, maxtime=0.5):
        """Verify a password against its hash with better error handling.

        Args:
            hashed_password: The stored password hash from hash_password()
            guessed_password: The password to verify
            maxtime: Maximum time to spend in verification

        Returns:
            tuple: (is_valid, status_code) where:
                - is_valid: True if password is correct, False otherwise
                - status_code: One of "correct", "wrong_password", "time_limit_exceeded",
                  "memory_limit_exceeded", or "error"

        Raises:
            scrypt.error: Only raised for resource limit errors, which you may want to
                        handle by retrying with higher limits or force=True
        """
        try:
            scrypt.decrypt(hashed_password, guessed_password, maxtime, encoding=None)
            return True, "correct"
        except scrypt.error as e:
            # Check the specific error message to differentiate between causes
            error_message = str(e)
            if error_message == "password is incorrect":
                # Wrong password was provided
                return False, "wrong_password"
            elif error_message == "decrypting file would take too long":
                # Time limit exceeded
                raise  # Re-raise so caller can handle appropriately
            elif error_message == "decrypting file would take too much memory":
                # Memory limit exceeded
                raise  # Re-raise so caller can handle appropriately
            else:
                # Some other error occurred (corrupted data, etc.)
                return False, "error"

    # Example usage:

    # Create a hash of a password
    stored_hash = hash_password("correct_password", maxtime=0.1)

    # Verify with correct password
    is_valid, status = verify_password(stored_hash, "correct_password", maxtime=0.1)
    if is_valid:
        print("Password is correct!")  # This will be printed

    # Verify with wrong password
    is_valid, status = verify_password(stored_hash, "wrong_password", maxtime=0.1)
    if not is_valid:
        if status == "wrong_password":
            print("Password is incorrect!")  # This will be printed

    # Verify with insufficient time
    try:
        # Set maxtime very low to trigger a time limit error
        is_valid, status = verify_password(stored_hash, "correct_password", maxtime=0.00001)
    except scrypt.error as e:
        if "would take too long" in str(e):
            print("Time limit exceeded, try with higher maxtime or force=True")

            # Retry with force=True
            result = scrypt.decrypt(stored_hash, "correct_password", maxtime=0.00001, force=True, encoding=None)
            print("Forced decryption successful!")

The `encrypt` function accepts several parameters to control its behavior::

    encrypt(input, password, maxtime=5.0, maxmem=0, maxmemfrac=0.5, logN=0, r=0, p=0, force=False, verbose=False)

Where:
    - `input`: Data to encrypt (bytes or str)
    - `password`: Password for encryption (bytes or str)
    - `maxtime`: Maximum time to spend in seconds
    - `maxmem`: Maximum memory to use in bytes (0 for unlimited)
    - `maxmemfrac`: Maximum fraction of available memory to use (0.0 to 1.0)
    - `logN`, `r`, `p`: Parameters controlling the scrypt key derivation function
      - If all three are zero (default), optimal parameters are chosen automatically
      - If provided, all three must be non-zero and will be used explicitly
    - `force`: If True, do not check whether encryption will exceed the estimated memory or time
    - `verbose`: If True, display parameter information

The `decrypt` function has a simpler interface::

    decrypt(input, password, maxtime=300.0, maxmem=0, maxmemfrac=0.5, encoding='utf-8', verbose=False, force=False)

Where:
    - `input`: Encrypted data (bytes or str)
    - `password`: Password for decryption (bytes or str)
    - `maxtime`: Maximum time to spend in seconds
    - `maxmem`: Maximum memory to use in bytes (0 for unlimited)
    - `maxmemfrac`: Maximum fraction of available memory to use
    - `encoding`: Encoding to use for output string (None for raw bytes)
    - `verbose`: If True, display parameter information
    - `force`: If True, do not check whether decryption will exceed the estimated memory or time


But, if you want output that is deterministic and constant in size,
you can use the ``hash`` function::

    >>> import scrypt
    >>> h1 = scrypt.hash('password', 'random salt')
    >>> len(h1)  # The hash will be 64 bytes by default, but is overridable.
    64
    >>> h1[:10]
    '\xfe\x87\xf3hS\tUo\xcd\xc8'
    >>> h2 = scrypt.hash('password', 'random salt')
    >>> h1 == h2 # The hash function is deterministic
    True

The `hash` function accepts the following parameters::

    hash(password, salt, N=1<<14, r=8, p=1, buflen=64)

Where:
    - `password`: The password to hash (bytes or str)
    - `salt`: Salt for the hash (bytes or str)
    - `N`: CPU/memory cost parameter (must be a power of 2)
    - `r`: Block size parameter
    - `p`: Parallelization parameter
    - `buflen`: Output buffer length

The parameters r, p, and buflen must satisfy r * p < 2^30 and
buflen <= (2^32 - 1) * 32. The parameter N must be a power of 2
greater than 1. N, r, and p must all be positive.

For advanced usage, the library also provides two utility functions:

- `pickparams(maxmem=0, maxmemfrac=0.5, maxtime=5.0, verbose=0)`:
  Automatically chooses optimal scrypt parameters based on system resources.
  Returns (logN, r, p) tuple.

- `checkparams(logN, r, p, maxmem=0, maxmemfrac=0.5, maxtime=5.0, verbose=0, force=0)`:
  Verifies that the provided parameters are valid and within resource limits.


Acknowledgements
================

Scrypt_ was created by Colin Percival and is licensed as 2-clause BSD.
Since scrypt does not normally build as a shared library, I have included
the source for the currently latest version of the library in this
repository. When a new version arrives, I will update these sources.

`Kelvin Wong`_ on Bitbucket provided changes to make the library
available on Mac OS X 10.6 and earlier, as well as changes to make the
library work more like the command-line version of scrypt by
default. Kelvin also contributed with the unit tests, lots of cross
platform testing and work on the ``hash`` function.

Burstaholic_ on Bitbucket provided the necessary changes to make
the library build on Windows.

The `python-appveyor-demo`_ repository for setting up automated Windows
builds for a multitude of Python versions.

License
=======

This library is licensed under the same license as scrypt; 2-clause BSD.

.. _scrypt: http://www.tarsnap.com/scrypt.html
.. _Python: http://python.org
.. _Burstaholic: https://bitbucket.org/Burstaholic
.. _Kelvin Wong: https://bitbucket.org/kelvinwong_ca
.. _python-appveyor-demo: https://github.com/ogrisel/python-appveyor-demo
.. _Anaconda: https://www.continuum.io

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/holgern/py-scrypt",
    "name": "scrypt",
    "maintainer": "Holger Nahrstaedt",
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": "nahrstaedt@gmail.com",
    "keywords": null,
    "author": "Magnus Hallin",
    "author_email": "mhallin@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/db/38/c9b79f61c04fa79b8fae28213111a6f70d8249d4d789ca7030453326ab62/scrypt-0.9.4.tar.gz",
    "platform": null,
    "description": "=========================\n Python scrypt_ bindings\n=========================\n\nThis is a set of Python_ bindings for the scrypt_ key derivation\nfunction.\n\n.. image:: https://img.shields.io/pypi/v/scrypt.svg\n    :target: https://pypi.python.org/pypi/scrypt/\n    :alt: Latest Version\n\n.. image:: https://anaconda.org/conda-forge/scrypt/badges/version.svg\n    :target: https://anaconda.org/conda-forge/scrypt\n\n.. image:: https://anaconda.org/conda-forge/scrypt/badges/downloads.svg\n    :target: https://anaconda.org/conda-forge/scrypt\n\n\nScrypt is useful when encrypting password as it is possible to specify\na *minimum* amount of time to use when encrypting and decrypting. If,\nfor example, a password takes 0.05 seconds to verify, a user won't\nnotice the slight delay when signing in, but doing a brute force\nsearch of several billion passwords will take a considerable amount of\ntime. This is in contrast to more traditional hash functions such as\nMD5 or the SHA family which can be implemented extremely fast on cheap\nhardware.\n\nInstallation\n============\n\nOr you can install the latest release from PyPi::\n\n    $ pip install scrypt\n\nUsers of the Anaconda_ Python distribution can directly obtain pre-built\nWindows, Intel Linux or macOS / OSX binaries from the conda-forge channel.\nThis can be done via::\n\n    $ conda install -c conda-forge scrypt\n\n\nIf you want py-scrypt for your Python 3 environment, just run the\nabove commands with your Python 3 interpreter. Py-scrypt supports both\nPython 2 and 3.\n\nFrom version 0.6.0 (not available on PyPi yet), py-scrypt supports\nPyPy as well.\n\nBuild From Source\n=================\n\nFor Debian and Ubuntu, please ensure that the following packages are installed:\n\n.. code:: bash\n\n    $ sudo apt-get install build-essential libssl-dev python-dev\n\nFor Fedora and RHEL-derivatives, please ensure that the following packages are installed:\n\n.. code:: bash\n\n    $ sudo yum install gcc openssl-devel python-devel\n\nFor OSX, please do the following::\n\n    $ brew install openssl\n    $ export CFLAGS=\"-I$(brew --prefix openssl)/include $CFLAGS\"\n    $ export LDFLAGS=\"-L$(brew --prefix openssl)/lib $LDFLAGS\"\n\nFor OSX, you can also use the precompiled wheels. They are installed by::\n\n    $ pip install scrypt\n\nFor Windows, please use the precompiled wheels. They are installed by::\n\n    $ pip install scrypt\n\nFor Windows, when the package should be compiled, the development package from https://slproweb.com/products/Win32OpenSSL.html is needed.\nIt needs to be installed to `C:\\OpenSSL-Win64` or `C:\\Program Files\\OpenSSL`.\n\nIt is also possible to use the Chocolatey package manager to install OpenSSL:\n\n```\nchoco install openssl\n```\n\nYou can install py-scrypt from this repository if you want the latest\nbut possibly non-compiling version::\n\n    $ git clone https://github.com/holgern/py-scrypt.git\n    $ cd py-scrypt\n    $ python setup.py build\n\n    Become superuser (or use virtualenv):\n    # python setup.py install\n\n    Run tests after install:\n    $ python setup.py test\n\n\nChangelog\n=========\n0.9.1\n-----\n* No notable change\n\n0.9.0\n-----\n* Update to scrypt 1.3.3\n\n0.8.29\n------\n* Fix build for OSX using openssl 3.0\n* Build Wheel for Python 3.13\n* switch to ruff\n\n0.8.24\n------\n* Building of all wheels works with github actions\n\n0.8.20\n------\n* Fix #8 by adding missing gettimeofday.c to MANIFEST.in\n\n0.8.19\n------\n* Use RtlGenRandom instead of CryptGenRandom on windows (Thanks to https://github.com/veorq/cryptocoding/)\n* Add check for c:\\Program Files\\OpenSSL-Win64 and c:\\Program Files\\OpenSSL-Win32\n\n0.8.18\n------\n* add wheel for python 3.9\n\n0.8.17\n------\n\n* add_dll_directory for python 3.8 on windows, as importlib.util.find_spec does not search all paths anymore\n\n0.8.16\n------\n\n* Add additional test vector from RFC (thanks to @ChrisMacNaughton)\n\n0.8.15\n------\n\n* Fix missing import\n\n\n0.8.14\n------\n\n* fix imp deprecation warning\n\n\n0.8.13\n------\n\n* improve build for conda forge\n\n0.8.12\n------\n\n* Add SCRYPT_WINDOWS_LINK_LEGACY_OPENSSL environment variable, when set, openssl 1.0.2 is linked\n\n0.8.11\n------\n\n* fix build for conda feedstock\n\n0.8.10\n------\n\n* fix typo\n\n0.8.9\n-----\n\n* use the static libcrypto_static for windows and openssl 1.1.1\n\n0.8.8\n-----\n\n* setup.py for windows improved, works with openssl 1.0.2 and 1.1.1\n\n0.8.7\n-----\n\n* setup.py for windows fixed\n\n0.8.6\n-----\n\n* setup.py fixed, scrypt could not be imported in version 0.8.5\n\n0.8.5\n-----\n\n* MANIFEST.in fixed\n* scrypt.py moved into own scrypt directory with __init__.py\n* openssl library path for osx wheel repaired\n\n0.8.4\n-----\n\n* __version__ added to scrypt\n* missing void in sha256.c fixed\n\n0.8.3\n-----\n\n* scrypt updated to 1.2.1\n* Wheels are created for python 3.6\n\nUsage\n=====\n\nFor encryption/decryption, the library exports two functions\n``encrypt`` and ``decrypt``::\n\n    >>> import scrypt\n    >>> data = scrypt.encrypt('a secret message', 'password', maxtime=0.1) # This will take at least 0.1 seconds\n    >>> data[:20]\n    'scrypt\\x00\\r\\x00\\x00\\x00\\x08\\x00\\x00\\x00\\x01RX9H'\n    >>> scrypt.decrypt(data, 'password', force=True) # This will also take at least 0.1 seconds\n    'a secret message'\n    >>> scrypt.decrypt(data, 'password', maxtime=0.05) # scrypt won't be able to decrypt this data fast enough\n    Traceback (most recent call last):\n      File \"<stdin>\", line 1, in <module>\n    scrypt.error: decrypting file would take too long\n    >>> scrypt.decrypt(data, 'wrong password', force=True) # scrypt will throw an exception if the password is incorrect\n    Traceback (most recent call last):\n      File \"<stdin>\", line 1, in <module>\n    scrypt.error: password is incorrect\n\nFrom these, one can make a simple password verifier using the following\nfunctions::\n\n    import os\n    import scrypt\n\n    def hash_password(password, maxtime=0.5, datalength=64):\n        \"\"\"Create a secure password hash using scrypt encryption.\n\n        Args:\n            password: The password to hash\n            maxtime: Maximum time to spend hashing in seconds\n            datalength: Length of the random data to encrypt\n\n        Returns:\n            bytes: An encrypted hash suitable for storage and later verification\n        \"\"\"\n        return scrypt.encrypt(os.urandom(datalength), password, maxtime=maxtime)\n\n    def verify_password(hashed_password, guessed_password, maxtime=0.5):\n        \"\"\"Verify a password against its hash with better error handling.\n\n        Args:\n            hashed_password: The stored password hash from hash_password()\n            guessed_password: The password to verify\n            maxtime: Maximum time to spend in verification\n\n        Returns:\n            tuple: (is_valid, status_code) where:\n                - is_valid: True if password is correct, False otherwise\n                - status_code: One of \"correct\", \"wrong_password\", \"time_limit_exceeded\",\n                  \"memory_limit_exceeded\", or \"error\"\n\n        Raises:\n            scrypt.error: Only raised for resource limit errors, which you may want to\n                        handle by retrying with higher limits or force=True\n        \"\"\"\n        try:\n            scrypt.decrypt(hashed_password, guessed_password, maxtime, encoding=None)\n            return True, \"correct\"\n        except scrypt.error as e:\n            # Check the specific error message to differentiate between causes\n            error_message = str(e)\n            if error_message == \"password is incorrect\":\n                # Wrong password was provided\n                return False, \"wrong_password\"\n            elif error_message == \"decrypting file would take too long\":\n                # Time limit exceeded\n                raise  # Re-raise so caller can handle appropriately\n            elif error_message == \"decrypting file would take too much memory\":\n                # Memory limit exceeded\n                raise  # Re-raise so caller can handle appropriately\n            else:\n                # Some other error occurred (corrupted data, etc.)\n                return False, \"error\"\n\n    # Example usage:\n\n    # Create a hash of a password\n    stored_hash = hash_password(\"correct_password\", maxtime=0.1)\n\n    # Verify with correct password\n    is_valid, status = verify_password(stored_hash, \"correct_password\", maxtime=0.1)\n    if is_valid:\n        print(\"Password is correct!\")  # This will be printed\n\n    # Verify with wrong password\n    is_valid, status = verify_password(stored_hash, \"wrong_password\", maxtime=0.1)\n    if not is_valid:\n        if status == \"wrong_password\":\n            print(\"Password is incorrect!\")  # This will be printed\n\n    # Verify with insufficient time\n    try:\n        # Set maxtime very low to trigger a time limit error\n        is_valid, status = verify_password(stored_hash, \"correct_password\", maxtime=0.00001)\n    except scrypt.error as e:\n        if \"would take too long\" in str(e):\n            print(\"Time limit exceeded, try with higher maxtime or force=True\")\n\n            # Retry with force=True\n            result = scrypt.decrypt(stored_hash, \"correct_password\", maxtime=0.00001, force=True, encoding=None)\n            print(\"Forced decryption successful!\")\n\nThe `encrypt` function accepts several parameters to control its behavior::\n\n    encrypt(input, password, maxtime=5.0, maxmem=0, maxmemfrac=0.5, logN=0, r=0, p=0, force=False, verbose=False)\n\nWhere:\n    - `input`: Data to encrypt (bytes or str)\n    - `password`: Password for encryption (bytes or str)\n    - `maxtime`: Maximum time to spend in seconds\n    - `maxmem`: Maximum memory to use in bytes (0 for unlimited)\n    - `maxmemfrac`: Maximum fraction of available memory to use (0.0 to 1.0)\n    - `logN`, `r`, `p`: Parameters controlling the scrypt key derivation function\n      - If all three are zero (default), optimal parameters are chosen automatically\n      - If provided, all three must be non-zero and will be used explicitly\n    - `force`: If True, do not check whether encryption will exceed the estimated memory or time\n    - `verbose`: If True, display parameter information\n\nThe `decrypt` function has a simpler interface::\n\n    decrypt(input, password, maxtime=300.0, maxmem=0, maxmemfrac=0.5, encoding='utf-8', verbose=False, force=False)\n\nWhere:\n    - `input`: Encrypted data (bytes or str)\n    - `password`: Password for decryption (bytes or str)\n    - `maxtime`: Maximum time to spend in seconds\n    - `maxmem`: Maximum memory to use in bytes (0 for unlimited)\n    - `maxmemfrac`: Maximum fraction of available memory to use\n    - `encoding`: Encoding to use for output string (None for raw bytes)\n    - `verbose`: If True, display parameter information\n    - `force`: If True, do not check whether decryption will exceed the estimated memory or time\n\n\nBut, if you want output that is deterministic and constant in size,\nyou can use the ``hash`` function::\n\n    >>> import scrypt\n    >>> h1 = scrypt.hash('password', 'random salt')\n    >>> len(h1)  # The hash will be 64 bytes by default, but is overridable.\n    64\n    >>> h1[:10]\n    '\\xfe\\x87\\xf3hS\\tUo\\xcd\\xc8'\n    >>> h2 = scrypt.hash('password', 'random salt')\n    >>> h1 == h2 # The hash function is deterministic\n    True\n\nThe `hash` function accepts the following parameters::\n\n    hash(password, salt, N=1<<14, r=8, p=1, buflen=64)\n\nWhere:\n    - `password`: The password to hash (bytes or str)\n    - `salt`: Salt for the hash (bytes or str)\n    - `N`: CPU/memory cost parameter (must be a power of 2)\n    - `r`: Block size parameter\n    - `p`: Parallelization parameter\n    - `buflen`: Output buffer length\n\nThe parameters r, p, and buflen must satisfy r * p < 2^30 and\nbuflen <= (2^32 - 1) * 32. The parameter N must be a power of 2\ngreater than 1. N, r, and p must all be positive.\n\nFor advanced usage, the library also provides two utility functions:\n\n- `pickparams(maxmem=0, maxmemfrac=0.5, maxtime=5.0, verbose=0)`:\n  Automatically chooses optimal scrypt parameters based on system resources.\n  Returns (logN, r, p) tuple.\n\n- `checkparams(logN, r, p, maxmem=0, maxmemfrac=0.5, maxtime=5.0, verbose=0, force=0)`:\n  Verifies that the provided parameters are valid and within resource limits.\n\n\nAcknowledgements\n================\n\nScrypt_ was created by Colin Percival and is licensed as 2-clause BSD.\nSince scrypt does not normally build as a shared library, I have included\nthe source for the currently latest version of the library in this\nrepository. When a new version arrives, I will update these sources.\n\n`Kelvin Wong`_ on Bitbucket provided changes to make the library\navailable on Mac OS X 10.6 and earlier, as well as changes to make the\nlibrary work more like the command-line version of scrypt by\ndefault. Kelvin also contributed with the unit tests, lots of cross\nplatform testing and work on the ``hash`` function.\n\nBurstaholic_ on Bitbucket provided the necessary changes to make\nthe library build on Windows.\n\nThe `python-appveyor-demo`_ repository for setting up automated Windows\nbuilds for a multitude of Python versions.\n\nLicense\n=======\n\nThis library is licensed under the same license as scrypt; 2-clause BSD.\n\n.. _scrypt: http://www.tarsnap.com/scrypt.html\n.. _Python: http://python.org\n.. _Burstaholic: https://bitbucket.org/Burstaholic\n.. _Kelvin Wong: https://bitbucket.org/kelvinwong_ca\n.. _python-appveyor-demo: https://github.com/ogrisel/python-appveyor-demo\n.. _Anaconda: https://www.continuum.io\n",
    "bugtrack_url": null,
    "license": "2-clause BSD",
    "summary": "Bindings for the scrypt key derivation function library",
    "version": "0.9.4",
    "project_urls": {
        "Homepage": "https://github.com/holgern/py-scrypt"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a4f3ad45d58cc1294d51cff10be752850370f37061a59b7287ed127cffbc6888",
                "md5": "af8036264644f1cfe5d483bacd87f0b4",
                "sha256": "54023f235bd8b9412c26bda8e65b1dab5da4b6f533eb326c27fb0c9287cd5d46"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp310-cp310-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "af8036264644f1cfe5d483bacd87f0b4",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 2293990,
            "upload_time": "2025-08-05T06:00:47",
            "upload_time_iso_8601": "2025-08-05T06:00:47.846019Z",
            "url": "https://files.pythonhosted.org/packages/a4/f3/ad45d58cc1294d51cff10be752850370f37061a59b7287ed127cffbc6888/scrypt-0.9.4-cp310-cp310-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "77a236769fba53e53cd168e04758d27f099a6d19e495c0d1b8cfe4d89faf9faf",
                "md5": "832fffbfd23d290efa8517dbefca0611",
                "sha256": "e328f0c4bda5cb86cedc26b7b50fa232a2da14c203b7c1e8688698c42fb6d77b"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "832fffbfd23d290efa8517dbefca0611",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 1508652,
            "upload_time": "2025-08-05T06:04:45",
            "upload_time_iso_8601": "2025-08-05T06:04:45.181617Z",
            "url": "https://files.pythonhosted.org/packages/77/a2/36769fba53e53cd168e04758d27f099a6d19e495c0d1b8cfe4d89faf9faf/scrypt-0.9.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4a7a2bd4606767c276baa8b14c81bee4be0564bae6305ac94575d55f7b6ae0d8",
                "md5": "355d304aca3b054f6331706fa7591fd2",
                "sha256": "5be616494bd646bf00a00ee8739fac3581c9326369cf4439889ff385be0fc17f"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp310-cp310-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "355d304aca3b054f6331706fa7591fd2",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 2015485,
            "upload_time": "2025-08-05T06:04:47",
            "upload_time_iso_8601": "2025-08-05T06:04:47.590666Z",
            "url": "https://files.pythonhosted.org/packages/4a/7a/2bd4606767c276baa8b14c81bee4be0564bae6305ac94575d55f7b6ae0d8/scrypt-0.9.4-cp310-cp310-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "32e664dd0ec2d45d851145b902424f10a9635f492c775aa6ae2904ddbe1f7cf9",
                "md5": "356b40663c0fcaa4d48a089af2efebc9",
                "sha256": "44149e897a2f28dc6b445bbdb740e459b1f1114a608c9cbd496fd10698b6b817"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "356b40663c0fcaa4d48a089af2efebc9",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 47266,
            "upload_time": "2025-08-05T06:03:53",
            "upload_time_iso_8601": "2025-08-05T06:03:53.425157Z",
            "url": "https://files.pythonhosted.org/packages/32/e6/64dd0ec2d45d851145b902424f10a9635f492c775aa6ae2904ddbe1f7cf9/scrypt-0.9.4-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "302719f15e85a906c6fe3b664071ffb3961c237a7410013a3de5cab21ad66d85",
                "md5": "fab4a9877baee72b006ac9155b24e88e",
                "sha256": "e33a200c5bb9350f673bbc4582fe77a5df782eb3784a971b71401f63a3fc72ad"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp311-cp311-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "fab4a9877baee72b006ac9155b24e88e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 2293990,
            "upload_time": "2025-08-05T06:00:50",
            "upload_time_iso_8601": "2025-08-05T06:00:50.312032Z",
            "url": "https://files.pythonhosted.org/packages/30/27/19f15e85a906c6fe3b664071ffb3961c237a7410013a3de5cab21ad66d85/scrypt-0.9.4-cp311-cp311-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6d6a4b96cd10b32282b1f497d149b519baeafb8d4ed22d82d48539aca2c5e090",
                "md5": "d66723ba4fbff44650d943a91aa18db1",
                "sha256": "e42d4ed846a3641e7112ff54bfde5c026910d8bffe5ff647b43422c99422d981"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d66723ba4fbff44650d943a91aa18db1",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 1508669,
            "upload_time": "2025-08-05T06:04:49",
            "upload_time_iso_8601": "2025-08-05T06:04:49.173938Z",
            "url": "https://files.pythonhosted.org/packages/6d/6a/4b96cd10b32282b1f497d149b519baeafb8d4ed22d82d48539aca2c5e090/scrypt-0.9.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1f181b73edc9cf04657c910e920860c8472a3708aba7c32bb251a670e128c408",
                "md5": "0aa253bee72fe491c345e880c048afdf",
                "sha256": "56f3346e17a57ea6f9a0ae913fea640bd98009c269ae73d4d2d4ecbe2eb3fcfa"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp311-cp311-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "0aa253bee72fe491c345e880c048afdf",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 2015523,
            "upload_time": "2025-08-05T06:04:50",
            "upload_time_iso_8601": "2025-08-05T06:04:50.376295Z",
            "url": "https://files.pythonhosted.org/packages/1f/18/1b73edc9cf04657c910e920860c8472a3708aba7c32bb251a670e128c408/scrypt-0.9.4-cp311-cp311-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "18c84fb946ee41f5df40ba79a1b2c01a041be621c74de50d8720c4a333f46c94",
                "md5": "8124b1ead0a0c7e22a4c2a868dfbc94f",
                "sha256": "70b075248a9f37dec3c2dee2d1c0dd3a286376793ee9f8736376cb510bed6682"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "8124b1ead0a0c7e22a4c2a868dfbc94f",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 47261,
            "upload_time": "2025-08-05T06:03:54",
            "upload_time_iso_8601": "2025-08-05T06:03:54.768999Z",
            "url": "https://files.pythonhosted.org/packages/18/c8/4fb946ee41f5df40ba79a1b2c01a041be621c74de50d8720c4a333f46c94/scrypt-0.9.4-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4e55ff977b5fb5fd1d1a802e8ded5fcecbf3cf7d1212f645a48d451a1597db84",
                "md5": "20889773892081c136e682b07b882ce7",
                "sha256": "349b158aa343205b3ffe38d72e53c70154583bfad098ef7c506172e3f65e9315"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp312-cp312-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "20889773892081c136e682b07b882ce7",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 2293991,
            "upload_time": "2025-08-05T06:00:52",
            "upload_time_iso_8601": "2025-08-05T06:00:52.112942Z",
            "url": "https://files.pythonhosted.org/packages/4e/55/ff977b5fb5fd1d1a802e8ded5fcecbf3cf7d1212f645a48d451a1597db84/scrypt-0.9.4-cp312-cp312-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dd8d28dab212c8b1e2068222bed0ff4079be0881f9ec40139c9ae722f4c7cf53",
                "md5": "a6a9ebb0506b2a7a66ce8db12a3e2f88",
                "sha256": "0779702be09a3356db8ae38028b9c5572e157e16154073ea189d79acee912fb7"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "a6a9ebb0506b2a7a66ce8db12a3e2f88",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 1437412,
            "upload_time": "2025-08-05T06:02:38",
            "upload_time_iso_8601": "2025-08-05T06:02:38.439039Z",
            "url": "https://files.pythonhosted.org/packages/dd/8d/28dab212c8b1e2068222bed0ff4079be0881f9ec40139c9ae722f4c7cf53/scrypt-0.9.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "819af7956242e8ea68f62af8ae10c6cce8937f1590f10adc6599e218ea6149bb",
                "md5": "d7cac3b77d2f4d3470aa0d0b82caaa99",
                "sha256": "3dc43bef0223eb4cb5fff6bbfeacc36be0bb5ef8e0b096e299a13ff9693538e1"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d7cac3b77d2f4d3470aa0d0b82caaa99",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 1508772,
            "upload_time": "2025-08-05T06:04:51",
            "upload_time_iso_8601": "2025-08-05T06:04:51.418675Z",
            "url": "https://files.pythonhosted.org/packages/81/9a/f7956242e8ea68f62af8ae10c6cce8937f1590f10adc6599e218ea6149bb/scrypt-0.9.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0234817122cce4baa7594565bb278787a76a46bea0e023c99d12ca830071cf51",
                "md5": "7c00e48146c867bed4a70785030a937d",
                "sha256": "2d2491f7078b128b1245022062fbaebd7b80f9716761f1205d53810776d30c1d"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp312-cp312-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7c00e48146c867bed4a70785030a937d",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 2015658,
            "upload_time": "2025-08-05T06:04:52",
            "upload_time_iso_8601": "2025-08-05T06:04:52.927611Z",
            "url": "https://files.pythonhosted.org/packages/02/34/817122cce4baa7594565bb278787a76a46bea0e023c99d12ca830071cf51/scrypt-0.9.4-cp312-cp312-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "858512f92696774363e765afec9da4d65d36c3e485479e61aca8982c81807e0b",
                "md5": "8f53ed970fa21d4f07a78ef1a142831c",
                "sha256": "6266a455bf8a66facbebd466d34559414ef595421b231d379bde86e0a7e28ca2"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "8f53ed970fa21d4f07a78ef1a142831c",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 47265,
            "upload_time": "2025-08-05T06:03:56",
            "upload_time_iso_8601": "2025-08-05T06:03:56.109644Z",
            "url": "https://files.pythonhosted.org/packages/85/85/12f92696774363e765afec9da4d65d36c3e485479e61aca8982c81807e0b/scrypt-0.9.4-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "aa2298e17e1ea6461a5c51c866192304182846fd004852f789dfece9f44c6553",
                "md5": "d6dcacaf60b2386d6de362d73a2a853f",
                "sha256": "58f424ac1656d342b2651bf5577f1b2aad9959c2e41ebbadf591035b372368a9"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp313-cp313-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "d6dcacaf60b2386d6de362d73a2a853f",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": null,
            "size": 2293992,
            "upload_time": "2025-08-05T06:00:53",
            "upload_time_iso_8601": "2025-08-05T06:00:53.887855Z",
            "url": "https://files.pythonhosted.org/packages/aa/22/98e17e1ea6461a5c51c866192304182846fd004852f789dfece9f44c6553/scrypt-0.9.4-cp313-cp313-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "32d9076f90cb1086e32ebab30123952f4f162c80c53b8814e35bedb4aa720241",
                "md5": "ad4843759d33f647a72b27a0d957f83e",
                "sha256": "efaa359fab4682215d8826c5ff6ecda525d37eabfc0da4ab197a3fd95e6d5f87"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ad4843759d33f647a72b27a0d957f83e",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": null,
            "size": 1508819,
            "upload_time": "2025-08-05T06:04:54",
            "upload_time_iso_8601": "2025-08-05T06:04:54.445092Z",
            "url": "https://files.pythonhosted.org/packages/32/d9/076f90cb1086e32ebab30123952f4f162c80c53b8814e35bedb4aa720241/scrypt-0.9.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "87c0d59f086fc8a589db06eac0b3829e2956de7a4c34d7c99c20b3cf6a858627",
                "md5": "911603e1e4dd0438e37371825be9e335",
                "sha256": "ee29481f0751eb4e91c4fca8895d44822d523225c796e0ed016a550e7f20f582"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp313-cp313-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "911603e1e4dd0438e37371825be9e335",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": null,
            "size": 2015695,
            "upload_time": "2025-08-05T06:04:55",
            "upload_time_iso_8601": "2025-08-05T06:04:55.477821Z",
            "url": "https://files.pythonhosted.org/packages/87/c0/d59f086fc8a589db06eac0b3829e2956de7a4c34d7c99c20b3cf6a858627/scrypt-0.9.4-cp313-cp313-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "980df62590144acf914a2eb4c3689cc6a2ca737a379962b0358f00dd0a1445cb",
                "md5": "f64d74a4b3daa9e2e4da04ca1ec5ff39",
                "sha256": "6ae6a0f7ccf7df9f0612b9166abbff5b6dacc41661044a0d090111aeb5e0bcf2"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp313-cp313-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "f64d74a4b3daa9e2e4da04ca1ec5ff39",
            "packagetype": "bdist_wheel",
            "python_version": "cp313",
            "requires_python": null,
            "size": 47267,
            "upload_time": "2025-08-05T06:03:57",
            "upload_time_iso_8601": "2025-08-05T06:03:57.035176Z",
            "url": "https://files.pythonhosted.org/packages/98/0d/f62590144acf914a2eb4c3689cc6a2ca737a379962b0358f00dd0a1445cb/scrypt-0.9.4-cp313-cp313-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1259baa438676f66355ea90dd235bd9bb9cfb4f3c8d4397852cbba1d5bc727c5",
                "md5": "3d28fd040f74b45448f2de2c42d32841",
                "sha256": "add4e31ab1046551a5d95e88a8e80362823b85fac5a00e948d41518be37445e9"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp314-cp314-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "3d28fd040f74b45448f2de2c42d32841",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": null,
            "size": 2293992,
            "upload_time": "2025-08-05T06:00:55",
            "upload_time_iso_8601": "2025-08-05T06:00:55.748255Z",
            "url": "https://files.pythonhosted.org/packages/12/59/baa438676f66355ea90dd235bd9bb9cfb4f3c8d4397852cbba1d5bc727c5/scrypt-0.9.4-cp314-cp314-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "79625fe4113d4cbb111b5d4c7c97d7b61644d158bdf9ef7ab0fb217c3a5532e4",
                "md5": "974412baa107f809d0854d3bebae7363",
                "sha256": "d1eec8826012bf3dda3ce84519088deb539dfd5b459ca9d591c3e7290abac17c"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "974412baa107f809d0854d3bebae7363",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": null,
            "size": 1508869,
            "upload_time": "2025-08-05T06:04:56",
            "upload_time_iso_8601": "2025-08-05T06:04:56.872738Z",
            "url": "https://files.pythonhosted.org/packages/79/62/5fe4113d4cbb111b5d4c7c97d7b61644d158bdf9ef7ab0fb217c3a5532e4/scrypt-0.9.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "806e96400591f80e988c92403c1d13f088a9d3273c3c2171a776c837290d15fb",
                "md5": "c3b450c673dd1eb394d7c216e30032ec",
                "sha256": "c1b2937c29d73d9217554773d24a9e9301739e904566b3fe38890c9c0b2c6880"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp314-cp314-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c3b450c673dd1eb394d7c216e30032ec",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": null,
            "size": 2015736,
            "upload_time": "2025-08-05T06:04:57",
            "upload_time_iso_8601": "2025-08-05T06:04:57.919174Z",
            "url": "https://files.pythonhosted.org/packages/80/6e/96400591f80e988c92403c1d13f088a9d3273c3c2171a776c837290d15fb/scrypt-0.9.4-cp314-cp314-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9e0445b36cca742f037786ca2b30a0550645625915f6d79ddefe37854faec5ae",
                "md5": "d45fcfe85453f5397f617107fa2af1e8",
                "sha256": "7e407269cbd80ff8f853fdc36fc7fb161400d595b8941df024046aba94db13ff"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp314-cp314t-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "d45fcfe85453f5397f617107fa2af1e8",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": null,
            "size": 2294000,
            "upload_time": "2025-08-05T06:00:57",
            "upload_time_iso_8601": "2025-08-05T06:00:57.483459Z",
            "url": "https://files.pythonhosted.org/packages/9e/04/45b36cca742f037786ca2b30a0550645625915f6d79ddefe37854faec5ae/scrypt-0.9.4-cp314-cp314t-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "32f8a064c46f618e636b1e3f91a7f99c238848247345cfc72e563afd2a161bee",
                "md5": "9f04aa6c93f42d607e93d7aae1fa0ab0",
                "sha256": "f27618f2c0ed8834f3ca3623cdf6b24f6578b43dfcea73a9ebe8e2d341031989"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "9f04aa6c93f42d607e93d7aae1fa0ab0",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": null,
            "size": 1508896,
            "upload_time": "2025-08-05T06:04:59",
            "upload_time_iso_8601": "2025-08-05T06:04:59.074370Z",
            "url": "https://files.pythonhosted.org/packages/32/f8/a064c46f618e636b1e3f91a7f99c238848247345cfc72e563afd2a161bee/scrypt-0.9.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4be194209fe6c9dd0b9e683c201c5d685bfc0b1621daa870918b3c9a62d85d62",
                "md5": "45d3a6ec5074113e611503ca8060d03a",
                "sha256": "a8a8b39aa5c91b16ac9dcf83c26e96a096ab0b580fb614b2e9e8ce5ee77129a1"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp314-cp314t-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "45d3a6ec5074113e611503ca8060d03a",
            "packagetype": "bdist_wheel",
            "python_version": "cp314",
            "requires_python": null,
            "size": 2015780,
            "upload_time": "2025-08-05T06:05:00",
            "upload_time_iso_8601": "2025-08-05T06:05:00.979275Z",
            "url": "https://files.pythonhosted.org/packages/4b/e1/94209fe6c9dd0b9e683c201c5d685bfc0b1621daa870918b3c9a62d85d62/scrypt-0.9.4-cp314-cp314t-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7dd97f47eb469f00e58073ae24d7cc2ea9b6e86f5489ee5299e3d7ee5f427581",
                "md5": "fde5d277afb98225083c201a9d8bb1dc",
                "sha256": "aefbd02ad89299c5e1f097c4217ebcfc09e42666621a2ebd13717fc9b05f5bb5"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp36-cp36m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "fde5d277afb98225083c201a9d8bb1dc",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": null,
            "size": 49760,
            "upload_time": "2025-08-05T06:03:58",
            "upload_time_iso_8601": "2025-08-05T06:03:58.061239Z",
            "url": "https://files.pythonhosted.org/packages/7d/d9/7f47eb469f00e58073ae24d7cc2ea9b6e86f5489ee5299e3d7ee5f427581/scrypt-0.9.4-cp36-cp36m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "18accb9d11855f3dc9921b1864dc63878c850f27e9284e9455d2e5dbb0ca60ef",
                "md5": "e7f13069ec3ca02878a4a2e8ddbc5f78",
                "sha256": "2fddfb12c211cfcba4abc97a16c567d3d200dd817b5f840b83798b4864550a9e"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp37-cp37m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "e7f13069ec3ca02878a4a2e8ddbc5f78",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 47183,
            "upload_time": "2025-08-05T06:03:59",
            "upload_time_iso_8601": "2025-08-05T06:03:59.774790Z",
            "url": "https://files.pythonhosted.org/packages/18/ac/cb9d11855f3dc9921b1864dc63878c850f27e9284e9455d2e5dbb0ca60ef/scrypt-0.9.4-cp37-cp37m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "32510812b922e8ffdb43ec1006bc9485ee98c501e64ba59337abb927eaef6d87",
                "md5": "71093aaa5b24d7ee6f944517f6c847fe",
                "sha256": "0d36a47921fe1d9421cb4eb671f2d352e92a303b4c7aa78693b7bcad450c66b9"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp38-cp38-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "71093aaa5b24d7ee6f944517f6c847fe",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 2293428,
            "upload_time": "2025-08-05T06:00:59",
            "upload_time_iso_8601": "2025-08-05T06:00:59.309406Z",
            "url": "https://files.pythonhosted.org/packages/32/51/0812b922e8ffdb43ec1006bc9485ee98c501e64ba59337abb927eaef6d87/scrypt-0.9.4-cp38-cp38-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "cfdd5fcaa97c92ff57a3d993480ce119937dd03d5b30ea27ff4efad6a075865f",
                "md5": "e30d02ce58bb48431774f5011f26120e",
                "sha256": "6c88ce5916c2614a5d5b670208e6c7edc04bfe6c3205be843628ba265213f963"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e30d02ce58bb48431774f5011f26120e",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 1508591,
            "upload_time": "2025-08-05T06:05:02",
            "upload_time_iso_8601": "2025-08-05T06:05:02.125877Z",
            "url": "https://files.pythonhosted.org/packages/cf/dd/5fcaa97c92ff57a3d993480ce119937dd03d5b30ea27ff4efad6a075865f/scrypt-0.9.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5dbf40ecb0d0c5662cce8aa26e5f56c6172e84f23abe1caf0ebed2f745184721",
                "md5": "87e1b0cbc2a3b76ac0e417a3f5529b4b",
                "sha256": "086966395a1cb46e7a09dda45d38422c6ad61ea88aff8ae40ff6881a5a4fafca"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp38-cp38-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "87e1b0cbc2a3b76ac0e417a3f5529b4b",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 2015156,
            "upload_time": "2025-08-05T06:05:03",
            "upload_time_iso_8601": "2025-08-05T06:05:03.293453Z",
            "url": "https://files.pythonhosted.org/packages/5d/bf/40ecb0d0c5662cce8aa26e5f56c6172e84f23abe1caf0ebed2f745184721/scrypt-0.9.4-cp38-cp38-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "36d288bb075fbf5e66597d2921fc07a23c9bc26329013934edf7a8b974b7c1fd",
                "md5": "3149e5b6cdef42cc290003804cd8fe56",
                "sha256": "eb07778e27f882ac3a110c9c3f3b900c8b6ec3255be2e4cf66748f37446fae84"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "3149e5b6cdef42cc290003804cd8fe56",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 47179,
            "upload_time": "2025-08-05T06:04:01",
            "upload_time_iso_8601": "2025-08-05T06:04:01.219622Z",
            "url": "https://files.pythonhosted.org/packages/36/d2/88bb075fbf5e66597d2921fc07a23c9bc26329013934edf7a8b974b7c1fd/scrypt-0.9.4-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "80e348ef1b431b0d04ffa9e07791a36c8019a61a4fdd6750b5e31f940b5fbe76",
                "md5": "f120cc97e76c378b4cea8d4ee47cf9f3",
                "sha256": "18119f0c130c1aabe12a965a27b16759c22359ff83d28454dcdcc4368a135ac9"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp39-cp39-macosx_14_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "f120cc97e76c378b4cea8d4ee47cf9f3",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 2293984,
            "upload_time": "2025-08-05T06:01:00",
            "upload_time_iso_8601": "2025-08-05T06:01:00.798160Z",
            "url": "https://files.pythonhosted.org/packages/80/e3/48ef1b431b0d04ffa9e07791a36c8019a61a4fdd6750b5e31f940b5fbe76/scrypt-0.9.4-cp39-cp39-macosx_14_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2f3e4d02546eb62b8cc375569067b4fb42d7cc2de14bed6ff8ee24a0ca71a52c",
                "md5": "1b60891dd4ce775f3c20e3ac545e77c4",
                "sha256": "5e7c06e44d8b32fa96acb899b329b5f7c129b452b60787087847520d9bfc6931"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1b60891dd4ce775f3c20e3ac545e77c4",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 1508546,
            "upload_time": "2025-08-05T06:05:04",
            "upload_time_iso_8601": "2025-08-05T06:05:04.875950Z",
            "url": "https://files.pythonhosted.org/packages/2f/3e/4d02546eb62b8cc375569067b4fb42d7cc2de14bed6ff8ee24a0ca71a52c/scrypt-0.9.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "83ddd4e7d0b435428918eff071cde475f4fc2bba649e0c2277a1096f0631b9cc",
                "md5": "54d12b97622b893d33cfbf0b06ce1d4a",
                "sha256": "e73979bb1557c95c433abc93f575fa47b348e57a6be2ac98a2ef752d0c69a689"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp39-cp39-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "54d12b97622b893d33cfbf0b06ce1d4a",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 2015351,
            "upload_time": "2025-08-05T06:05:06",
            "upload_time_iso_8601": "2025-08-05T06:05:06.034986Z",
            "url": "https://files.pythonhosted.org/packages/83/dd/d4e7d0b435428918eff071cde475f4fc2bba649e0c2277a1096f0631b9cc/scrypt-0.9.4-cp39-cp39-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "eed9bf5e1930f02133c115607b949c820d041c279ecf7805d5168bd7b6bd3285",
                "md5": "322695bd568b93b9e2bad79ce55b082a",
                "sha256": "c365d6c5d9372f4a708b0026a970b776eacbd2ba18b224f89ade93512930224b"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "322695bd568b93b9e2bad79ce55b082a",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 47261,
            "upload_time": "2025-08-05T06:04:02",
            "upload_time_iso_8601": "2025-08-05T06:04:02.590952Z",
            "url": "https://files.pythonhosted.org/packages/ee/d9/bf5e1930f02133c115607b949c820d041c279ecf7805d5168bd7b6bd3285/scrypt-0.9.4-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "db38c9b79f61c04fa79b8fae28213111a6f70d8249d4d789ca7030453326ab62",
                "md5": "b6182e6027583403fcff16f2e3ff183b",
                "sha256": "0d212010ba8c2e55475ba6258f30cee4da0432017514d8f6e855b7f1f8c55c77"
            },
            "downloads": -1,
            "filename": "scrypt-0.9.4.tar.gz",
            "has_sig": false,
            "md5_digest": "b6182e6027583403fcff16f2e3ff183b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 84526,
            "upload_time": "2025-08-05T05:54:37",
            "upload_time_iso_8601": "2025-08-05T05:54:37.283884Z",
            "url": "https://files.pythonhosted.org/packages/db/38/c9b79f61c04fa79b8fae28213111a6f70d8249d4d789ca7030453326ab62/scrypt-0.9.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-05 05:54:37",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "holgern",
    "github_project": "py-scrypt",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "tox": true,
    "lcname": "scrypt"
}
        
Elapsed time: 2.68508s