改进我的密码生成脚本

时间:2009-09-23 15:23:58

标签: linux bash passwords

我创建了一个小密码生成脚本。我很好奇可以对它进行哪些改进除了输入错误处理,使用信息等。这是我有兴趣看到改进的核心功能。

这就是它的作用(以及我喜欢做的事):

  1. 可以轻松更改密码中使用的小写字母(L),大写字母(U),数字(N)和符号(S)。
  2. 我希望能在两秒内为我找到一个新的legnth 10密码。
  3. 应该将密码字符串的可变长度作为参数。
  4. 只接受包含至少一个L,U,N和S的密码。
  5. 以下是代码:

    #!/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
    

3 个答案:

答案 0 :(得分:0)

您可以使用uuidgenpwgen来生成随机密码,也可以稍后将某些字母随机移动或者某种类型的东西

答案 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