如何在Linux中创建强密码?


24

我想知道如何在Linux上为普通用户和管理员用户创建强密码,以及是否有特定的程序可以这样做。

Answers:



16

我个人不希望使用密码生成器,因为生成的密码很难记住,但是一种可移植的解决方案是使用/ dev / urandom

创建不包含特殊字符的随机密码,长度为10个字符:

$ cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 10` 
dyxJRKldvp

通过从/ dev / urandom抓取字节,删除不符合tr命令中指定的模式的字节,并使用来将其限制为10个字符,可以正常工作head

创建包含特殊字符的随机密码,长度为10个字符:

$ cat /dev/urandom | tr -dc 'a-zA-Z0-9-_!@#$%^&*()_+{}|:<>?=' | fold -w 10 | grep -i '[!@#$%^&*()_+{}|:<>?=]' | head -n 1
MSF4wj@vP0

tr删除不需要的字节之后,这使用了一种稍有不同的技术,因为其想法是强制其至少具有一个特殊字符。通过使用fold命令将行包装为10组,然后grep仅提取包含特殊字符的行,可以实现此目的。head然后获取符合要求的第一个密码。


1
你也可以使用[:print:]trtr -dc '[:print:]'),如果你是一个有点偏执。然后,问题将出在键盘上可用的符号...
lgeorget

11

几年前,我写了这个小脚本,从那以后一直在使用它。如果有的话,这是对printfBASH 的一种有趣的滥用,它使用了BASH的一个可爱功能,不幸的是,我很少在脚本中看到它:typeset

#!/usr/bin/env bash
# Released into public domain
# Aaron Bockover, 2005
# http://abock.org

typeset -i length; length=$1
typeset -i rounds; rounds=$2
[ $rounds -lt 1 ] && rounds=1
[ $length -lt 1 ] && {
    echo "Usage: $0 <length> [<rounds>]" 2>/dev/null; exit 1;
}
for ((i=0; i < $rounds; i++)); do
    for ((j=0; j < $length; j++)); do
        set=$(($RANDOM % 20))
        if   [ $set -le 6 ];  then o=65; l=26; # 35% uppercase
        elif [ $set -le 13 ]; then o=97; l=26; # 35% lowercase
        elif [ $set -le 17 ]; then o=48; l=10; # 20% numeric
        elif [ $set -le 18 ]; then o=58; l=7;  # 10% symbolic
        elif [ $set -le 19 ]; then o=33; l=15; fi
        ord=$(($o + $RANDOM % $l))
        printf \\$(($ord / 64 * 100 + $ord % 64 / 8 * 10 + $ord % 8))
    done
    echo
done

感谢脚本亚伦!
加斯马

4

我还要添加KeePassX,它使您可以选择使用系统熵来生成具有一些不错功能的强密码-全部使用GUI。它还提供了管理密码并将其保存到加密文件的选项。

这就是KPX密码生成器界面的样子:

在此处输入图片说明


3

apg 如果您希望密码容易记住,这不是一个坏选择。

; apg -m 16 -a 0 -t
ByajNudgolIston9 (Byaj-Nud-gol-Ist-on-NINE)
Af}ockhuecUjrak8 (Af-RIGHT_BRACE-ock-huec-Uj-rak-EIGHT)
IakijKadmomIvgig (Iak-ij-Kad-mom-Iv-gig)
NutIlOsyahodBeef (Nut-Il-Os-ya-hod-Beef)
anMechOybekazell (an-Mech-Oyb-ek-az-ell)
VumushCummAd{fra (Vum-ush-Cumm-Ad-LEFT_BRACE-fra)

请注意,根据密码,您的密码至少应为12个字符。


2

我使用的是非随机的,但对于所有攻击目的而言,变化都足够大……主密码,最后一次生成其他密码。这是我生成主密码的方法。

echo -n "some seed" |  openssl dgst -binary -sha1 | base64 | sed -e 's/.\{4\}/& /g'

和输出

H1sI Wpbj JE2P CdVJ A1qb 9B/e u7M= 

现在只需选择几个部分并输入密码,重新排列它们,省去一些,添加一个或两个字符即可使其与随机性一样好。只要您能记住种子,就可以重新生成该种子并恢复密码(只要您不进行过多修改)


1

pwgen 是一个很棒的cli小工具,可让您指定许多参数来设置复杂性,字符类生成的密码数量,长度等。


1

这是用于生成XKCD样式密码短语的一次性脚本。 /usr/share/dict/words这不是一个很好的字典,因为大多数单词都很长,但是很容易获得。要获得更好的密码,您可以使用简短单词的词典,例如S / Key一次性密码单词列表

dict="/usr/share/dict/words"
max="`wc -l <"$dict"`" \
    perl -e '$count=4;
        $/=\4; while (<>) {
            print unpack('L') % $ENV{max} + 1, qq(\n); last unless --$count
        }' /dev/urandom | 
    while read n ; do 
        tail -n "+$n" "$dict" | head -1
    done

0

如果您是GNOME用户,并且还需要存储各种帐户的密码,则可以尝试使用Revelation密码管理器。它具有基本的密码生成器功能,即您只需设置密码长度并选择是否在字母和数字之外包括标点符号。


0

纠正我,如果我错了,但:据我的理解是,有没有办法一台电脑可以想出一个完全随机的字符串。因此,我提出了以下想法[并希望它不是完全愚蠢的]:

如果有人掷出26面骰子,则掷26的机会是1:26。换句话说:投掷26的机会约为0.04%。此外,骰子没有记忆且没有错误。我提出了以下想法:

  • 得到一个26面的骰子,其中每一面都匹配字母
  • 得到一个十面骰子,其中每一面都与0到9之间的数字匹配
  • 抛硬币
  • 头的意思是:扔字母骰子
  • 尾巴表示:掷数字骰子

打印出的纸模型:

注意:我不是数学专业人士,因此在阅读2600杂志上的一篇文章时对此提出了构想。我只是在基本概念上添加了一些自己的想法。

另外:我想知道这是否不仅仅是“ 编写您的第一个蛮力密码破解程序 ” 的完美示例。但是您的问题给了我提出这个想法进行讨论的完美理由。


1
实际上,有一些方法可以生成完全随机的位。例如,使用来自硬盘驱动器的电磁噪声或IO速率的变化...称为“伪随机发生器”的发生器希望通过它们运行的​​任何算法都无法将它们输出的序列与真正的随机序列区分开。多项式时间。
lgeorget 2013年

1
您可能对Diceware系统感兴趣。它遵循类似的想法,但仅使用六面骰子。 world.std.com/~reinhold/diceware.html
Jander

0

我在.zshrc.local文件中添加了两个别名以创建强密码。

第一个是:

alias pw.graph="cat /dev/urandom | tr -dc '[:graph:]' | fold -w 1000 | perl -pe 's/(.)(?=.*?\1)//g' | head -n 5"

键入pw.graph的输出是可以在键盘上键入的每个字符的五行,空格键除外:

/d=|&mRq!g$QaNZ'L;CfEli,D3\)*h-jkerzv?{y"_Ic(0BtxJwF59:@G}KV1X2o>S~[#]s+W%A.<6bpTO^uP7U4HMYn`8
RIdW87{a4O3][?&rTn=m/:Y`_u*hqy2c%s@!ZPM$5to1f-.U9ClK,)'jDi0"pw>EzN^|gX~BSAJk\VFG(H<bx}+Q6#vL;e
s^H@yEo/X$|d?_jw7-n'l>m"Cb\W5.tTe0APB1D!#69[p+(8x}F&~RM`q3Q%vhfOiUZz]ucJk:)*agGV;=NY4{,K2SLrI<
$/t|!s}og5u:X~hcJUyYHf>;l<zDedL`.T*K8]CBSW[(xw+Mm^E3r16b-97%'@jVR{ZG#0p4AP=,I?\n&"a)vqNkQ2iO_F
,7n|^Y\%MpeBqvhI3mE<9zPS/~+sU`4ZoCWl&uxd'ft"kjcOy0X!{a-T_6RKiVg5Hb21D)w>@*N8;A[(rLG=$Q:.#]FJ?}

