Skip to content
Snippets Groups Projects
README.rst 11.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • ulif's avatar
    ulif committed
    diceware
    ========
    
    
    ulif's avatar
    ulif committed
    Passphrases to remember...
    
    ulif's avatar
    ulif committed
    
    
    |bdg-build|  | `documentation <https://diceware.readthedocs.io/>`_ | `sources <https://github.com/ulif/diceware>`_ | `issues <https://github.com/ulif/diceware/issues>`_
    
    ulif's avatar
    ulif committed
    
    
    ulif's avatar
    ulif committed
    .. |bdg-build| image:: https://travis-ci.org/ulif/diceware.png?branch=master
        :target: https://travis-ci.org/ulif/diceware
        :alt: Build Status
    
    ulif's avatar
    ulif committed
    
    
    ulif's avatar
    ulif committed
    .. |bdg-last-release|  image:: https://pypip.in/version/diceware/badge.svg
        :target: https://pypi.python.org/pypi/diceware/
        :alt: Latest Release
    
    ulif's avatar
    ulif committed
    
    
    ulif's avatar
    ulif committed
    .. |bdg-versions| image:: https://pypip.in/py_versions/diceware/badge.svg
        :target: https://pypi.python.org/pypi/diceware/
        :alt: Supported Python Versions
    
    .. |bdg-license| image:: https://pypip.in/license/diceware/badge.svg
        :target: https://pypi.python.org/pypi/diceware/
        :alt: License
    
    
    .. |doc-status| image:: https://readthedocs.io/projects/diceware/badge/?version=latest
         :target: https://diceware.readthedocs.io/en/latest/
    
    ulif's avatar
    ulif committed
         :alt: Documentation Status
    
    ulif's avatar
    ulif committed
    
    
    ulif's avatar
    ulif committed
    `diceware` is a passphrase generator following the proposals of
    
    ulif's avatar
    ulif committed
    Arnold G. Reinhold on http://diceware.com . It generates passphrases
    by concatenating words randomly picked from wordlists. For instance::
    
    ulif's avatar
    ulif committed
    
    
    ulif's avatar
    ulif committed
      $ diceware
    
    ulif's avatar
    ulif committed
      MyraPend93rdSixthEagleAid
    
    ulif's avatar
    ulif committed
    
    
    ulif's avatar
    ulif committed
    The passphrase contains by default six words (with first char
    capitalized) without any separator chars. Optionally you can let
    `diceware` insert special chars into the passphrase.
    
    ulif's avatar
    ulif committed
    
    
    ulif's avatar
    ulif committed
    `diceware` supports several sources of randomness (including real life
    dice) and different wordlists (including cryptographically signed
    ones).
    
    
    ulif's avatar
    ulif committed
    .. contents::
    
    
    Install
    -------
    
    This Python package can be installed via pip_::
    
      $ pip install diceware
    
    The exact way depends on your operating system.
    
    
    
    ulif's avatar
    ulif committed
    Usage
    -----
    
    ulif's avatar
    ulif committed
    
    Once installed, use ``--help`` to list all available options::
    
      $ diceware --help
      Create a passphrase
    
    ulif's avatar
    ulif committed
      positional arguments:
        INFILE                Input wordlist. `-' will read from stdin.
    
    ulif's avatar
    ulif committed
      optional arguments:
        -h, --help            show this help message and exit
        -n NUM, --num NUM     number of words to concatenate. Default: 6
        -c, --caps            Capitalize words. This is the default.
        --no-caps             Turn off capitalization.
        -s NUM, --specials NUM
                              Insert NUM special chars into generated word.
    
    ulif's avatar
    ulif committed
        -d DELIMITER, --delimiter DELIMITER
                              Separate words by DELIMITER. Empty string by default.
    
        -r SOURCE, --randomsource SOURCE
                              Get randomness from this source. Possible values:
                              `realdice', `system'. Default: system
    
    ulif's avatar
    ulif committed
        -w NAME, --wordlist NAME
    
                              Use words from this wordlist. Possible values: `en',
    
                              `en_orig', `en_securedrop'. Wordlists are stored in
                              the folder displayed below. Default: en_securedrop
    
    ulif's avatar
    ulif committed
        --version             output version information and exit.
    
    
    ulif's avatar
    ulif committed
    
    With ``-n`` you can tell how many words are supposed to be picked for
    your new passphrase::
    
      $ diceware -n 1
    
    ulif's avatar
    ulif committed
      Thud
    
    ulif's avatar
    ulif committed
    
      $ diceware -n 2
    
    ulif's avatar
    ulif committed
      KnitMargo
    
    ulif's avatar
    ulif committed
    
    
    ulif's avatar
    ulif committed
    You can `diceware` additionally let generate special chars to replace
    characters in the 'normal' passphrase.  The number of special chars
    generated can be determined with the ``-s`` option (*default is zero*)::
    
    ulif's avatar
    ulif committed
    
      $ diceware -s 2
    
    ulif's avatar
    ulif committed
      Heroic%unkLon#DmLewJohns
    
    ulif's avatar
    ulif committed
    
    
    ulif's avatar
    ulif committed
    Here ``"%"`` and ``"#"`` are the special chars.
    
    ulif's avatar
    ulif committed
    
    
    ulif's avatar
    ulif committed
    Special chars are taken from the following list::
    
    ulif's avatar
    ulif committed
    
    
    ulif's avatar
    ulif committed
      ~!#$%^&*()-=+[]\{}:;\"'<>?/0123456789
    
    Please note that several special chars might replace the same original
    char, resulting in a passphrase with less special chars than requested.
    
    ulif's avatar
    ulif committed
    
    
    ulif's avatar
    ulif committed
    With ``-d`` you can advise `diceware` to put a delimiter string
    between the words generated::
    
      $ diceware -d "_"
      Wavy_Baden_400_Whelp_Quest_Macon
    
    By default we use the empty string as delimiter, which is good for
    copying via double click on Linux systems. But other delimiters might
    make your passphrases more readable.
    
    
    ulif's avatar
    ulif committed
    By default the single phrase words are capitalized, i.e. the first
    char of each word is made uppercase. This does not neccessarily give
    better security (1 bit at most), but it helps reading a phrase.
    
    You can nevertheless disable caps with the ``--no-caps`` option::
    
    
    ulif's avatar
    ulif committed
      $ diceware --no-caps
    
    ulif's avatar
    ulif committed
      oceanblendbaronferrylistenvalet
    
    This leads to lower-case passphrases, maybe easier to type on smart
    phones or similar.
    
    
    `diceware` supports also different sources of randomness, which can be
    chosen with the ``-r <SOURCENAME>`` or ``--randomsource <SOURCENAME>``
    option. Use the ``--help`` option to list all valid values for this
    option.
    
    
    ulif's avatar
    ulif committed
    By default we use the `random.SystemRandom`_ class of standard Python
    lib but you can also bring your own dice to create randomness::
    
    
      $ diceware -r realdice
      Please roll 5 dice (or a single dice 5 times).
      What number shows dice number 1? 2
      What number shows dice number 2? 3
      ...
      DogmaAnyShrikeSageSableHoar
    
    We support even sources of randomness from other packages. See the
    
    `documentation <https://diceware.readthedocs.io/>`_ for more details.
    
    Heartsucker's avatar
    Heartsucker committed
    `diceware` comes with an English wordlist provided by Heartsucker,
    which will be used by default and contains 8192 different words. This
    list is based off the original diceware list written by Arnold G.
    Reinhold.
    
    Both the original and 8k diceware wordlists by Mr. Reinhold are provided.
    You can enable a certain (installed) wordlist with the ``-w`` option::
    
    ulif's avatar
    ulif committed
    
      $ diceware --wordlist en_orig
      YorkNodePrickEchoToriNiobe
    
    See ``diceware --help`` for a list of all installed wordlists.
    
    If you do not like the wordlists provided, you can use your own
    one. Any `INFILE` provided will be parsed line by line and each line
    considered a possible word. For instance::
    
    ulif's avatar
    ulif committed
    
      $ echo -e "hi\nhello\n" > mywordlist.txt
      $ diceware mywordlist.txt
      HelloHelloHiHiHiHello
    
    
    ulif's avatar
    ulif committed
    With dash (``-``) as filename you can pipe in wordlists::
    
    ulif's avatar
    ulif committed
    
      $ echo -e "hi\nhello\n" > mywordlist.txt
      $ cat mywordlist.txt | diceware -
      HiHiHelloHiHiHello
    
    In custom wordlists we take each line for a valid word and ignore
    
    ulif's avatar
    ulif committed
    empty lines (i.e. lines containing whitespace characters only). Oh,
    and we handle even PGP-signed wordlists.
    
    ulif's avatar
    ulif committed
    
    
    ulif's avatar
    ulif committed
    You can set customized default values in a configuration file
    
    ulif's avatar
    ulif committed
    ``.diceware.ini`` (note the leading dot) placed in your home
    directory. This file could look like this::
    
    ulif's avatar
    ulif committed
    
      [diceware]
      num = 7
      caps = off
      specials = 2
    
      delimiter = "MYDELIMITER"
      randomsource = "system"
      wordlist = "en"
    
    ulif's avatar
    ulif committed
    
    The options names have to match long argument names, as output by
    ``--help``. The values set must meet the requirements valid for
    
    ulif's avatar
    ulif committed
    commandline usage. All options must be set within a section
    
    ulif's avatar
    ulif committed
    ``[diceware]``.
    
    
    
    ulif's avatar
    ulif committed
    What is it good for?
    --------------------
    
    Normally, `diceware` passphrases are easier to remember than shorter
    passwords constructed in more or less bizarre ways. But at the same
    time `diceware` passphrases provide more entropy as `xkcd`_ can show
    with the famous '936' proof_:
    
    .. image:: http://imgs.xkcd.com/comics/password_strength.png
       :align: center
    
       :target: http://xkcd.com/936/
    
    ulif's avatar
    ulif committed
    
    .. _xkcd: http://xkcd.com/
    .. _proof: http://xkcd.com/936/
    
    The standard english wordlist of this `diceware` implementation
    
    ulif's avatar
    ulif committed
    contains 8192 = 2**13 different english words. It is a hand-compiled
    8192-words list provided by `Heartsucker`_. Therefore, picking a
    random word from this list gives an entropy of 13 bits. Picking six
    words means an entropy of 6 x 13 = 73 bits.
    
    ulif's avatar
    ulif committed
    
    The special chars replacing chars of the originally created passphrase
    give some more entropy (the more chars you have, the more additional
    entropy), but not much. For instance, for a sixteen chars phrase you
    have sixteen possibilities to place one of the 36 special chars. That
    makes 36 x 16 possibilitities or an entropy of about 9.17 you can add.
    To get an entropy increase of at least 10 bits, you have to put a
    special char in a phrase with at least 29 chars (while at the same
    time an additional word would give you 13 bits of extra
    entropy). Therefore you might think again about using special chars in
    your passphrase.
    
    
    
    ulif's avatar
    ulif committed
    Is it secure?
    -------------
    
    The security level provided by Diceware_ depends heavily on your
    source of random. If the delivered randomness is good, then your
    passphrases will be very strong. If instead someone can foresee the
    numbers generated by a random number generator, your passphrases will
    be surprisingly weak.
    
    
    ulif's avatar
    ulif committed
    This Python implementation uses (by default) the
    `random.SystemRandom`_ source provided by Python. On Un*x systems it
    accesses `/dev/urandom`. You might want to follow reports about
    manipulated random number generators in operating systems closely.
    
    ulif's avatar
    ulif committed
    
    The Python API of this package allows usage of other sources of
    
    ulif's avatar
    ulif committed
    randomness when generating passphrases. This includes real dice. See
    the ``-r`` option.
    
    ulif's avatar
    ulif committed
    
    
    
    ulif's avatar
    ulif committed
    Developer Install
    -----------------
    
    Developers want to `fork me on github`_::
    
      $ git clone https://github.com/ulif/diceware.git
    
    We recommend to create and activate a virtualenv_ first::
    
      $ cd diceware/
      $ virtualenv -p /usr/bin/python3.3 py33
      $ source py33/bin/activate
      (py33) $
    
    We support Python versions 2.6, 2.7, 3.2, 3.3, 3.4, pypy.
    
    Now you can create the devel environment::
    
      (py33) $ python setup.py dev
    
    This will fetch test packages (py.test_). You should be able to run
    tests now::
    
      (py33) $ py.test
    
    If you have also different Python versions installed you can use tox_
    for using them all for testing::
    
      (py33) $ pip install tox   # only once
      (py33) $ tox
    
    Should run tests in all supported Python versions.
    
    
    Documentation Install
    .....................
    
    The docs can be generated with Sphinx_. The needed packages are
    installed via::
    
      (py33) $ python setup.py docs
    
    To create HTML you have to go to the ``docs/`` directory and use the
    prepared ``Makefile``::
    
      (py33) $ cd docs/
      (py33) $ make
    
    This should generate the docs in ``docs/_build/html/``.
    
    
    
    
    
    ulif's avatar
    ulif committed
    Credits
    -------
    
    Arnold G. Reinhold deserves all merits for the working parts of
    `Diceware`_. The non-working parts are certainly my fault.
    
    
    ulif's avatar
    ulif committed
    People that helped spotting bugs, providing solutions, etc.:
    
     - `Conor Schaefer (conorsch) <https://github.com/conorsch>`_
    
    ulif's avatar
    ulif committed
     - Rodolfo Gouveia suggested to activate the ``--delimiter`` option.
    
    ulif's avatar
    ulif committed
     - `drebs <https://github.com/drebs>`_ provided patches and discussion for
       different sources of randomness.
    
    ulif's avatar
    ulif committed
     - `Heartsucker <https://github.com/heartsucker>`_ hand-compiled and
       added a new english wordlist.
    
    ulif's avatar
    ulif committed
     - `dwcoder <https://github.com/dwcoder>`_ revealed and fixed bug
       #19. Also showed sound knowledge of (theoretical) entropy. A
       pleasure to work with.
    
    ulif's avatar
    ulif committed
    
    Many thanks to all of them!
    
    ulif's avatar
    ulif committed
    
    
    
    ulif's avatar
    ulif committed
    Links
    -----
    
    
    ulif's avatar
    ulif committed
    - The Diceware_ home page. Reading definitely recommended!
    
    ulif's avatar
    ulif committed
    - `fork me on github`_
    
    ulif's avatar
    ulif committed
    
    Wordlists:
    
    - `Diceware8k list`_ by Arnold G. Reinhold.
    
    - `Diceware SecureDrop list`_ by Heartsucer.
    
    ulif's avatar
    ulif committed
    
    
    License
    -------
    
    
    ulif's avatar
    ulif committed
    This Python implementation of Diceware, (C) 2015, 2016 Uli Fouquet, is
    
    ulif's avatar
    ulif committed
    licensed under the GPL v3+.
    
    The Copyright for the Diceware_ idea and the `Diceware8k list`_ are
    
    Copyright by Arnold G. Reinhold. The Copyright for the the `Diceware
    SecureDrop list`_ are copyright by Heartsucker. See file LICENSE for details.
    
    ulif's avatar
    ulif committed
    
    .. _pip: https://pip.pypa.io/en/latest/
    .. _`Diceware8k list`: http://world.std.com/~reinhold/diceware8k.txt
    .. _`Diceware`: http://diceware.com/
    
    .. _`Diceware SecureDrop list`: https://github.com/heartsucker/diceware
    
    ulif's avatar
    ulif committed
    .. _`fork me on github`: http://github.com/ulif/diceware/
    
    ulif's avatar
    ulif committed
    .. _`random.SystemRandom`: https://docs.python.org/3.4/library/random.html#random.SystemRandom
    
    ulif's avatar
    ulif committed
    .. _virtualenv: https://virtualenv.pypa.io/
    .. _py.test: https://pytest.org/
    .. _tox: https://tox.testrun.org/
    .. _Sphinx: https://sphinx-doc.org/