我创建了一个小密码生成脚本。我很好奇可以对它进行哪些改进除了输入错误处理,使用信息等。这是我有兴趣看到改进的核心功能。
这就是它的作用(以及我喜欢做的事):
以下是代码:
#!/bin/bash
PASSWORDLENGTH=$1
RNDSOURCE=/dev/urandom
L="acdefghjkmnpqrtuvwxy"
U="ABDEFGHJLQRTY"
N="012345679"
S="\-/\\)?=+.%#"
until [ $(echo $password | grep [$L] | grep [$U] | grep [$N] | grep -c [$S] ) == 1 ]; do
password=$(cat $RNDSOURCE | tr -cd "$L$U$N$S" | head -c $PASSWORDLENGTH)
echo In progress: $password # It's simply for debug purposes, ignore it
done
echo Final password: $password
我的问题是:
让我们对最完善的版本进行投票。 : - )
对我来说,这只是一个主要是为了娱乐而且作为学习经验的练习,虽然我将开始使用它而不是我现在使用的KeepassX的一代。看看哪些改进和建议来自更有经验的Bashistas(我提出了这个词)将会很有趣。
我创建了一个基本的小脚本来衡量绩效:(如果有人认为这很有趣)
#!/bin/bash
SAMPLES=100
SCALE=3
echo -e "PL\tMax\tMin\tAvg"
for p in $(seq 4 50); do
bcstr=""; max=-98765; min=98765
for s in $(seq 1 $SAMPLES); do
gt=$(\time -f %e ./genpassw.sh $p 2>&1 1>/dev/null)
bcstr="$gt + $bcstr"
max=$(echo "if($max < $gt ) $gt else $max" | bc)
min=$(echo "if($min > $gt ) $gt else $min" | bc)
done
bcstr="scale=$SCALE;($bcstr 0)/$SAMPLES"
avg=$(echo $bcstr | bc)
echo -e "$p\t$max\t$min\t$avg"
done
答案 0 :(得分:0)
答案 1 :(得分:0)
你在输入流中丢掉了一堆随机性。保留这些字节并将它们转换为您的字符集。用以下代码替换循环中的password = ...语句:
ALL="$L$U$N$S"
password=$(tr "\000-\377" "$ALL$ALL$ALL$ALL$ALL" < $RNDSOURCE | head -c $PASSWORDLENGTH)
重复$ ALL是为了确保“map to”设置中有> = 255个字符。
我也删除了对猫的无偿使用。
(编辑以澄清上面显示的内容并不是要取代完整的脚本,只是内部循环。)
编辑:这是一个很多更快的策略,不会调用外部程序:
#!/bin/bash
PASSWORDLENGTH=$1
RNDSOURCE=/dev/urandom
L="acdefghjkmnpqrtuvwxy"
U="ABDEFGHJLQRTY"
N="012345679"
# (Use this with tr.)
#S='\-/\\)?=+.%#'
# (Use this for bash.)
S='-/\)?=+.%#'
ALL="$L$U$N$S"
# This function echoes a random index into it's argument.
function rndindex() { echo $(($RANDOM % ${#1})); }
# Make sure the password contains at least one of each class.
password="${L:$(rndindex $L):1}${U:$(rndindex $U):1}${N:$(rndindex $N):1}${S:$(rndindex $S):1}"
# Add random other characters to the password until it is the desired length.
while [[ ${#password} -lt $PASSWORDLENGTH ]]
do
password=$password${ALL:$(rndindex $ALL):1}
done
# Now shuffle it.
chars=$password
password=""
while [[ ${#password} -lt $PASSWORDLENGTH ]]
do
n=$(rndindex $chars)
ch=${chars:$n:1}
password="$password$ch"
if [[ $n == $(( ${#chars} - 1 )) ]]; then
chars="${chars:0:$n}"
elif [[ $n == 0 ]]; then
chars="${chars:1}"
else
chars="${chars:0:$n}${chars:$((n+1))}"
fi
done
echo $password
时序测试表明,这比原始脚本快5-20倍,从一次运行到下一次运行的时间更加可预测。
答案 2 :(得分:0)
diceware
非常好(它还可以生成更容易记住1.3 source
个密码) - 但几乎从网上消失了。我设法找到{{1}}&amp;的副本。 gotoScene() function
现在也是put it on github。