Qku*_*HBH 5 linux security bash openssl cryptography
为了管理我的大量网站登录,我写了一个bash脚本
一个字符串,对我个人而言,标识某个帐户.例子是mylogin@stackoverflow.com或thisWebsiteIVistedLately,但它可能是任何东西.它不必遵循某种模式,它应该帮助我区分我想要管理的不同帐户.
主密码.
输出是帐户的用户名和安全密码的组合.我不想存储任何生成的用户名/密码,也不存储主密码.因此,类似于Honey Encryption,我希望脚本为每个输入生成合理的结果.如果坏人输入了错误的主密码,他就会得到一个不同的用户名/密码组合,无法区分"真实"密码.
这是我到目前为止提出的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
Run Code Online (Sandbox Code Playgroud)
如您所见,用户名和密码由生成
使用AES加密给定主密码的标识符字符串,
使用SHA散列结果,
执行base64转换,和
sed荷兰国际集团和cut荷兰国际集团输出,以合理的格式输入用户名和密码.
我试图让任何方面尽可能安全.对于标识符和密码输入,使用bash内部read.此外,当密码管道输入时openssl,使用bash内部密码printf.显然,用过的盐只是占位符.在最后阶段,任何使用该脚本的人都应该替换它们.
这是一个例子(假设上面的脚本保存为myscript.sh:
$ ./myscript.sh
$ id = mylogin@stackoverflow.com
$ pw = 12345
$ CbAMaZar
$ XFTD9VRwQxFbU4tHKuiJvy5c18oJaDbg
Run Code Online (Sandbox Code Playgroud)
最后两行指定生成的用户名和密码.
现在,假设有人知道我的任何事情,除了主密码(Kerckhoffs的原则).坏人来了:
$ ./myscript.sh
$ id = mylogin@stackoverflow.com
$ pw = 23456
$ MNLManDN
$ pczRREIy9+ag/0Y7jauAWpm5sllh5sjg
Run Code Online (Sandbox Code Playgroud)
要检查这是否正确,他必须实际尝试生成的登录.
现在,我的问题是如何改进此脚本的安全性(在加密和bash脚本方面).当然,如果坏人有root访问权限或知道主密码,则全部丢失.这就是我不打算使用这种方法管理重要帐户的原因.
但如果有人知道我的帐户的正确用户名和密码(例如通过SQL注入),则应该没有(现实的)方法来查找我的主密码或任何其他帐户用户名/密码组合.此外,系统上的任何非root用户都不可能找到生成的用户名/密码对或我的主密码.
因此,对于SO的所有安全性,加密技术和编程大师:上面的脚本中是否存在任何安全问题,或者它是否被认为是"安全的"?
我一直在为我的用户名/密码使用非常相似的方案。到目前为止,它对我来说效果很好。
我要说的第一件事是从标准加密哈希算法开始。据我所知,对于这个应用程序,没有真正需要与加密相结合,您只需要获得一个不可逆的输出,返回到您的初始密码。使用标准且安全的东西(不是 md5),并确保您的密钥足够复杂,以避免您的密码之一出现在标准查找表中的任何可能性。
我只是使用类似 MyHash(key + sitename) 的东西...您可以通过加密/计算网站名称中的某些内容并将其作为盐添加回来,从而使其更安全,但是,我个人认为这对于该应用程序来说是矫枉过正...虽然不是安全专家 - 这实际上取决于您使用它的目的。你最终会在易用性和安全性之间取得平衡——根据我的经验,我可以说你想要一个可以在必要时重新创建的算法。
我从几年来的使用中学到了一些东西 -
许多网站喜欢强制执行最大密码长度,我讨厌这些网站以及它们所代表的一切。我被迫将我的 Base64 编码结果截断为 19 个字符以标准化事物,这样我就不必记住我的密码 + 它们截断为的任意数量的字符。
使用标准的东西,这样您就可以在离开计算机时重现密码。
有时,这种方案会随机产生一个全是字母的密码,尽管它比 99.9% 的密码更好,但您所使用的网站仍会宣布该密码较弱/不适合。你对此无能为力 - 我只是添加一个数字/增量,直到它停止抱怨。
我使用标准用户名,因此我的方案与您的方案略有不同,但希望这里的总体想法可以使用。
| 归档时间: |
|
| 查看次数: |
251 次 |
| 最近记录: |