【问题标题】:Using a password to protect private key in c++在 C++ 中使用密码保护私钥
【发布时间】:2015-12-30 14:20:51
【问题描述】:

我打算编写一个小应用程序,其基本思想是用户能够彼此共享加密信息。一个小场景:Alice 写了一个备忘录(数据格式已知),应用程序加密这个备忘录并将备忘录保存在应用服务器上。现在爱丽丝想与鲍勃分享这份备忘录。 Alice 打开应用程序,搜索用户“Bob”并收到 Bob 的公钥。应用程序使用 Alice 和 Bob 的密钥加密备忘录并将备忘录保存在服务器上。现在 Bob 也可以阅读备忘录了。

用户的私钥只属于安装应用程序的设备。它永远不会通过网络传输。尽管如此,我还是想用用户的密码“加密”私钥,因此它可以以(相对)安全的方式存储在设备上,并且只有在输入正确的密码时才会被“解密”。如果用户的密码更改,则不应更改密钥本身,因为这将导致所有数据都必须使用此新密钥再次加密。相反,用户必须输入旧密码,然后使用新密码再次解密和加密密钥。

是否有任何功能(可能在 OpenSSL 中?)使用密码短语“加密”或保护密钥?

注意:私钥可能会也可能不会存储在密钥库中。因为该应用程序将在许多平台上运行,所以事先并不清楚哪个密钥库可用。

【问题讨论】:

  • 您正在重新设计 PGP/GPG。所以是的,这样的系统已经存在,你不应该尝试重写它们并期望它们是安全的;)
  • 简洁但完整的答案是:是的。冗长的答案是:有些库提供了一个或多个用于加密文本的函数。
  • 让我们假设它不会是一个如此微不足道的应用程序。是否可以将 PGP 集成到我自己的应用程序中?
  • @YSC,OP 不仅在重新设计 GPG,他们还在复制粘贴 GPG 手册中的示例;)
  • @SergeyA OP 很可能引用了一位老师给出的作业,该老师从 GPG 手册中复制粘贴了示例:)

标签: c++ encryption private-key


【解决方案1】:

是否可以将 PGP 集成到我自己的应用程序中?

GnuPG Made Easy (GPGME)“是一个旨在让应用程序更轻松地访问 GnuPG 的库。它提供了用于加密、解密、签名、签名验证和密钥管理的高级 Crypto API。”

【讨论】:

  • OP 应该非常清楚这一点,因为问题是 GPG 手册的复制粘贴。
  • 不是,我也不是。 YSC 和 DevSolar 的答案非常有帮助,因为它们使我免于遇到密码学中最常见的“新手”问题之一。我想这是“永远不要实现自己的......”的情况
【解决方案2】:

使用OpenSSL,您可以将密钥保存为受保护的形式 (BEGIN RSA ENCRYPTED...)。您可能想要使用的示例函数(我省略了预先需要的所有操作,但它们非常基本)。

PEM_write_PKCS8PrivateKey(pFile, m_pKey, cipher, sPass, iPassLen, 0, NULL)

其中cipher 是您的加密算法,具有适当的类型。更多(有例子!)在这里:https://www.openssl.org/docs/manmaster/crypto/pem.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多