这个用户名/密码生成器脚本的安全性可以提高吗?

描述

为了pipe理我的网站login数量巨大,我写了一个bash脚本

  1. 一个string,为我个人,确定一个特定的帐户。 例子是mylogin@stackoverflow.comthisWebsiteIVistedLately ,但它可能是任何东西。 它不必遵循一定的模式,它应该帮助我区分我想要pipe理的不同帐户。

  2. 主密码。

输出是帐户的用户名和安全密码的组合。 我不想存储任何生成的用户名/密码,也不是主密码。 因此,类似于Honey Encryption ,我希望脚本为每个input生成一个合理的结果。 如果一个坏人input了一个错误的主密码,他只会得到一个不同的用户名/密码组合,不能区分“真实”密码。

这里是我到目前为止的bash脚本:

 #!/bin/bash # robust bash scripting set -o errexit set -o nounset set -o pipefail # external programs OPENSSL=$(which openssl) SED=$(which sed) CUT=$(which cut) # get identifier read -s -p "id = " ID echo "" # read password read -s -p "pw = " PW echo "" # generate username printf "%s" "$ID" | { printf "%s" "$PW" | "$OPENSSL" enc -e -aes-256-cbc -pass stdin -salt -S "0000000000000000" -in /dev/fd/3; } 3<&0 | "$OPENSSL" dgst -sha512 -binary | "$OPENSSL" enc -base64 -A | "$SED" 's/[^a-zA-Z]//g' | "$CUT" -c -8 # generate password printf "%s" "$ID" | { printf "%s" "$PW" | "$OPENSSL" enc -e -aes-256-cbc -pass stdin -salt -S "1111111111111111" -in /dev/fd/3; } 3<&0 | "$OPENSSL" dgst -sha512 -binary | "$OPENSSL" enc -base64 -A | "$CUT" -b -32 

正如你所看到的,用户名和密码是由生成的

  1. 使用AESencryption具有给定主密码的标识符string,

  2. 使用SHA对结果进行散列,

  3. 执行base64转换,和

  4. 将用户名和密码输出到合理的格式。

我试图尽可能保证任何方面的安全。 对于标识符和密码input,使用bash内部read 。 另外,当密码inputopenssl ,使用bash内部printf 。 显然,使用的盐只是占位符。 在最后阶段,这些应该被使用脚本的人取代。

这里是一个例子(假设上面的脚本被保存为myscript.sh

 $ ./myscript.sh $ id = mylogin@stackoverflow.com $ pw = 12345 $ CbAMaZar $ XFTD9VRwQxFbU4tHKuiJvy5c18oJaDbg 

最后两行指定了生成的用户名和密码。

现在,假设有人知道我的任何事情,除了主密码( Kerckhoffs的原理 )。 坏人来了:

 $ ./myscript.sh $ id = mylogin@stackoverflow.com $ pw = 23456 $ MNLManDN $ pczRREIy9+ag/0Y7jauAWpm5sllh5sjg 

要检查这是否正确,他将不得不尝试生成的login。

现在,我的问题是如何改善这个脚本的安全性(在encryption和bash脚本方面)。 当然,如果坏人拥有root权限或者知道主密码,全部都会丢失。 这就是为什么我不打算使用这种方法来pipe理重要的帐户。

但是,如果有人知道我的帐户正确的用户名和密码( 例如通过SQL注入),应该没有(现实的)方法来find我的主密码或任何其他帐户的用户名/密码组合。 另外,系统上的任何非root用户都不可能find生成的用户名/密码对或我的主密码。

所以,对于所有的安全,密码学和程序devise师来说: 上面的脚本中是否存在安全问题,或者可以认为是“安全的”?

我一直在使用一个非常类似的方案为我的用户名/密码。 到目前为止,它对我来说工作得非常好。

我要说的第一件事就是从一个标准的密码哈希算法开始。 据我可以告诉这个应用程序没有真正的需要结合加密,你只需要得到一个不可逆的输出回到您的初始密码。 使用标准和安全的东西(不是md5),并确保你的密钥足够复杂,以避免你的密码出现在标准查找表中的机会。

我只是使用类似MyHash(key + sitename)的东西…你可以通过加密/计算一些关于sitename的东西使它更加安全,并将其重新添加回盐,但是,我个人认为这对于这个应用程序是矫枉过正的…不过,不是一个安全专家 – 这实际上取决于你使用的是什么。 你最终平衡了易用性和安全性 – 而且我可以从经验中说,你需要一个算法,你可以重新创建,如果你必须的。

从使用这几年我学到了一些东西 –

  • 很多网站喜欢执行最大的密码长度,我讨厌这些网站和他们所代表的。 我已经被迫截断我的base64编码结果19个字符来标准化的东西,所以我不必记得我的密码+任意数量的字符,他们截断。

  • 使用标准的东西,以便您可以在离开计算机时重现您的密码。

  • 有时候这个方案会随机产生一个全是字母的密码,尽管比99.9%的密码更好,但是你所使用的网站会被声明为弱/不适合。 不要太多,你可以做这个 – 我只是添加一个数字/增量,直到它停止抱怨。

我使用一个标准的用户名,所以我的方案与你有一点不同,但希望这里的一般想法可以使用。