密码生成实用程序
项目描述
密码
概述
passwdgen
是一个简单的密码生成实用程序,具有几个强大的额外功能(包括密码熵计算和基于熵的密码生成)。
安装
要使用passwdgen
,您需要安装 Python 3.6+。
> pip install passwdgen
如果您想passwdgen
全局访问,则需要使用sudo
/root
权限安装它:
> sudo pip install passwdgen
用法
您可以执行的最简单的密码生成命令是:
> passwdgen generate
totems-representing-sachem-tarrier
命令
要查找有关特定命令的更详细帮助,只需运行:
> passwdgen <command> --help
# For example:
> passwdgen generate --help
info
允许您计算特定密码的熵。例如,在类 UNIX 系统上,您可以简单地将密码输入到 info 命令中:
> echo "some-password" | passwdgen info
> cat /path/to/password/file | passwdgen info
如果你不输入文本passwdgen
,它会提示你在命令行输入密码:
> passwdgen info
Please enter the password to check: <type your password here>
有关密码熵的更多信息,请参阅本自述文件中有关熵的部分。
generate
生成密码。可以生成两种密码:
- 基于字典的密码(默认),或
- 基于字符的密码( 在选择此机制之前,请参阅此XKCD )。
基于字典的密码生成的一些示例:
# Generate a dictionary-based password 6 words long
> passwdgen generate -l 6
# Generate a dictionary-based password with minimum entropy 70 bits
> passwdgen generate -m 70
# Generate a dictionary-based password and copy it to the clipboard
> passwdgen generate -c
# Generate a dictionary-based password with colons (:) as a separator
> passwdgen generate -s colon
# Generate a dictionary-based password and display its entropy info
> passwdgen generate -i
# Generate a dictionary-based password based on the given starting letters
> passwdgen generate --starting-letters hello
基于字符的密码生成的一些示例:
# Generate a password 15 characters long comprising numbers and letters
> passwdgen generate -t alpha-numeric -l 15
# Generate a password 18 characters long comprising numbers, letters and
# special characters
> passwdgen generate -t special -l 18
# Generate a password 12 characters long and display its entropy info
> passwdgen generate -t special -l 12 -i
# Generate a character-based password, copy it to the clipboard, and
# display its entropy info
> passwdgen generate -t special -c -i
rng
对操作系统的伪随机数生成器 (PRNG) 进行快速测试。计算 0 到 100(含)之间的随机数的样本集(默认情况下,100 万个条目)
例如:
> passwdgen rng
Testing OS RNG. Attempting to generate 1000000 samples between 0 and 100 (inclusive). Please wait...
Statistics
----------
Mean : 49.966455 (should approach 50.000 as the sample size increases; 0.067% difference)
Standard deviation : 29.151161 (should be as close to 29.154759 as possible; 0.012% difference)
Time taken : 2.083 seconds
具有离散均匀随机分布的随机变量的预期标准偏差预计将根据 此 Wikipedia entry计算。
wordlist
目前,该命令只有一个子命令:clean
. 要获取任意单词列表(每行一个单词的文本文件)并清理它,请执行以下操作:
> passwdgen wordlist clean /path/to/input/file.txt /path/to/output/file.txt
该命令将:
- 删除空行,
- 去掉任何复数(
's
在字符串的末尾), - 将所有单词转换为小写,
- 去重条目,以及
- 按字母顺序对所有内容进行排序。
API
从您自己的 Python 项目中使用passwdgen
很容易:
import passwdgen
# Generate a dictionary-based password using the built-in dictionary
my_password = passwdgen.words()
# Generate a character-based password
my_password = passwdgen.chars()
# Generate a dictionary-based password with 6 words
long_password = passwdgen.words(word_count=6)
# Generate a dictionary-based password with minimum entropy 80
difficult_password = passwdgen.words(min_entropy=80)
# Generate a dictionary-based password with a custom dictionary
my_dictionary = passwdgen.load_word_list("/path/to/my/dict.txt")
password = passwdgen.words(my_dictionary)
passwdgen.words(dict_set, separator, word_count, min_entropy, starting_letters)
生成基于字典的密码。所有参数都是关键字参数并且是可选的:
dict_set
: 一个set
包含所有可能生成密码的单词。如果未提供,则默认为内置字典。separator
:在单词之间使用的分隔符。默认值:(-
连字符)word_count
:生成密码时要使用的字数。如果未指定min_entropy
且未指定,则默认为4
.min_entropy
:生成密码所需的最小熵。如果word_count
指定,则忽略此参数。starting_letters
:包含生成密码中每个单词的所需起始字母的字符串。注意:如果指定word_count
或min_entropy
,则此字符串必须至少包含相关数量的字符以匹配生成的单词数。否则,生成的密码将与该字符串的字符数完全相同。
返回一个字符串。
passwdgen.chars(charset, length, min_entropy)
生成基于字符的密码。所有参数都是关键字参数并且是可选的:
charset
:字符集的 ID,从中获取生成密码的字符。默认值:special
. 请参阅下面的字符集部分。length
:生成的密码中所需的字符数。如果既未length
指定也未min_entropy
指定,则默认为12
.min_entropy
:生成密码所需的最小熵。如果length
指定,则忽略此参数。
返回一个字符串。
passwdgen.load_word_list(filename, encoding)
将单词列表加载到内存中。所有参数都是关键字参数并且是可选的:
filename
:要从中加载单词的文件的路径。此文件必须是每行包含一个单词的纯文本文件。如果未指定,这会将内置字典加载到内存中。encoding
: 读取文件时使用的字符编码。
返回一个set
包含加载的单词。
passwdgen.secure_random(a, b)
使用给定的限制安全地生成一个随机数。
a
(必需):如果b
指定,则a
表示生成的随机数的下限(包括)。如果b
未指定,则a
表示生成数的上限(不包括),下限默认为0
。b
(可选):生成的随机数的上限(不包括)。
返回一个安全生成的随机数,a <= result < b
如果
b
指定,或者0 <= result < a
如果b
没有指定。
passwdgen.calculate_entropy(password, dict_set)
尝试根据预配置的字符集和字典计算给定密码的熵。
password
(必填):要计算其熵的密码。dict_set
(可选):set
包含字典的单词,要对其执行基于字典的熵计算。
返回 a dict
,其键表示测试的不同字符集的 ID,值表示相应的熵。
字符集
目前可以使用以下字符集(与
generate --charset <charset>
命令一起使用)。
dict
:基于字典的密码生成。alpha-lower
: 小写字母 (a-z
)。alpha-upper
: 大写字母 (A-Z
)。alpha
: 按字母顺序 (a-z
,A-Z
)。alpha-numeric
: 字母数字字符 (a-z
,A-Z
,0-9
)。alpha-numeric-spaced
: 字母数字字符和空格 (a-z
,A-Z
,0-9
,numeric
: 数字字符 (0-9
)。alpha-lower-sep
: 小写字母和分隔符 (a-z
,-_. ,;:
)。alpha-upper-sep
: 大写字母和分隔符 (A-Z
,-_. ,;:
)。special
: 字母数字字符和特殊字符 (a-z
,A-Z
,0-9
,-_. ,;:!@#$%^&*()+={}[]'\"\\/?<>`~
)。
熵
在信息论的背景下,熵提供了一种方便的方法来量化特定数据集中的信息量。关于密码强度,密码的熵越高,攻击者就越难猜到。
从生成器的角度来看,密码强度是通过信息源来衡量的。从攻击者的角度来看,关于生成密码的信息源(例如使用的随机数生成器的种类、密码所属的字符集)的信息越多,该密码的熵就越低。
安全随机数生成
熵计算基于随机数源质量良好(参见CSPRNG)并生成均匀分布的随机数的假设
。中使用的随机数生成器(RNG)passwd
由os.urandom()
函数提供,/dev/urandom
在 POSIX 系统和CryptGenRandom()
Windows 系统上使用。
基于字符的计算
c
此密码生成器对熵使用以下定义:大小字符字符集中的单个字符n
具有log2(n)
位熵(每个字符)。熵随着密码长度的增加而增加,即字符集中的两个字符 sizen
的组合总熵为2 x log2(n)
.
例如,如果使用小写字母a..z
作为字符集,则它具有n=26
. 每个字符将具有每个字符的
log2(26) = 4.700439718141093
位熵。因此,例如mysuperweakpassword
长度为 19 个字符的密码字符串将具有总熵19 x log2(26) = 89.31
位。
随着字符集大小的增加,一定长度的密码的熵也会增加,因为尝试暴力攻击的攻击者必须搜索更大的可能性集才能找到密码。
基于字典的计算
基于字典的熵计算方法假设攻击者事先知道密码是使用单词字典生成的,甚至知道使用了哪个字典。如果您个人用于passwdgen
生成基于字典的密码,显然会出现这种情况,因为所有代码和字典都是公开的。
在这种情况下,可以更快地执行基于字典的攻击,而不是假设字符集(这意味着具有 2 个或更多单词的密码的熵要高得多)。
例如,密码dog-far-nightly-can
长度为 19 个字符,并使用小写字母和连字符(产生 27 个可能字符的字符集)。这意味着使用完整小写字母和连字符的暴力攻击者将面临潜在的
19 x log2(27) = 90.34
比特密码熵。
但是,如果攻击者知道密码是基于字典的并且单词由连字符分隔,则攻击者只需从字典中猜测构成密码的 4 个单词。从比特攻击者的角度来看,这会导致潜在的熵4 x log2(275,185) = 72.28
(假设字典大小为 275,185 个单词)。这仍然是一个非常强大的密码,但它仍然比攻击者不知道它是基于字典的密码更容易破解。
多少熵才足够?
那么如何选择合适的熵来防止暴力攻击呢?这很难估计,因为它完全取决于攻击者可用的资源。通常,如果有人想要获取您的密码,则执行社会工程攻击会更便宜、更容易,但如果您对安全性有偏执并想要覆盖所有基础,则必须考虑攻击者可用的计算能力种类。
假设存储您的密码的任何服务都不会存储明文密码本身,而是密码的SHA-256 散列(今天的常见做法),并且攻击者设法掌握了这个 SHA-256 散列,他们将不得不尝试许多最终将匹配该 SHA-256 哈希的输入密码的可能排列。
一般来说,基于 GPU 的哈希攻击比基于 CPU 的哈希攻击要快得多
。在撰写本文时,高端 GPU 似乎能够每秒执行大约 1,000 兆哈希(即每秒 1,000,000,000 次哈希,或
10^9
每秒哈希)。
假设您生成了一个基于字典的密码,其中源字典大小为71,188 个单词。我们还假设攻击者拥有相同的源字典,并且知道您使用哪个字符来分隔密码中的单词(在本例中为连字符)。
字 | 排列 | 破解时间 | 熵 |
---|---|---|---|
2 | 5,067,660,156 | 5.07 秒 | 32.24 位 |
3 | 360,746,455,865,016 | 4.175 天 | 48.36 位 |
4 | 25,679,736,460,751,163,960 | 814年 | 64.47 位 |
5 | 1,827,986,360,222,110,855,328,640 | 57,965,067 年 | 80.6 位 |
当然,如果攻击者将工作平均分配到多个 GPU 上,破解时间会线性下降,因此 2 个 GPU 暴力破解 4 字密码需要 407 年,3 个 GPU 需要 203.5 年,10 GPU 81.4 年,100 个 GPU 8.1 年,1000 个 GPU 大约需要 9.5 个月,10,000 个 GPU 需要 29.7 天。
因此,如您所见,这实际上取决于攻击者可用的资源。但总的来说,现在,从攻击者的角度来看,熵为 80 位及以上的密码几乎是不可能破解的(因此,来自大量源字典和高质量 PRNG 的 5 字密码)。当然,这可能会改变量子计算机的时代。
字典
包含的字典是通过SCOWL (And Friends)创建的字典的“清理”(参见wordlist clean
提供的命令passwdgen
)版本,使用他们的
单词列表生成器。
目前,嵌入式词典包含71,188 个单词,确保log2(71,188) = 16.119
每个单词的比特熵。
合法的
版权所有 2000-2014 凯文·阿特金森
特此免费授予使用、复制、修改、分发和销售这些单词列表、相关脚本、从脚本创建的输出及其文档用于任何目的的许可,前提是上述版权声明出现在所有副本中,并且该版权声明和该许可声明都出现在支持文档中。凯文·阿特金森 (Kevin Atkinson) 不对这个阵列是否适用于任何目的作出任何陈述。它是“按原样”提供的,没有明示或暗示的保证。
版权所有 (c) J Ross Beresford 1993-1999。版权所有。
对本出版物的使用有以下限制:如果在软件包中使用 UK Advanced Cryptics Dictionary 或以任何形式重新分发,则必须突出显示版权声明,并且必须逐字包含本文档的文本。
没有其他限制:我希望尽可能广泛地分发该列表。
在 SCOWL 的创建过程中使用了许多资源,其中大部分都在公共领域或间接使用。如需完整列表,请参阅 SCOWL 自述文件。
参考
在构建密码生成器时参考了以下来源:
执照
麻省理工学院许可证 (MIT)
版权所有 (c) 2016 Thane Thomson
特此免费授予任何人获得本软件和相关文档文件(“软件”)的副本,以不受限制地处理本软件,包括但不限于使用、复制、修改、合并的权利、发布、分发、再许可和/或出售本软件的副本,并允许向其提供本软件的人这样做,但须符合以下条件:
上述版权声明和本许可声明应包含在本软件的所有副本或大部分内容中。
本软件按“原样”提供,不提供任何形式的明示或暗示保证,包括但不限于适销性、特定用途适用性和非侵权保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任承担任何责任,无论是在合同、侵权或其他方面,由本软件或本软件的使用或其他交易引起或与之相关。软件。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。