跳转到主要内容

您将记住的口令。

项目描述

diceware

要记住的口令...

测试状态 | 文档 | 源代码 | 问题

diceware 是一个遵循 Arnold G. Reinhold 在 http://diceware.com 上提出的建议的口令生成器。它通过随机从单词列表中选取单词来生成口令。例如

$ diceware
MyraPend93rdSixthEagleAid

默认情况下,口令包含六个单词(首字母大写),没有任何分隔符。您可以选择让 diceware 在口令中插入特殊字符。

diceware 支持多个随机数源(包括现实生活中的骰子)和不同的单词列表(包括加密签名列表)。

安装

此Python包可以通过pip安装

$ pip install diceware

具体方式取决于您的操作系统。

使用方法

安装完成后,使用--help来列出所有可用选项

$ diceware --help
usage: diceware [-h] [-n NUM] [-c | --no-caps] [-s NUM] [-d DELIMITER]
                [-r SOURCE] [-w [NAME [NAME ...]]] [--dice-sides N] [-v]
                [--version]
                [INFILE]

Create a passphrase

positional arguments:
  INFILE                Input wordlist. `-' will read from stdin.

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.
  -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
  -w [NAME [NAME ...]], --wordlist [NAME [NAME ...]]
                        Use words from this wordlist. Possible values: `de',
                        `de_8k', `en_adjectives', `en_eff', `en_nouns',
                        `en_securedrop', `pt-br'.
                        Wordlists are stored in the folder displayed below.
                        Default: en_eff
  -v, --verbose         Be verbose. Use several times for increased verbosity.
  --version             output version information and exit.

