使用 CNG 在 C++ 应用程序中签署数据并在 php api 中验证

Signing data in c++ app using CNG and verifying in php api

我阅读了很多关于非对称加密的内容,但仍然无法理解如何逐步实现我所需要的。

我需要的:

  1. 仅创建 1 个私钥和 1 个 Public 密钥一次。
  2. 在用户无法读取的情况下将私钥包含在我的 C++ 应用程序中(当然,一切都可能被黑客入侵,但你明白我的意思,不要让用户以纯文本形式看到它)。
  3. 分发应用程序。
  4. 然后我的应用程序在使用时将哈希一个字符串。
  5. 使用包含的私钥加密此散列。
  6. 使用 http 请求将此签名哈希发送到我的 api。
  7. 使用我的 Public 密钥解密我的 api (php) 中的签名哈希。

不明白的地方:

使用此处的示例:Signing Data with CNG 我不知道如何创建一次密钥,然后将私有密钥存储在我的 C++ 应用程序中,将 public 密钥存储在我的 api (php).

我取得了什么

我学会了使用 bCrypt 散列和 encrypt/decrypt 数据,但我不明白我必须执行哪些步骤才能实现我之前写的内容

你必须改变设计。目前您的设计存在重大安全漏洞。 pubkey/prikey 的概念是正确的,但实现是不正确的。私钥应保密。目前很容易导出 public 密钥,给定许多算法的私钥,但反之则不然。正确的设计如下

  1. 生成 self-signed 证书。此证书将包含私有和 public 密钥
  2. 导出 public 证书并将其作为 resource/or 硬编码嵌入到您要分发的应用程序中
  3. 然后应用程序将散列要签名的数据并使用来自应用程序资源的 public 密钥。
  4. 然后,此散列数据将通过 http 发送到具有私钥副本的服务器。
  5. 服务器将对数据进行哈希处理并使用私钥验证哈希。

上述所有步骤在 MSDN 上都有详细的示例记录。如果您需要进一步的帮助,请告诉我,我可以将其指向文章。

以上设计将确保您的私钥永不外泄。如果您在您的应用程序中分发您的私钥,实际上只需几分钟即可获得您的私钥。

在应用程序中存储 public 密钥只是使用字节数组在应用程序中对密钥进行硬编码或将证书放入资源文件中的问题。

绝不能在任何应用程序中对密钥对的私钥部分进行硬编码。私钥应该是不可导出的,并且只能由操作系统管理。 Windows 现在有使用 VSM 技术的键盘锁,即使是本地管理员也无法知道私钥。管理员只能将其用于签名和验证(并导出密钥,如果启用了导出),但永远无法查看私钥并滥用它。

关于分步过程。

  1. 创建 self-signed 证书。这将在 pfx 文件中生成包含 public 和私钥的证书。
  2. 在证书库中导入 self-signed 证书。这可以通过简单地在文件上 double-clicking 并按照说明进行操作来实现。
  3. 通过打开证书管理器导出新导入证书的 public 部分。
  4. 您可以将此 public 导出的证书作为资源嵌入到您的应用程序中。
  5. 然后应用程序可以从资源中加载证书并使用它来签署散列。
  6. 在服务器端,如果带有私钥的证书尚未导入,请按照步骤 2 进行导入。
  7. 服务器然后可以使用 Apis 使用私钥验证签名数据。