Linux 改进我的密码生成脚本

Linux 改进我的密码生成脚本,linux,bash,passwords,Linux,Bash,Passwords,我创建了一个小的密码生成脚本。我很好奇,除了输入错误处理、使用信息等,它还能做些什么改进。这是我感兴趣的核心功能 这就是它的功能,也是我喜欢的功能: 保持容易更改密码中使用的小写字符L、大写字符U、数字N和符号S。 我希望它能在最多两秒钟内为我找到一个新密码legnth 10。 它应该以密码字符串的可变长度作为参数。 只能接受至少包含一个L、U、N和S的密码。 代码如下: #!/bin/bash PASSWORDLENGTH=$1 RNDSOURCE=/dev/urandom L="acdef

我创建了一个小的密码生成脚本。我很好奇,除了输入错误处理、使用信息等,它还能做些什么改进。这是我感兴趣的核心功能

这就是它的功能,也是我喜欢的功能:

保持容易更改密码中使用的小写字符L、大写字符U、数字N和符号S。 我希望它能在最多两秒钟内为我找到一个新密码legnth 10。 它应该以密码字符串的可变长度作为参数。 只能接受至少包含一个L、U、N和S的密码。 代码如下:

#!/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一代。看看哪些改进和建议将来自我编造的更有经验的巴什叶派,这将是一件有趣的事情

我创建了一个小的基本脚本来衡量性能:以防有人认为这很有趣

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

你可以使用或生成你的随机密码,也许以后会乱丢一些字母或类似的东西。你可以使用或生成你的随机密码,也许以后会乱丢一些字母或类似的东西。你在输入流中扔掉了一堆随机性。保留这些字节并将它们转换为您的字符集。替换密码=。。。循环中的语句包含以下内容:

ALL="$L$U$N$S"
password=$(tr "\000-\377" "$ALL$ALL$ALL$ALL$ALL" < $RNDSOURCE | head -c $PASSWORDLENGTH)

计时测试表明,该脚本的运行速度比原始脚本快5-20倍,而且从一次运行到下一次运行的时间更可预测。

您正在丢弃输入流中的大量随机性。保留这些字节并将它们转换为您的字符集。替换密码=。。。循环中的语句包含以下内容:

ALL="$L$U$N$S"
password=$(tr "\000-\377" "$ALL$ALL$ALL$ALL$ALL" < $RNDSOURCE | head -c $PASSWORDLENGTH)
计时测试表明,该脚本的运行速度比原始脚本快5-20倍,从一次运行到下一次运行的时间更可预测。

secpwgen非常好,它还可以生成更容易记住的diceware密码,但几乎从网络上消失了。我设法找到了1.3源代码的副本&

现在也是这样。

secpwgen非常好,它还可以生成更容易记住的diceware密码,但几乎已经从网络上消失了。我设法找到了1.3源代码的副本&


现在也是。

检查secpwgen或者pwgen,它已经在这样做了:我会检查所有建议,我非常感谢!不过,我确实对要使用的字符有具体的要求,我已经将它们写在纸上,并删除了那些过于相似的字符,以避免混淆。问题更多的是关于编码练习,而不是使用任何可能的方法来解决它,我想要一个Bash解决方案,该解决方案在可能未安装的非标准应用程序上具有尽可能少的依赖性;是的,因为密码生成器有缺陷?指出其中的一个错误,我会用普通邮件寄给你一张个人感谢卡-2> &1>/dev/null-我可能错了,但我认为这是倒退。您想先修改fd1,然后再复制fd2以匹配。请检查secpwgen或pwgen,它已经在这样做了:我将检查所有建议,我非常感谢!不过,我确实对要使用的字符有具体的要求,我已经将它们写在纸上,并删除了那些过于相似的字符,以避免混淆。问题更多的是关于编码练习,而不是使用任何可能的方法来解决它,我想要一个Bash解决方案,该解决方案在可能未安装的非标准应用程序上具有尽可能少的依赖性;是的,因为密码生成器有缺陷?指出其中的一个错误,我会用普通邮件寄给你一张个人感谢卡-2> &1>/dev/null-我可能错了,但我认为这是倒退。你想先修改fd1,然后复制fd2来匹配。也许吧,但它没有使用我自己脚本中使用的确切符号,这对我来说是必须的,因为我花了半个小时才想出它们。还有一个名为pwgen的应用程序随机生成密码,我可能也会研究一下。首先,我在寻找关于这个脚本是否可以用更优雅或高效的方式编写的评论。使用第三方应用程序可能是一件好事,但我实际上认为我的脚本与pwgen etc提供的任何脚本一样安全。也许吧,但它没有使用我在自己的脚本中使用的确切符号,这对我来说是必须的,因为我花了半个小时来完成
还有一个名为pwgen的应用程序可以随机生成密码,我可能也会研究一下。首先,我在寻找关于这个脚本是否可以用更优雅或高效的方式编写的评论。使用第三方应用程序可能是一件好事,但我实际上认为我的脚本与pwgen etc提供的任何脚本一样安全。虽然很可能每个组中至少有一个字符会被表示,但使用您的方法并不能保证这一点。我的目的只是替换循环的内部部分。对不起,不清楚。我相信直到条款中的grep将保证所有的类都能被表示出来。长度45及以上在现实生活中并不实用,我的脚本似乎比你的快。我想这是所有调用外部程序的盈亏平衡点。我觉得有点有趣除此之外,你的计时测试似乎是准确的。我喜欢你不使用任何外部程序的方式。我很快会再次尝试,并从你的做法中学习!谢谢你的回复@BST:您的脚本应该以与$PASSWORDLENGTH成比例的线性时间或On运行,因此是可预测和一致的@Kent:脚本的运行时间与$PASSWORDLENGTH的倒数成正比。随着长度的增加,搜索包含所需字符的成功概率会提高。但是,即使是很长的密码,也可能需要运行多次密码,因此时间是不可预测的。我不确定这个的O符号是什么。盈亏平衡点更多地与概率有关,而与外部调用的关系则更少。@Dennis:是的,我的暴力方式很慢,因为密码长度大约为一个字符,而每个组中很可能至少有一个字符会被表示,不能保证使用您的方法。我的目的只是替换循环的内部部分。对不起,不清楚。我相信直到条款中的grep将保证所有的类都能被表示出来。长度45及以上在现实生活中并不实用,我的脚本似乎比你的快。我想这是所有调用外部程序的盈亏平衡点。我觉得有点有趣除此之外,你的计时测试似乎是准确的。我喜欢你不使用任何外部程序的方式。我很快会再次尝试,并从你的做法中学习!谢谢你的回复@BST:您的脚本应该以与$PASSWORDLENGTH成比例的线性时间或On运行,因此是可预测和一致的@Kent:脚本的运行时间与$PASSWORDLENGTH的倒数成正比。随着长度的增加,搜索包含所需字符的成功概率会提高。但是,即使是很长的密码,也可能需要运行多次密码,因此时间是不可预测的。我不确定这个的O符号是什么。盈亏平衡点更多地与概率有关,而与外部调用的关系则更少。@Dennis:是的,我的暴力方式很慢,因为密码长度约为