Arguments related to `realdice' randomsource:
  --dice-sides N        Number of sides of dice. Default: 6

Wordlists are stored in <WORDLISTS-DIR>

使用-n,您可以指定新密码短语中应该选择多少个单词

$ diceware -n 1
Thud

$ diceware -n 2
KnitMargo

您还可以通过diceware额外生成特殊字符来替换“正常”密码短语中的字符。生成的特殊字符数量可以通过-s选项确定(默认为零)

$ diceware -s 2
Heroic%unkLon#DmLewJohns

在这里,“%”和“#”是特殊字符。

特殊字符来自以下列表

~!#$%^&*()-=+[]\{}:;\"'<>?/0123456789

请注意,多个特殊字符可能会替换相同的原始字符,导致密码短语中的特殊字符少于请求的数量。

使用-d,您可以建议diceware在生成的单词之间放置分隔符字符串

$ diceware -d "_"
Wavy_Baden_400_Whelp_Quest_Macon

默认情况下,我们使用空字符串作为分隔符,这在Linux系统上通过双击复制很有用。但其他分隔符可能会使密码短语更易读(并更安全,见下文的《安全陷阱》),

默认情况下,短语单词的首字母大写,即每个单词的第一个字符被转换为大写。这并不一定提供更好的熵(但可以防止由于非前缀码导致的熵损失,见下文的《安全陷阱》),这可能会提高短语的可读性。

您可以使用--no-caps选项禁用大写

$ diceware --no-caps
oceanblendbaronferrylistenvalet

这将保留输入单词不变(大写保持大写,小写保持小写)。这并不意味着所有输出单词都将是小写(除非您的单词表中的所有单词都是小写)。

由于diceware的默认列表仅包含小写术语,因此在这里--no-caps实际上意味着只输出小写,这可能更容易在智能手机等设备上输入。

diceware还支持不同的随机数源,可以使用-r <SOURCENAME>--randomsource <SOURCENAME>选项进行选择。使用--help选项列出此选项的所有有效值。

默认情况下,我们使用Python标准库中的random.SystemRandom类,但您也可以提供自己的骰子来创建随机数

$ diceware -r realdice --dice-sides 6
Please roll 5 dice (or a single dice 5 times).
Enter your 5 dice results, separated by spaces: 6 4 2 3 1
Please roll 5 dice (or a single dice 5 times).
Enter your 5 dice results, separated by spaces: 5 4 3 6 2
...
UnleveledSimilarlyBackboardMurkyOasisReplay

通常骰子有六个面。如果未使用--dice-sides,则这也是diceware的默认设置。但如果您这样做,您可以指定您的骰子有多少面(所有面)。更多的面将导致需要的掷骰次数更少。

我们甚至支持来自其他包的随机数源。有关详细信息,请参阅文档

diceware附带一个由EFF提供的英文单词列表,默认使用并包含7776(=6^5)个不同的单词。该列表注册为en_eff

此外,diceware附带一个由@heartsucker提供的英文单词列表,包含8192个不同的单词。此列表基于Arnold G. Reinhold撰写的原始diceware列表。

您可以使用-w选项启用某个(已安装的)单词表。

$ diceware --wordlist en_orig
YorkNodePrickEchoToriNiobe

查看所有已安装单词表的列表,请参阅diceware --help

您还可以使用包含的en_adjectivesen_nouns列表从形容词和名词构建短语(目前仅限英文)。为此,您需要依次指定这两个单词表。

$ diceware -n 1 -w en_adjectives en_nouns
TediousPerimeter

这些形容词/名词短语可能更容易记忆。

如果您不喜欢提供的单词表,可以使用自己的。任何提供的INFILE都会逐行解析,每一行都视为一个可能的单词。例如

$ echo -e "hi\nhello\n" > mywordlist.txt
$ diceware mywordlist.txt
HelloHelloHiHiHiHello

使用破折号(-)作为文件名,您可以输入单词表。

$ echo -e "hi\nhello\n" | diceware -
HiHiHelloHiHiHello

在自定义单词表中,我们将每一行视为一个有效单词,并忽略空行(即只包含空白字符的行)。哦,我们还处理PGP签名的单词表。

您可以在家目录中放置一个名为.diceware.ini的配置文件中设置自定义默认值(注意前面的点)。此文件可能如下所示

[diceware]
num = 7
caps = off
specials = 2
delimiter = "MYDELIMITER"
randomsource = "system"
wordlist = "en_securedrop"

选项名称必须与--help输出的长参数名称相匹配。设置的值必须满足命令行使用的有效要求。所有选项都必须在[diceware]部分内设置。

它有什么好处?

通常,diceware密码短语比以更奇特的方式构建的较短的密码更容易记忆。但与此同时,diceware密码短语提供了更多的熵,正如xkcd在著名的‘936’证明中所展示的。

http://imgs.xkcd.com/comics/password_strength.png

diceware实现的标准英文单词表包含7776 = 6^5个不同的英文单词。这是官方EFF单词表,由Joseph Bonneau编译。因此,从该列表中随机选择一个单词将给出近12.9位的熵。选择六个单词意味着熵为6 x 12.9 = 77.54位。

替换原始密码中字符的特殊字符提供了更多的熵(字符越多,附加的熵就越多),但不多。例如,对于十六个字符的短语,您有十六个可能性放置36个特殊字符中的一个。这使可能性为36 x 16,熵约为9.17。要获得至少10位的熵增加,您必须在至少29个字符的短语中放置一个特殊字符(同时一个额外的单词会为您提供13位的额外熵)。因此,您可能需要再次考虑在密码中使用特殊字符。

它安全吗?

Diceware提供的安全性水平在很大程度上取决于您的随机数源。如果提供的随机数是好的,那么您的密码短语将会非常强大。如果有人可以预测随机数生成器生成的数字,那么您的密码短语将会非常弱。

此Python实现默认使用Python提供的random.SystemRandom源。在Unix系统上,它访问/dev/urandom。您可能需要密切关注关于操作系统中被操纵的随机数生成器的报道。

此软件包的Python API允许在生成密码短语时使用其他随机数源。这包括真正的骰子。请参阅-r选项。

安全陷阱

可能存在一些问题会减少生成密码的熵。其中之一是前缀码问题。

前缀码

如果单词表包含,例如,以下单词

"air", "airport", "portable", "able"

and我们关闭了大写and分隔符字符,那么diceware可能会生成包含以下密码短语

"airportable"

这可能来自air-portableairport-able。我们无法确定,攻击者猜测的组合会更少。

为了避免这种情况,您可以启用大写字母(默认设置),使用除空字符串之外的任何单词分隔符,或者使用已检查为前缀码的en_eff单词列表(即它不包含以列表中其他单词开头的单词)。pt-br也是一个安全的前缀码

这些措施中的每一项都足以保护您免受前缀码问题。

降低熵

总的来说,diceware是一种将输入值(如骰子投掷)映射到单词列表条目的方法。我们通常希望单词列表中的每个单词被同等概率地选中用于密码短语。

但是,如果单词列表条目的数量不是骰子面的幂,这是不可能的。在这种情况下,我们会从单词列表中删除一些单词,并通知用户有关此事。以这种方式减少单词数量使得攻击者更容易猜测选中的短语。

您可以通过使用更长的单词列表来解决这个问题。

开发者安装

开发者希望在GitHub上分支我

$ git clone https://github.com/ulif/diceware.git

我们建议首先创建并激活一个虚拟环境

$ cd diceware/
$ virtualenv -p /usr/bin/python3.8 py38
$ source py38/bin/activate
(py38) $

我们支持Python版本2.7、3.4到3.9,以及pypy。

现在您可以创建开发环境

(py38) $ python setup.py dev

这将获取测试包(py.test)。您现在应该能够运行测试

(py38) $ py.test

如果您已经安装了不同的Python版本,您可以使用tox来测试它们

(py38) $ pip install tox   # only once
(py38) $ tox

应该在所有支持的Python版本上运行测试。

文档安装

可以使用Sphinx生成文档。所需软件包通过以下方式安装:

(py38) $ python setup.py docs

要创建HTML,您需要进入docs/目录并使用准备好的Makefile

(py38) $ cd docs/
(py38) $ make

这应该会在docs/_build/html/中生成文档。

创建手册页

我们提供了一个ReStructuredTexT模板来创建手册页面。当文档引擎安装后(Sphinx,见上文),您可以通过以下方式创建手册页面:

(py38) $ rst2man.py docs/manpage.rst > diceware.1

模板主要提供以简化Debian维护者的工作。目前,它不会自动更新。日期、作者、摘要等都需要手动更新。因此,手册页面中的信息可能是不正确的、过时的或误导性的。

致谢

Arnold G. Reinhold应得到Diceware有效部分的全部荣誉。不工作部分肯定是我的错。

帮助发现错误、提供解决方案等的人。

  • Conor Schaefer(conorsch)

  • Rodolfo Gouveia建议激活--delimiter选项。

  • @drebs提供了关于不同随机源和优秀的pt-br单词列表的补丁和讨论。 @drebs还发起并执行了Debian平台上的diceware的打包工作。对于这项工作表示衷心的感谢! @drebs也是diceware软件包的官方Debian维护者。

  • @heartsucker手动编译并添加了一个新的英文单词列表。

  • dwcoder揭露并修复了错误#19、#21、#23。还展示了(理论)熵的扎实知识。与他合作是一种乐趣。

  • George V. Reilly指出了新的EFF单词列表。

  • lieryan 提出了前缀码问题。

  • LogosOfJ 发现并修复了严重的 realdice 随机源问题。

  • Bhavin Gandhi 修复了给出无效输入文件名时的混淆错误信息。

  • Simon Fondrie-Teitler 贡献了一个可机器读取的版权文件,并从 @anarcat 获得了改进。

  • Doug Muth 修复了文档中的格式问题。

非常感谢他们所有人!

许可协议

这个 Diceware 的 Python 实现,(C)2015-2022 Uli Fouquet,许可协议为 GPL v3+。请参阅文件 LICENSE 以获取详细信息。

“Diceware”是 Arnold G Reinhold 的商标,在此获得许可使用。

Diceware8k 列表的版权属于 Arnold G Reinhold。版权属于 @heartsuckerDiceware SecureDrop 列表。版权属于 Joseph Bonneau 和 EFFEFF 大列表。巴西葡萄牙语的列表版权属于 @drebs。英文形容词和名词列表的版权属于 NaturalLanguagePasswords。请参阅文件 COPYRIGHT 以获取详细信息。

变更

0.10 (2022-02-15)

  • 官方支持 Python 3.8 和 Python 3.9。

  • 移除了对 pypy2、Python 2.6 和 Python 3.3 的官方支持。

  • 允许指定多个词汇表,以便创建语法有效的短语。

  • 还添加了带有英文形容词/名词的第一个词汇表,以便生成例如

  • 当使用真正的骰子时,允许一次输入多个骰子。补丁来自 Adin Hoyle

  • 添加了德语词汇表。

  • 添加了精心编制的巴西葡萄牙语词汇表。感谢 @drebs。

  • 暂时移除了原始的 diceware 词汇表,因为其中包含不当的词汇 (#85)

0.9.6 (2018-12-19)

  • 官方支持 Python 3.7。

  • 修复 #51:修复了词汇表部分的列表格式。感谢 Doug Muth

0.9.5 (2018-04-07)

  • 修复 #28:使用与 Debian 兼容的、可机器读取的版权格式。感谢 Simon Fondrie-Teitler 和 @anarcat。

  • 修复 #48:阐明 diceware 的商标状态。Reinhold 先生授予在此项目中使用名称“Diceware”以及根据问题评论中列出的条件使用该名称的许可。非常感谢他!

0.9.4 (2018-02-27)

  • 将默认日志级别设置为 ERROR(之前为 CRITICAL)

  • 修复 #44:提供简短且易读的文件未找到消息(感谢 bhavin192

  • 修复 #45:在测试运行后清理日志处理器。

  • 从默认测试套件中移除了日期相关的测试。运行 py.test -m ''tox 以运行它们。

0.9.3 (2017-09-14)

  • 修复了损坏的测试。

0.9.2 (2017-09-14)

  • 修复 #33。将 en_eff 设置为新默认词表。这导致每个词的熵略有下降(12.92位而不是13.0),但提供了前缀码和更好的记忆性单词。感谢 @anarcat 的建议。

  • 修复 #35。使 realdice 随机数源在序列长度小于骰子面数时也能提供均匀的骰子点数分布。

  • 添加了手册页。

  • 支持 Python 3.6。

  • 如果后者是前者的别名,则导入 ConfigParser 而不是 SafeConfigParser

  • 修复 #37。确保文件描述符被正确关闭。

  • 修复 #38。通过函数(而不是常量)获取词表目录以允许可重复构建。再次感谢 @drebs。

0.9.1 (2016-12-24)

  • 修复 #32,在文档中说明 --no-caps 选项不会生成小写术语。

  • 修复 #31,损坏的 realdice 随机数源。与 argparse 相关的 Bug,由 @LogosOfJ 发现并修复,非常感谢!

  • 修复 #29。在 README 中说明代码前缀问题。

  • 激活日志记录。使用 verbose 将会导致额外的输出。

0.9 (2016-09-14)

  • 添加 –dice-sides 选项,用于说明骰子提供的面数。

  • 更改 get_config_dict() 的 API 接口,以便更灵活地处理配置文件。

  • 支持不同的详细程度级别。

  • 添加了新的词表 en_eff。这是一个由电子前沿基金会提供的 7776 项列表。有关详细信息,请参阅 https://www.eff.org/deeplinks/2016/07/new-wordlists-random-passphrases。感谢 George V. Reilly 提供提示!

  • 修复 #27。允许在编号词表中使用破折号。然而,它们看起来像 1234 myterm。我们现在也接受 1-2-3-4 myterm

0.8 (2016-05-07)

  • 关闭 #23。@dwcoder 提供了一个修复方案,允许在 diceware 配置文件中使用仅空白的值,如果它们被引号包围。

  • 修复 #21。@dwcoder 揭示并修复了(再次!)这次在 CLI 或在 .diceware.ini 配置文件中设置时,–caps–no-caps 设置没有正确工作。

  • 缩短了 real-dice 随机数源。

  • 添加了记录器作为发送消息给用户的通用接口。

  • 新依赖项:用于生成文档的 sphinx_rtd_theme。这个主题曾是 Sphinx 的依赖项。

0.7.1 (2016-04-21)

  • 修复 #19。@dwcoder 揭示并修复了一个讨厌的 Bug,即在 real-dice 随机数源中。非常感谢!

0.7 (2016-04-17)

  • 添加了示例 .diceware.ini

  • 添加了新的英语词表 en_securedrop。这是新的默认列表。感谢 heartsucker 编译并添加了列表。

  • 移除对 Python 3.2 的支持。我们依赖的几个用于测试和沙盒的包已停止支持 Python 3.2。我们跟随他们。

0.6.1 (2015-12-15)

  • 较小的文档更改:添加单独的配置文件文档。

  • 修复文档:默认词表命名为 en。有关这方面的某些文档已过时。

0.6 (2015-12-15)

  • 官方支持 Python 3.5。

  • 测试不再依赖于 pytest-covpytest-xdist

  • 支持配置文件。您可以在主目录中的名为 .diceware.ini 的文件中设置不同的默认值。

  • 将词表 en_8k 重命名为 en,因为它用作英语密码短语默认项。

0.5 (2015-08-05)

  • 新选项 -r--randomsource。我们支持一个可插拔系统来定义替代的随机数源。目前支持源:“system”(从标准库检索随机数,默认)和 realdice,它允许使用真实的骰子。

  • 新增选项 -w--wordlist。我们现在为用户提供多个单词表供选择。自己的单词表可以提前输入到diceware中。默认情况下,我们仍然使用来自http://diceware.com的8192个单词列表。

  • SRC_DIR重命名为WORDLISTS_DIR(反映其含义)。

  • 使用tox配合flake8。

  • 将选项传递给get_passphrase(),而不是一串单个参数。

  • 在帮助输出中输出单词表目录。

0.4 (2015-03-30)

  • 添加–delimiter选项(感谢Rodolfo Gouveia)。

0.3.1 (2015-03-29)

  • 将以前的diceware模块转变为Python包。这是为了修复bug #1 安装期间未包含单词表,这一次是真的。从现在起,单词表将存储在diceware包内。再次感谢conorsch,他深入研究了这个问题,并提出了一个非常可行的解决方案。

  • 在文档中使用readthedocs主题。

0.3 (2015-03-28)

0.2 (2015-03-27)

  • 进行了一些文档的细微调整。

  • 更新了版权信息。

  • 添加了对自定义单词表的支持。

0.1 (2015-02-18)

  • 首次发布。

项目详情


下载文件

下载适用于您平台文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

diceware-0.10.tar.gz (284.1 kB 查看哈希)

上传时间 源代码

构建分发

diceware-0.10-py2.py3-none-any.whl (297.0 kB 查看哈希)

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面