我想生成一个随机字符串(例如密码,用户名等)。应该可以指定所需的长度(例如13个字符)。
我可以使用哪些工具?
(出于安全和隐私方面的考虑,字符串最好是离线生成,而不是在网站上在线生成。)
apg
其生成随机字符串。
我想生成一个随机字符串(例如密码,用户名等)。应该可以指定所需的长度(例如13个字符)。
我可以使用哪些工具?
(出于安全和隐私方面的考虑,字符串最好是离线生成,而不是在网站上在线生成。)
apg
其生成随机字符串。
Answers:
我最喜欢的方法是/dev/urandom
与一起使用tr
以删除不需要的字符。例如,仅获取数字和字母:
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo ''
或者,要包含OWASP密码特殊字符列表中的更多字符,请执行以下操作:
</dev/urandom tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' | head -c 13 ; echo
如果您在tr
抱怨输入方面遇到一些问题,请尝试LC_ALL=C
像这样添加:
LC_ALL=C tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' </dev/urandom | head -c 13 ; echo
head /dev/urandom | tr -dc A-Za-z0-9 | head -c10
-这样更准确。您会获得10个大写,小写或数字字符
head
命令可能有问题。它将输出来自的前10行/dev/urandom
,这意味着一旦看到第10行,它将停止。因此,发送到tr
命令的输出长度是随机的。的输出中少于13个字符的可能tr
。我还没有计算出发生这种情况的可能性,计算有些棘手。
<dev/urandom tr -dc "$charset" | head -c "$length"
tr -dc A-Za-z0-9\!\"#$\&\'\(\)\*+,-./\:\\\\\;\<=\>\?@[]^_`{\|}~
tr ..
命令,而只是引用所有内容(单引号除外)都可以tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~'
。
要生成随机密码,您可以使用pwgen
:
pwgen生成随机的,无意义的但可发音的密码。这些密码仅包含小写字母,大写和小写字母混合或输入数字。大写字母和数字的放置方式便于在仅记忆单词时记住它们的位置。
生成7个长度为13的密码:
geek@liv-inspiron:~$ pwgen 13 7
Eu7Teadiphaec giepahl3Oyaiy iecoo9Aetaib4 phaiChae6Eivi athoo3igee8Co
Iphu4ufeDeelo aesoYi2lie9he
如评论中所述,您可以通过使用-s
参数来避免降低熵(即生成更安全,完全随机但难以记住的密码):
geek@liv-inspiron:~$ pwgen -s 13 7
eAfycrPlM4cYv 4MRXmZmyIVNBp D8y71iqjG7Zq7 FQRHcserl4R8O yRCUtPtV3dsqV
0vJpp2h0OrgF1 QTp7MKtJyTrjz
要生成随机用户名,您可以使用gpw
:
该软件包生成明显的密码。它使用从提供的任何字典中获得的三字母组合(三边形)的统计信息。
生成长度为13的7个密码(用户名):
geek@liv-inspiron:~$ gpw 7 13
sreepoidahsas
risadiestinge
ntodynesssine
deodstestress
natinglumperm
riasigentspir
enderiferback
pwgen -s
。
我正在使用openssl
命令,这是瑞士密码学的军刀。
openssl rand -base64 12
要么
openssl rand -hex 12
rand -hex
会将输出限制为仅16个字符,而不是键盘上的90+。base64更好,因为它是64个字符,但不是随机的(例如,有可预见的填充模式,也许某些字符比其他字符更频繁地出现)。
openssl rand -base64 12
产生16个字符的输出(因为256个值映射到64个)。十六进制示例产生24个字符。十六进制的情况是没有损失的,因为它是一个简单的1:2映射,但在base64的情况下可能会有所损失,因为使用了填充。基数不影响随机性,这是一个映射到另一个的方式。(总位数非常重要)。
这是我的方法。它生成10个字符的随机字符串。您可以通过用其他字符串处理工具替换“ fold”来优化它。
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1
/dev/urandom
当然要减去使用
为了使用我在每个发行版中内置的标准Linux工具生成具有最大熵的密码,我使用:
< /dev/urandom tr -cd "[:print:]" | head -c 32; echo
这将输出所有ASCII可打印字符-从32(空格)到126(波浪号,~
)。密码的长度可以与所述被控制head
的-c
标志。中还有其他可能的字符集tr
(不包括空格,仅使用字符33-126,请使用[:graph:]
)。
< /dev/urandom tr -cd '[:graph:]'| tr -d '\\' | head -c 32; echo
如果您不想要` characters in generated string.
`,因为在许多语言中都是转义字符会导致问题
< /dev/urandom tr -cd "[:print:]" | tr -d ' \\/\`\|' | head -c 32; echo
排除| \ /`和空间
根据所需的随机性级别,您可以简单地使用bash的内置变量(zsh
以及和ksh
,可能还有其他$RANDOM
变量):
$ echo $RANDOM | tr '[0-9]' '[a-z]'
bfeci
$ echo $RANDOM | tr '[0-9]' '[a-z]'
cijjj
直接读取的方法/dev/urandom
要简单得多,但是为了完整起见,您还可以使用$RANDOM
:
echo $(for((i=1;i<=13;i++)); do printf '%s' "${RANDOM:0:1}"; done) | tr '[0-9]' '[a-z]'
重要提示:此解决方案仅使用字母的前10个字母生成随机字符串。对于您而言,这是否足够取决于您所需要的。
$RANDOM
将打印0和32767之间的数
rand=$(head -c 100 /dev/urandom | tr -dc A-Za-z0-9 | head -c13)
。
@Brandin在注释中解释到另一个回答如何从获得最多100个字节/dev/urandom
使用head -c 100
。另一种方法是dd
:
tr -dc A-Za-z0-9 < /dev/urandom | dd bs=100 count=1 2>/dev/null
将2>/dev/null
在年底dd
命令是抑制输出“......在/ ...记录了记录”。
我不知道这两种方法之间的任何实质性优点/缺点。
tr
抱怨输入的两种方法都存在问题。我以为这是因为它不喜欢接受二进制输入,因此建议先过滤/dev/random
用iconv -c -t US
。但是,吉尔斯提出了另一种诊断和解决方案,对我有用:
LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | dd bs=100 count=1 2>/dev/null
iconv
解决方案最大化了一个CPU内核,并且没有产生输出(我等了10
libc-bin
2.19 提供。我不确定是否是相同的
tr
支持二进制输入。但是,类似的范围A-Z
可能会受到区域设置的影响。试试LC_ALL=C tr …
tr
支持,因为它根本不支持多字节(例如,上次我检查它的大小写更改是通过简单地设置每个字节的第六位来实现的)。其他系统(例如BSD)确实支持多字节,并且在那里失败,因为在大多数编码中,随机输入流也是有效的多字节流的机会很小。GNU 可能会在任何给定时刻添加多字节支持,这将失败。当然,设置LC_ALL=C
可以解决该问题。
tr
处理二进制输入(在C语言环境中)。(好吧,好吧,它只是明确表示要支持空字节,并不是说要支持不以换行符结尾的非空文件,但实际上总是如此。)
您可以使用md5
具有此目的的工具之一。在创建完全随机的密码的情况下,您可以使用md5pass
。这是一个非常简单易用的工具,对您很有帮助,因为您可以将“普通文本”与“盐”一起使用,以跳跃式构造相同的密码,然后在以后恢复该密码,或者,您可能希望获得一个完整的密码。始终提供随机密码。一般用法是:
md5pass [password] [salt]
其中password
是用于构建随机字符串的选定单词,是要使用的salt
字节跳数。像这样:
md5pass word
$1$.MUittVW$j.XDTF1QRnxqFdXRUiSLs0
这将创建一个“随机序列”密码供您使用。如果使用no salt
,则以后可能无法重新创建相同的字符串。
但是,如果您使用salt
这样的话:
md5pass word 512
$1$512$.0jcLPQ83jgszaPT8xzds0
那么您可以创建一个序列,如果您将该词与最初定义的相同盐(或跳跃)结合使用,则可以恢复该序列。
salt
,这听起来类似于PasswordMaker的方法...
使用xxd
命令指定长度(通过-l),该长度在Linux和OS中均适用。
https://www.howtoforge.com/linux-xxd-command/
xxd -l16 -ps /dev/urandom
这两个命令分别生成随机密码和密码短语。
shuf --random-source=/dev/urandom --repeat --head-count=20 file_with_characters | tr --delete '\n'
shuf --random-source=/dev/urandom --repeat --head-count=7 file_with_words | tr '\n' ' '
密码生成器需要一个file_with_characters,其中包含您希望密码使用的所有字符,每行一个字符,每次精确一次。该文件不得包含空行,并且行必须以换行符结尾。
密码短语生成器需要一个file_with_words,其中包含您希望密码短语使用的所有单词,每行一个单词,每个单词恰好一次。该文件不得包含空行,并且行必须以换行符结尾。
--head-count选项指定密码的长度(以字符为单位)或密码短语(以单词为单位)。
我发现在MacOS上将/ dev / urandom传递给tr无效。这是另一种方式:
set="abcdefghijklmonpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
n=6
rand=""
for i in `seq 1 $n`; do
char=${set:$RANDOM % ${#set}:1}
rand+=$char
done
echo $rand
我用:
base64 < /dev/urandom | tr -d 'O0Il1+\' | head -c 44
这给了我57个可能的字符。由于已删除难以区分的字符(),因此可以复制粘贴(删除+
和\
)字符串或打印并重新输入该字符串I1lO0
。
我喜欢这是因为:
归功于https://unix.stackexchange.com/a/230676/9583,尤其是对我最初灵感的评论。
1
而不降低熵(生成一个新的数字以获得一个w / a的数字确实会降低熵)。您也可以安全地附加一个!
而不降低熵。两种方案都不会增加熵的价值,但是会使生成的字符串符合较早的密码要求。
在这种情况下,Unix的哲学“很多能做一件事情的小工具”可以很好地为您服务。
/dev/urandom
是随机 “字节”(包括不可打印的字符)的流base64
将字节数据编码为 [A-Za-z0-9/+]
(可以完全打印)dd
将输入复制到作为参数提供的应用修饰符的输出(可以包括块大小和块数)OSX
base64 < /dev/urandom | dd bs=1k count=1
的Linux
base64 -w0 < /dev/urandom | dd bs=1k count=1
笔记:
tr -d '[A-Z/+]'
摆脱大写字母+
和/
bs
(块大小)设置为所需的任何长度。base64
默认情况下换行为76列,-w0
除非需要,否则必须重新设置。我想贡献我通常的命令来生成密码
$ cat /dev/urandom | base64 | head -n 1 |tr -dc '[:alnum:]' |cut -c -13
b0R55751vWW9V
要配置密码的长度,请将cut命令中的数字更改为所需的长度,例如24个字符
$ cat /dev/urandom | base64 | head -n 1 |tr -dc '[:alnum:]' |cut -c -24
WFBhVHuKbrnRhd5kdWXPzmZG
不想混淆0或O,1或l?用另一个过滤掉tr
$ cat /dev/urandom | base64 | head -n 1 |tr -dc '[:alnum:]' | tr -d '0O1l'|cut -c -24
JuCphwvhrhppD9wVqfpP2beG
我个人从不喜欢在密码中使用特殊字符,这就是为什么我只选择[:alnum:]
密码生成器
我secpwgen
使用Alpine Linux进行维护,并将源代码保存在我的Github中。
它可以产生随机的字符串或骰子短语:
musl64 [~]$ secpwgen
USAGE: secpwgen <-p[e] | -A[adhsy] | -r | -s[e]> N
PASSPHRASE of N words from Diceware dictionary
-p generate passphrase
-pe generate enhanced (with symbols) passphrase
SKEY PASSWORD of N words from S/Key dictionary
-s generate passphrase
-se generate enhanced (with symbols) passphrase
ASCII RANDOM of N elements (at least one option MUST be present)
-A Each letter adds the following random elements in output:
a alphanumeric characters
d decimal digits
h hexadecimal digits
s special characters
y 3-4 letter syllables
RAW RANDOM
-r output BASE64 encoded string of N random BITS
-k output koremutake encoding of N random BITS
要生成一个13个字符的随机字符串,您可以使用:
musl64 [~]$ secpwgen -Aas 13
----------------
WK5#*V<]M3<CU ;ENTROPY=67.21 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.
musl64 [~]$ secpwgen -Aa 13
----------------
GP0FIEBM9Y3BT ;ENTROPY=67.21 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.
为了使用户记住密码,请使用diceware短语:
musl64 [~]$ secpwgen -p 5
----------------
wq seen list n8 kerr ;ENTROPY=65.00 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.
我个人喜欢:
musl64 [~]$ secpwgen -r 512
----------------
h62lL7G4gwh3/j9c7YteQvVXoqJrQKKPWVR3Lt7az36DcfWZWtUgBT19iwmJBwP4UahNzPe7qYD7OcklUFpCzQ== ;ENTROPY=512.00 bits
----------------
INFO: destroying random number generator.
INFO: zeroing memory.
我使用非常安全的密码(其中pw长度为16)的方式:
cat /dev/urandom | tr -cd [:graph:]|head -c 16
结果示例:
jT@s_Nx]gH<wL~W}
或者,生成多个密码:
猫/ dev / urandom | tr -cd [:graph:] | fold -w 16 | head -6
结果示例:
7ck%G7'|f&}_8(]s
<?*]E.CG[NB'gK#A
:tF-WPTOa3!i7S(h
2xy(>=%3=Kb1B$`6
*98Lf{d?Jzb}6q1\
E7uCEAN2Hz]]y|5*
安全性稍差(字符集较小):
cat /dev/urandom |base64 -w 0|fold -w 16|head -6
结果示例:
rJqYxYZLOTV+A45w
PUKQ+BoBf6yfZw5m
+LRfpsN9CsLRiN8V
yMS6zDpL6NHmG17s
yTUWPG7Rum97schi
cognvjVwaKaAyPRK
一种超级简单的方法(可能比您想要的简单)可以实现此目的,即生成给定范围内的随机数,将该数字转换为等效的ASCII字符,然后将其附加到字符串的末尾。
这是Python中的一个基本示例:
import random # import random library
passFile = open("passwords.txt", 'w') # create file passwords.txt
passNum = int(input("Number of passwords: ")) # get number of passwords
passLength = int(input("Password length: ")) # get length of passwords
for i in range(passNum):
password = "" # reset password
for i in range(passLength):
num = random.randint(65, 122) # get random number
while num in range(91, 97): # Don't include punctuation
num = random.randint(65, 122)
password += chr(num) # add character to current password
passFile.write(password + "\n") # add current password to file
passFile.close() # close file
编辑:添加注释,并添加代码以生成多个密码并将其写入文件
我想要以下命令:
date +%s | sha256sum | base64 | head -c 12
date +%N
因为如果您在脚本中生成许多用户和密码,那么对于许多甚至所有日期命令而言,秒数都可能变为相同,从而生成相同的密码。
dd if=/dev/random bs=512 count=1
?
我可以访问 http://passwordsgenerator.net/, 它允许生成最多2048个字符的随机字符字符串,选择大写,小写,数字0到9,标点符号或任何组合。
apg
个人使用。)