第二个是:

alias pw.alnum="cat /dev/urandom | tr -dc '[:alnum:]' | fold -w 1000 | perl -pe 's/(.)(?=.*?\1)//g' | head -n 5"

输入pw.alnum的输出是每个可打印的字母和数字(大写和小写):

E6wgCfVBbXjyzYQ8USKl79LqPih0e5mvGrNHd3osaW2OxkJ1RM4nFTtcuZIpDA
GTvQON1dsZSpJmegBMK6bqnEciU7k0AoV2H4Wh53zr9YRfLlDxywXItu8CjPFa
6u1Db9MfyBApZdU7gqoV2PGwH5LcxWi3JNj8nkQCIThezSlYEXsOtrmF04KvaR
VFrsGwI9yAmabEnlRTKgZO23vUq4f6LHkzQP7tMjNW8ph1exuDoBCXSd50JciY
G3r6Em5tlfjQARJx9gWHes7bCVwkzcP48KaSIXyUFBMLqT0op1uDNdih2nYZOv

我通常使用pw.graph并复制该行的随机部分。一些密码不允许使用符号,因此我使用了pw.alnum的一部分。


0

我将其保存为.html文件:

<script>
var keylist="abcdefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*_"
var temp=''

function generatepass(plength){
temp=''
for (i=0;i<plength;i++)
temp+=keylist.charAt(Math.floor(Math.random()*keylist.length))
return temp
}

function populateform(enterlength){
document.pgenerate.output.value=generatepass(enterlength)
}
</script>

<form name="pgenerate">
<input type="text" size=32 name="output">
<input type="button" value="Generate Password" onClick="populateform(this.form.thelength.value)"><br />
<b>Password Length:</b> <input type="text" name="thelength" size=3 value="32">
</form>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.