在这里,我们有一些通用的非常好的隐私 (PGP)原语函数,以 API 调用的形式呈现在 Node HTTPS: 服务器上。
这些函数并不像可能用来实现电子邮件消息插件的特定那样具体,而是专门用于用户注册和登录授权应用程序,该应用程序调用通用函数以支持其更大的过程。
这里显示的概念和代码很容易适应,并在https://github.com/Bob-Wright/openPGP_functions_on_Node_API_Server共享。
PGP 是通常基于RSA加密方法的公钥加密 (PKC)方案的实现。
PGP 通常用于对电子邮件消息进行签名和加密,然后由收件人验证和解密。另一个大用途是加密文件和驱动器以保护其内容。
请注意,PKC/PGP 的特性使此类交换或交易中参与者的身份可以相互识别。事实上,我们的用例就是基于该方案的这一方面。
这是一篇关于 PKC 方案的文章,它很好地解释了所涉及的概念和方法: https ://hackernoon.com/public-key-cryptography-simply-explained-e932e3093046。
PGP 作为一种加密技术或方法已经有一段时间了,它已经用许多不同的语言和平台进行了编码或编程。
我们使用的最近的openPGPjs JavaScript 实现是用 Nodejs 作为异步 API 编写的,可以在以下存储库中找到它: https ://github.com/openpgpjs/openpgpjs。
我们通过一个 Express Nodejs API 框架为 openPGPjs 的函数提供一个接口,该框架使用来自调用者的 POST 表单提交。
以下是我们的 Nodejs server.js API 程序中的标题代码。这部分代码显示了我们需要包含的模块。
在此标题代码之后,我们在此处为我们提供的各种功能插入了许多 API 入口点。
在列出了这些不同的 API 函数之后,我们有最后一段简短的代码,用于设置和运行 HTTPS:API 函数的服务器。
我们的 API 在其活动过程中处理许多对象,其中一些对象存储在数据库的表中,其中一个对象是从另一个数据表的内容生成的。
稍后会详细了解数据表的使用,但与此同时,以下代码块用于节点模块usersdb_conn.js ,它将我们连接到我们在 API 函数中通常使用的用户的mySQL数据库。
现在我们已经描述了我们的通用 API shell,我们可以看看它呈现给我们的用户的功能。
几乎每个 PGP 功能在其确定和操作中都使用三个重要对象中的一个或多个。
这些对象中的第一个是用户对象,在我们的例子中,它是从我们从数据库中提取的用户数据生成的,用户的电子邮件地址是通过 POST 消息提供的。
这个用户数据库的内容之前是由我们注册过程的另一部分填充的。
在这里,在下面的清单中,我们可以看到用于调用密钥生成器函数的 POST 请求,以及从配置文件中获取密钥类型和密钥位长度的函数,以及用于提取特定用户数据值的函数从数据库表。
在下面的下一个清单部分中,我们看到使用我们刚刚在上面获得的名字、姓氏、密码和电子邮件数据值调用 openPGP 密钥生成函数。在此演示版本中生成密钥后,我们还将它们中的每一个写入适当的文件。
下面的两个函数检查公钥和私钥数据表中是否存在公钥和私钥记录。我们使用此信息来决定我们是插入新密钥还是替换/更新已经存在的密钥,如下面的清单所示。
下面的函数向发送演示生成密钥 API POST 的用户的浏览器显示一个有益的横幅成功消息页面。
上面我们刚刚检查的 keygenWebpage 成功横幅显示页面代码是 API 的密钥生成器 POST 部分中使用的最后一个函数。
为了让这些单独的函数完成生成用户密钥对的预期任务,我们需要一种方法来将这些函数排入队列,以便按照每个函数的任务顺序执行,依次提供其对任务列表的贡献.
因此,我们一直在讨论的密钥生成器 API 调用的主要代码作为“performAsyncFunctions”模型函数的一部分运行,该模型函数是一个异步函数控制器,按顺序运行每个函数,等待每个函数完成后再继续下一个函数。
运行此密钥生成器 API 调用后,我们将拥有通常用于加密或解密以及签名或验证可供我们使用的文本消息的所有三个对象。
我们有一个名为sendPost.html的简单 HTML 菜单页面,在下面的设置中显示或运行可从我们的 API 获得的调用。
这是您的基本 HTML 表单,它向我们的 API 服务器发送 POST 请求,创建密钥对的三个条目通过下面显示的代码实现。
最后,在我们的演示中,我们会显示一个横幅页面来标记密钥生成过程的完成。这一完成产生了三个供 PGP 方案使用的核心对象。一个是用户对象,其属性包括名字、姓氏、密码和电子邮件地址。
我们的密钥生成器创建了两个额外的新对象供我们使用,一个公钥对象和一个私钥对象。
控制台日志用于显示我们的各种功能的结果和进度,这是运行密钥生成器演示的示例控制台日志。
我们在 API 实现中使用了四个感兴趣的操作。这些操作是加密消息、签署消息、解密消息和验证消息。
可以同时对消息进行加密和签名或解密和验证,因此除了密钥生成器之外,这为我们提供了一个包含六个通用函数的表格。
消息加密使用发送者的公钥,而消息解密使用接收者的私钥和密码,因此这些互补操作使用互补密钥。
消息签名使用签名者的私钥和密码,而验证以类似的互补方式使用公钥。
加密消息或解密消息是两个最常见的 PGP 功能。让我们看看它们是如何在我们的 API 中实现的。
下面显示的这段代码是我们 Encrypt API 调用的开始。
可以看出,我们做的第一件事是从 POST 消息中获取发件人或加密者的电子邮件地址,然后获取我们希望加密的明文消息以及加密者的公钥,在我们的演示中,该公钥是从一个基于我们在 API 调用中提供的电子邮件的数据库表。
一旦我们有了想要与发送者的公钥一起加密的明文消息,我们就可以继续使用 openPGP 函数对消息进行加密,如下所示。
对于我们的演示,我们通过将加密文件写入磁盘来结束 API 调用。
上面所有这些函数以及在我们的 Encrypt API 调用中使用的所有这些函数都按照关闭“performEncryptAsyncFunctions”异步函数的指示顺序运行,该函数具有上面列出的等待函数的排队序列。
该演示不会向我们的 API 用户显示此调用的完成消息,但它会向我们的服务器终端显示一个日志文件,如下所示。
一旦我们拥有加密的文本消息,我们可能希望阅读其明文或未加密的内容。这当然需要通过以下代码完成的解密过程。
我们首先解析用户电子邮件地址的 POST 消息,然后是从文件中读取加密消息的函数。
在我们的用例中,解密需要私钥和密码,我们从用户数据库中提取密码,如下所示。
我们的 PGP 方案通过称为“装甲”的过程提供了额外的保护级别,该过程涉及使用此密码对其进行加密。
除了这两个前面的函数,我们还有一个额外的函数来从它的数据库中获取私钥。
使用这些对象,我们可以使用下面列表中的前两个函数解密消息并将明文保存到文件中。
再一次,如上所示,我们使用“performAsyncFunctions”构造顺序执行等待列表中的每个函数。
与 Encrypt API 调用一样,此 Decrypt API 调用提供的交互由控制台终端上显示的文本组成,如下面的示例日志所示。
除了密钥生成、消息加密和消息解密这三个主要功能之外,该代码还提供其他四个 API 功能,即签名和验证以及加密和签名以及解密和验证API 调用。
这些 API 的代码和终端日志结果包含在位于https://github.com/Bob-Wright/openPGP_functions_on_Node_API_Server的 GitHub 存储库中
在 Linux (Ubuntu20) 上将这个 Node 程序作为服务运行的代码也包含在 GitHub 存储库中。
此代码更多地是作为演示和 NodeJS API 示例编写的,而不是作为任何生产就绪实用程序编写的。希望它能很好地达到这个目的,因为我把它写成我自己的演示示例。
它应该很容易适应你自己的目的。欢迎提出意见或建议。
也在这里发布