OpenSSL字符串解密问题

max*_*dap 17 encryption openssl cryptography

我会尝试尽可能简洁.

我希望能够使用OpenSSL加密和解密简单的字符串,这是我之前所做的.

但是,必须满足以下条件:

  • 使用简单密码(无密钥)
  • 没有输入/输出文件
  • 没有提示密码短语(通过任一方向的命令行选项指定)

我在那里50%.我可以通过以下方式成功执行ENCRYPTION:

echo 'someTextIWantToEncrypt' | openssl enc -e -aes-256-cbc -nosalt -pass pass:mySecretPass
Run Code Online (Sandbox Code Playgroud)

输出结果是:

(??b}n??v???>??G??.?B??~?
Run Code Online (Sandbox Code Playgroud)

太好了.现在我想解开那个字符串.所以我这样做:

echo -n '(??b}n??v???>??G??.?B??~?' | openssl enc -d -aes-256-cbc -pass pass:mySecretPass
Run Code Online (Sandbox Code Playgroud)

甚至作为替代方案:

openssl enc -d -aes-256-cbc -pass pass:mySecretPass <<< '(??b}n??v???>??G??.?B??~?'
Run Code Online (Sandbox Code Playgroud)

但我得到了这样的答复:

bad magic number
Run Code Online (Sandbox Code Playgroud)

虽然我不想使用输入/输出文件,但该方法100%工作:

# encrypt to file
echo -n 'someTextIWantToEncrypt' | openssl enc -e -nosalt -out test.txt -aes-256-cbc -pass pass:mySecretPass 

# decrypt from file
openssl enc -d -nosalt -in test.txt -aes-256-cbc -pass pass:mySecretPass

# result of decryption (is successful):
someTextIWantToEncrypt
Run Code Online (Sandbox Code Playgroud)

那么......如何在使用输入/输出文件的情况下实现上述解密过程?我觉得我很亲密,但遗漏了一些小细节.

提前致谢.

Ada*_*iss 31

问题是加密使用整个ASCII字符集,包括不可打印的字符.如果您希望能够剪切和粘贴加密数据,则需要将其转换为仅可打印字符.您可以使用-base64(或-a)选项执行此操作:

echo 'someTextIWantToEncrypt' | \
  openssl enc -base64 -e -aes-256-cbc -nosalt -pass pass:mySecretPass

KPkBkGJ9bs4YHvh24xz7m9jTlYWm1LcIFcWR0DwY4PU=
Run Code Online (Sandbox Code Playgroud)

然后以同样的方式解密它:

echo "KPkBkGJ9bs4YHvh24xz7m9jTlYWm1LcIFcWR0DwY4PU=" | \
  openssl enc -base64 -d -aes-256-cbc -nosalt -pass pass:mySecretPass
Run Code Online (Sandbox Code Playgroud)

警告: 如果您使用的是openssl,我只能假设数据的机密性,因此密码对您很重要.如果是这种情况,则不应在命令行上提供密码,因为它可以向具有运行权限的任何人公开ps.

更好的解决方案是将密码存储在环境变量中,并从那里读取openssl:

export passwd="mySecretPass"
echo "KPkBkGJ9bs4YHvh24xz7m9jTlYWm1LcIFcWR0DwY4PU=" | \
  openssl enc -base64 -d -aes-256-cbc -nosalt -pass env:passwd
Run Code Online (Sandbox Code Playgroud)

  • 另外,你对"更好"的解决方案也是正确的.我只能说,这是一个有效的概念验证,为了补充你的评论,最终目标是更安全地"存储"这些信息,而不是将其暴露给命令行.感谢Adam Liss. (2认同)