Linux 是否可以改进此用户名/密码生成器脚本的安全性? 描述
为了管理大量的网站登录,我编写了一个bash脚本,它需要Linux 是否可以改进此用户名/密码生成器脚本的安全性? 描述,linux,bash,security,cryptography,openssl,Linux,Bash,Security,Cryptography,Openssl,为了管理大量的网站登录,我编写了一个bash脚本,它需要 对我个人来说,标识某个帐户的字符串。例如mylogin@stackoverflow.com或此网站是独立的,但它可能是任何内容。它不必遵循特定的模式,它只应该帮助我区分我想要管理的不同帐户 主密码 输出是帐户的用户名和安全密码的组合。我不想存储任何生成的用户名/密码,也不想存储主密码。因此,与类似,我希望脚本为每个输入生成合理的结果。如果一个坏人输入了一个错误的主密码,他只会得到一个不同的用户名/密码组合,与“真实的”密码不可区分 以下是
mylogin@stackoverflow.com
或此网站是独立的
,但它可能是任何内容。它不必遵循特定的模式,它只应该帮助我区分我想要管理的不同帐户#!/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
最后两行指定生成的用户名和密码
现在,假设有人知道关于我的任何事情,除了主密码()。坏家伙来了:
$ ./myscript.sh
$ id = mylogin@stackoverflow.com
$ pw = 23456
$ MNLManDN
$ pczRREIy9+ag/0Y7jauAWpm5sllh5sjg
要检查这是否正确,他必须实际尝试生成的登录
问题:
现在,我的问题是如何提高这个脚本的安全性(在加密和bash脚本方面)。当然,如果坏人有根访问权限或者知道主密码,那么所有的东西都会丢失。这就是我不打算使用这种方法管理重要客户的原因
但是,如果有人知道我的帐户的正确用户名和密码(例如,通过SQL注入),则应该没有(现实的)方法来查找我的主密码或任何其他帐户用户名/密码组合。此外,系统上的任何非root用户都不可能找到生成的用户名/密码对或我的主密码
因此,对于So的所有安全、加密和编程专家:上面的脚本中是否存在任何安全问题,或者是否可以将其视为“安全的”我对我的用户名/密码使用了非常类似的方案。到目前为止,它对我非常有效 我要说的第一件事是从一个标准的加密哈希算法开始。据我所知,对于这个应用程序,没有真正需要与加密结合,您只需要获得一个不可恢复到初始密码的输出。使用标准和安全的东西(不是md5),并确保您的密钥足够复杂,以避免您的密码出现在标准查找表中 我只是使用类似MyHash(key+sitename)的东西。。。您可以通过加密/计算站点名称以外的内容并将其添加回salt来提高安全性,但是,我个人认为这对于这个应用程序来说是过分了。。。虽然不是安全专家,但这取决于你使用它的目的。最终,您需要在易用性和安全性之间取得平衡——根据经验,我可以说,您需要一种算法,如果必须的话,您可以重新创建该算法 几年来,我从中学到了一些东西-
- 很多网站喜欢强制执行最大密码长度,我讨厌这些网站和它们所代表的一切。我被迫将base64编码结果截断为19个字符,以实现标准化,这样我就不必记住我的密码+它们截断为的任意字符数
- 使用一些标准的东西,这样当你离开你的电脑时,你可以复制你的密码
- 有时,这个方案会随机产生一个全是字母的密码,尽管比99.9%的密码好,但您使用的站点会宣布该密码弱/不合适。对此你无能为力-我只是添加一个数字/增量,直到它停止抱怨
我使用一个标准用户名,所以我的方案与你的略有不同,但希望这里的总体思路能有所帮助 加密然后散列密文听起来有点奇怪。也许您无意中重新发明了键控哈希(例如)?此外,我对OpenSSL不太熟悉,但快速搜索表明用于
enc
的密钥派生函数基于MD5,并且相当弱。@ntoskrnl,感谢您的提示!HMAC似乎确实是我正在寻找的概念,但我可能需要一些时间来了解它。如果我有更好版本的脚本,我会发布一个更新。这个问题似乎离题了,因为它要求进行代码审查。请参见帮助中心中的。也许是一个更好的提问的地方。
$ ./myscript.sh
$ id = mylogin@stackoverflow.com
$ pw = 23456
$ MNLManDN
$ pczRREIy9+ag/0Y7jauAWpm5sllh5sjg