lan*_*oni 377 password string random
我想生成一个随机字符串(例如密码、用户名等)。应该可以指定所需的长度(例如 13 个字符)。
我可以使用哪些工具?
(出于安全和隐私原因,最好是离线生成字符串,而不是在网站上在线生成。)
小智 362
我最喜欢的方法是使用/dev/urandomwithtr删除不需要的字符。例如,只获取数字和字母:
tr -dc A-Za-z0-9 </dev/urandom | head -c 13 ; echo ''
Run Code Online (Sandbox Code Playgroud)
或者,从OWASP 密码特殊字符列表中包含更多字符:
tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' </dev/urandom | head -c 13 ; echo
Run Code Online (Sandbox Code Playgroud)
如果您在tr抱怨输入时遇到一些问题,请尝试添加LC_ALL=C以下内容:
LC_ALL=C tr -dc 'A-Za-z0-9!"#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' </dev/urandom | head -c 13 ; echo
Run Code Online (Sandbox Code Playgroud)
400*_*Cat 272
我正在使用openssl命令,密码学的瑞士军刀。
openssl rand -base64 12
Run Code Online (Sandbox Code Playgroud)
或者
openssl rand -hex 12
Run Code Online (Sandbox Code Playgroud)
lan*_*oni 176
要生成随机密码,您可以使用pwgen:
pwgen 生成随机的、无意义但可发音的密码。这些密码要么只包含小写字母,要么包含大小写混合,要么包含数字。大写字母和数字的放置方式可以在只记住单词时轻松记住它们的位置。
生成 7 个长度为 13 的密码:
geek@liv-inspiron:~$ pwgen 13 7
Eu7Teadiphaec giepahl3Oyaiy iecoo9Aetaib4 phaiChae6Eivi athoo3igee8Co
Iphu4ufeDeelo aesoYi2lie9he
Run Code Online (Sandbox Code Playgroud)
如评论中所述,您可以通过使用-s参数来避免减少熵(即生成更安全、完全随机但难以记住的密码):
geek@liv-inspiron:~$ pwgen -s 13 7
eAfycrPlM4cYv 4MRXmZmyIVNBp D8y71iqjG7Zq7 FQRHcserl4R8O yRCUtPtV3dsqV
0vJpp2h0OrgF1 QTp7MKtJyTrjz
Run Code Online (Sandbox Code Playgroud)
要生成随机用户名,您可以使用gpw:
这个包生成可发音的密码。它使用从您提供给它的任何词典中获取的三字母组合(三合字母)的统计数据。
生成 7 个长度为 13 的密码(用户名):
geek@liv-inspiron:~$ gpw 7 13
sreepoidahsas
risadiestinge
ntodynesssine
deodstestress
natinglumperm
riasigentspir
enderiferback
Run Code Online (Sandbox Code Playgroud)
小智 29
这是方法,我做到了。它生成 10 个字符的随机字符串。您可以通过用其他字符串处理工具替换“折叠”来优化它。
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1
Run Code Online (Sandbox Code Playgroud)
小智 22
受 Pablo Repetto 的启发,我最终得到了这个易于记忆的解决方案:
shuf -zer -n20 {A..Z} {a..z} {0..9}
Run Code Online (Sandbox Code Playgroud)
-z 避免多行输出
-e 回显结果
-r 允许任何字符出现多次
-n20 长度为 20 个字符的随机字符串
{A..Z} {a..z} {0..9} 允许的字符类
shuf 是 linux coreutils 的一部分,可广泛使用或至少已移植。
drw*_*rws 19
要使用我使用的每个发行版中内置的标准 Linux 工具生成具有最高熵的密码:
< /dev/urandom tr -cd "[:print:]" | head -c 32; echo
Run Code Online (Sandbox Code Playgroud)
这将输出所有 ASCII 可打印字符 - 从 32(空格)到 126(波浪号,~.)。密码长度可以通过head's-c标志控制。还有其他可能的字符集tr(不包括空格,只有字符 33-126,使用[:graph:])。
ter*_*don 14
根据你想要的随机性的水平,你可以简单地使用bash的(也去zsh和ksh,可能还有其他)内置$RANDOM变量:
$ echo $RANDOM | tr '[0-9]' '[a-z]'
bfeci
$ echo $RANDOM | tr '[0-9]' '[a-z]'
cijjj
Run Code Online (Sandbox Code Playgroud)
直接读取的方法/dev/urandom要简单得多,但为了完成,您也可以使用$RANDOM:
echo $(for((i=1;i<=13;i++)); do printf '%s' "${RANDOM:0:1}"; done) | tr '[0-9]' '[a-z]'
Run Code Online (Sandbox Code Playgroud)
重要提示:此解决方案将仅使用字母表的前 10 个字母生成随机字符串。这对你来说是否足够取决于你需要它做什么。
小智 12
使用xxd命令指定长度(通过 -l),这在 Linux 和 OS 中都有效。
https://www.howtoforge.com/linux-xxd-command/
xxd -l16 -ps /dev/urandom
Run Code Online (Sandbox Code Playgroud)
APG 在某些 Linux 发行版中默认包含。
要在子集 Special、Numeric、Capital 和 Lower 中生成大小从 5 到 10 的密码,命令是:
apg -MSNCL -m 5 -x 10
Run Code Online (Sandbox Code Playgroud)
并返回
@OpVeyhym9
3:Glul
3DroomIc?
hed&Os0
NefIj%Ob3
35Quok}
Run Code Online (Sandbox Code Playgroud)
正如@landroni 在评论中所说。
@Brandin 在对另一个答案的评论中解释了如何从/dev/urandom使用head -c 100. 另一种方法是使用dd:
tr -dc A-Za-z0-9 < /dev/urandom | dd bs=100 count=1 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
将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
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用md5具有此目的的工具之一。在创建完全随机密码的情况下,您可以使用md5pass. 这是一个使用起来非常简单且非常有用的工具,因为您可以将“普通文本”与“盐”一起使用来跳转位构造相同的密码,然后您可以恢复,或者您可能想要获得一个完整的密码一直是随机密码。一般用法是:
md5pass [password] [salt]
Run Code Online (Sandbox Code Playgroud)
其中password是将用于构建随机字符串的选定单词,并且salt是要使用的字节跳转。像这样:
md5pass word
$1$.MUittVW$j.XDTF1QRnxqFdXRUiSLs0
Run Code Online (Sandbox Code Playgroud)
这将创建一个“随机序列”密码供您使用。如果您使用 no salt,则之后您可能无法重新创建相同的字符串。
但是,如果您使用salt这样的:
md5pass word 512
$1$512$.0jcLPQ83jgszaPT8xzds0
Run Code Online (Sandbox Code Playgroud)
然后您可以创建一个序列,如果您将单词与最初定义的相同盐(或跳转)结合使用,则可以恢复该序列。
小智 5
这两个命令分别生成随机密码和密码短语。
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' ' '
Run Code Online (Sandbox Code Playgroud)
密码生成器需要一个 file_with_characters ,其中包含您希望密码使用的所有字符,每行一个字符,并且每个字符恰好一次。文件不得包含空行,并且行必须以换行符终止。
密码短语生成器需要一个 file_with_words ,其中包含您希望密码短语使用的所有单词,每行一个单词,并且每个单词恰好一次。文件不得包含空行,并且行必须以换行符终止。
--head-count 选项指定密码的长度(以字符为单位)或密码短语(以单词为单位)。
小智 5
我发现在 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
Run Code Online (Sandbox Code Playgroud)
我用:
base64 < /dev/urandom | tr -d 'O0Il1+/' | head -c 44; printf '\n'
这给了我 57 个可能的字符。字符串可以复制粘贴(删除+和``)或打印并重新键入,因为难以区分的字符 ( I1lO0) 已被删除。
我喜欢这个因为:
归功于https://unix.stackexchange.com/a/230676/9583,尤其是我最初灵感的评论。