PHP:从私钥字符串/文件中获取 RSA 公钥

Posted

技术标签:

【中文标题】PHP:从私钥字符串/文件中获取 RSA 公钥【英文标题】:PHP: Get RSA public key from private key string/file 【发布时间】:2018-09-24 23:13:38 【问题描述】:

我正在使用 laravel 构建一个基本的加密聊天应用程序。我正在尝试根据用户注册时生成的私钥对用户进行身份验证。

用户的公钥存储在数据库中。当用户想要登录时,需要上传给他们的私钥。我想比较数据库中的公钥和原始私钥中的公钥。

/**
 * Validate user key file for login
 */
public function validateKey($attribute, $value, $parameters)
    if (!($value instanceof UploadedFile)) return false;

    // Get user to match key
    $user = $this->data['username'];

    // Get public key from file
    $privateKey = File::get($value->getRealPath());

    dd($privateKey);

我能够以字符串格式获取私钥。从这里我似乎无法生成或提取公钥以与数据库值进行比较。

【问题讨论】:

您只需要让用户上传他们的公钥并共享它们,这样他们就可以互相发送加密的消息,然后用他们的私钥解密......私钥永远是秘密的与任何人分享或在任何地方上传 【参考方案1】:

他们也不应该将他们的私钥上传到您的服务器。您永远不应该将您的私钥放在远程位置。

拥有两个密钥的关键是一个密钥可以解密由另一个密钥加密的任何消息。在大多数算法中,公钥和私钥之间的主要区别或多或少是您将哪一个保密以及您共享哪一个。在 RSA 中,私钥是指定的,但您仍然不想上传或共享它。


已编辑:~这不是公钥/私钥的工作方式。你不能从另一个中提取一个。如果可以,那将破坏非对称加密的目的。~

正如@iainn 指出的那样,您可以从 RSA 私钥中提取公钥,但我仍然不建议用户上传他们的私钥。

【讨论】:

我也想知道他是否以 ascii 装甲格式或字节存储密钥 @Devon 感谢您的回答。我对加密和密码学很陌生。您对我应该如何使用密钥进行身份验证或解密消息有什么架构建议吗? @MoussaHarajli 用户只需要共享他们的公钥,这样他们就可以互相发送加密消息 @MoussaHarajli,一般来说,大多数身份验证都是通过“签名”消息来工作的。这将使用您的私钥加密消息并发送,然后服务器尝试使用公钥对其进行解密并验证消息是否符合预期。 您绝对可以从私钥中提取公钥 - 这就是 ssh-keygen -y 所做的。私钥和公钥有很大的不同,它们不仅仅是整体的两半,您可以在其中选择要保密的一个。

以上是关于PHP:从私钥字符串/文件中获取 RSA 公钥的主要内容,如果未能解决你的问题,请参考以下文章

sh 从私钥生成rsa公钥

OpenSSL生成公私钥

RSA怎样设置公钥和私钥?

从私钥派生 ECDSA 公钥

Javascript:从私钥生成 ECDSA 公钥

从私钥生成的公钥在 2 种情况下不同