使用公共 ssh 密钥加密临时密码

使用公共 ssh 密钥加密临时密码

我管理一个虚拟办公室,我们的员工使用 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

相关内容