Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 是否可以改进此用户名/密码生成器脚本的安全性? 描述_Linux_Bash_Security_Cryptography_Openssl - Fatal编程技术网

Linux 是否可以改进此用户名/密码生成器脚本的安全性? 描述

Linux 是否可以改进此用户名/密码生成器脚本的安全性? 描述,linux,bash,security,cryptography,openssl,Linux,Bash,Security,Cryptography,Openssl,为了管理大量的网站登录,我编写了一个bash脚本,它需要 对我个人来说,标识某个帐户的字符串。例如mylogin@stackoverflow.com或此网站是独立的,但它可能是任何内容。它不必遵循特定的模式,它只应该帮助我区分我想要管理的不同帐户 主密码 输出是帐户的用户名和安全密码的组合。我不想存储任何生成的用户名/密码,也不想存储主密码。因此,与类似,我希望脚本为每个输入生成合理的结果。如果一个坏人输入了一个错误的主密码,他只会得到一个不同的用户名/密码组合,与“真实的”密码不可区分 以下是

为了管理大量的网站登录,我编写了一个bash脚本,它需要

  • 对我个人来说,标识某个帐户的字符串。例如
    mylogin@stackoverflow.com
    此网站是独立的
    ,但它可能是任何内容。它不必遵循特定的模式,它只应该帮助我区分我想要管理的不同帐户

  • 主密码

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

    以下是我到目前为止提出的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
    
    最后两行指定生成的用户名和密码

    现在,假设有人知道关于我的任何事情,除了主密码()。坏家伙来了:

    $ ./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