我需要使用 bash 脚本加密和解密密码。为此,我正在使用openssl
.
需要解密是因为我要在主机之间移动密码。
奇怪的是,加密似乎有过期时间。
加密(不在 bash 脚本上):
echo P@$$word| openssl enc -aes-128-cbc -a -salt -pass pass:pass_key
解密(在 bash 脚本上):
dec_password=$(echo -n $1 | openssl enc -aes-128-cbc -a -d -salt -pass pass:pass_key)
如果我进行加密然后运行脚本,它就可以完美工作。
但是,如果我正在进行加密并且第二天运行脚本进行解密它失败并出现错误:
error reading input file
不确定时间是否相关,但这是唯一改变的变量。
有任何想法吗?谢谢
答案1
等待一段时间解密密码后出现的错误,并且您提到该方法似乎“有过期时间”,是因为生成的随机数salt
随时间而变化。 (例如每天都会不同)
加密时,加密密码的第1个字符是使用salt加密时使用的salt;你应该使用相同的盐来解密。
请注意,如果尝试在 MacOS/ 较旧版本中进行无盐加密? openssl 版本你必须使用-nosalt
关键字;openssl
默认情况下生成并使用盐。
因此,要进行无盐加密,您需要执行以下操作:
echo P@$$word| openssl enc -aes-128-cbc -a -nosalt -pass pass:pass_key
然而,在存储密码时,解密密码并将其与候选密码进行比较是一种不好的做法;稍后再比较脚本你不解密它们:
比较密码的方法是加密密码以使用相同的盐(如果使用盐)进行检查,并比较加密的字符串以查看它们是否匹配。
如果它是为了在系统之间转发密码而不是存储它们,则使用salt
并不是那么重要,但请记住,它有助于保持更安全。
然而,如果您对加密强度有强烈的安全需求,OpenSSL 的加密强度较弱,而 GnuPG 的加密强度比 openSSL 更强。
答案2
$ echo P@$$word
P@74266word
$ echo 'P@$$word'
P@$$word
始终记住引用字符串。另外,双引号变量扩展例如$1
:
$ ls
a_file
$ variable="a*"
$ echo $variable
a_file
$ echo "$variable"
a*
此外,为了比较密码,您应该比较加密的密码,而不是解密的密码。如果使用盐,则应使用与加密原始密码相同的盐。 OpenSSL 将其存储在加密数据的前八个字节中。