我管理一个虚拟办公室,我们的员工使用 SSH 密钥和密码进行身份验证。如果我们的一名员工忘记了密码,是否有办法使用他的公共 RSA ssh 密钥加密临时密码,以便我可以通过电子邮件发送给他?
我见过与此相关的其他问题,但是“答案”通常建议不要使用公钥/私钥 SSH 执行常规加密/解密,并且实际上并未说明这是否可行。我想知道这是否确实可行,以及加密和解密密码的步骤是什么。
答案1
我终于找到了如何将 OpenSSH 公钥转换为 PEM 格式博客并且能够使用我的私钥/公钥成功加密和解密字符串。
我概述了执行加密和解密所使用的步骤。
加密字符串:
# convert public key to PEM format
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8 > ~/.ssh/id_rsa.pub.pem
# encrypt string using public key
echo "String to Encrypt" \
| openssl rsautl -pubin -inkey ~/.ssh/id_rsa.pub.pem -encrypt -pkcs \
| openssl enc -base64 \
> string.txt
解密字符串(来自文件):
openssl enc -base64 -d -in string.txt \
| openssl rsautl -inkey ~/.ssh/id_rsa -decrypt
由于我的目标是通过电子邮件发送密码,因此我编写了一个非常基本的脚本来实现一些自动化操作:
#!/bin/sh
if test "x${1}" == "x";then
echo "Usage: ${0} <username>"
exit 1
fi
SSHUSER=${1}
printf "Enter Password: "
read PASS1
echo ""
echo ""
ssh-keygen -f /home/${SSHUSER}/.ssh/id_rsa.pub -e -m PKCS8 \
> /tmp/ssh-pubkey-${SSHUSER}.pem
echo 'cat << EOF |openssl enc -base64 -d |openssl rsautl -inkey ~/.ssh/id_rsa -decrypt'
echo "New Password: ${PASS1}" \
| openssl rsautl -pubin -inkey /tmp/ssh-pubkey-${SSHUSER}.pem -encrypt -pkcs \
| openssl enc -base64
echo "EOF"
echo ""
rm -f /tmp/ssh-pubkey-${SSHUSER}.pem
然后我可以通过电子邮件发送脚本的输出以供用户解密。
完整脚本可以在 Github 上找到:https://gist.github.com/3078682
答案2
这是可能的,因为它只是一个 RSA 密钥。使用 openssl:
openssl rsautl -encrypt -inkey alice.pub >message.encrypted
我偷了这个问题在 Unix/Linux SE 上。
我必须说 PGP 更适合这一点。
答案3
一般来说,是的,这是可能的。SHH 所做的就是生成一个模数 N 和两个密钥 e(公钥)和 d(私钥)。所采用的机制通常是 RSA 或 DSA,生成的密钥可用于加密。您所要做的就是从作为公钥的 base64 blob 中提取它们,然后使用合适的程序用这些密钥加密数据。您可能对以下内容感兴趣猴子球它可以在 ssh 密钥格式和 gnupg 密钥之间进行转换。这也允许您使用密钥进行加密。
答案4
通常情况下,人们不会使用非对称密钥进行“批量加密”。但这并不重要,因为你不应该处理这种程度的细节。使用工具包(openssl 就是一个很好的工具包)http://www.openssl.org/docs/apps/openssl.html)为您完成工作。您要做的就是创建包含新临时密码的加密消息,并指定用户的密钥对作为收件人。此页面上有很多示例: http://www.openssl.org/docs/apps/smime.html