使用 PaySwarm 进行网页支付:身份 (共 3 部分,第 1 部分)

网页支付的承诺

网页从根本上改变了我们发布和交互信息的方式。然而,我们奖励人们创建内容的方式没有改变。网页的基础并非构建为像发送和接收电子邮件一样轻松地传输和接收资金。

使网页上的支付更简单、更易访问,带来的好处不仅仅是表面上的。通过将传统上只对银行、华尔街和大公司开放的工具提供给每个人,我们可以重塑世界金融体系。目标不仅仅是实现一键支付,还要促进众筹创新,帮助网页开发者通过网页谋生,推动改变世界的初创企业的融资轮次,等等。

虽然将新工具或强大的工具引入公众会催生竞争和创新,但开放的网页支付还可以带来更基本和社会性的改变。全世界有 25 亿人没有银行账户,因此由于银行腐败和/或高昂的费用,他们无法储蓄。当一个家庭没有办法为未来储蓄时,它极大地限制了他们摆脱贫困的机会。网页支付的承诺不仅仅关乎一个令人兴奋的未来,还关乎一个更加平等的未来。

那么,我们如何才能从今天的情况发展到未来,让在网页上发送和接收资金变得像点击按钮一样简单呢?

网页支付需求

网页上创新的主要驱动力之一是它的去中心化。你不必请求许可即可发布你的作品。开放标准(如 TCP/IP、HTTP、HTML、CSS、JavaScript 和 JSON)确保了应用程序之间的互操作性。因此,网页支付的解决方案必须至少具有以下特征

  • 它必须是去中心化的。
  • 它必须是开放的、无专利和免版税的标准。
  • 它必须设计为与网页架构(如 URL、HTTP 和其他网页标准)协同工作。
  • 它必须允许任何人实施该标准,并与实施该标准的其他人进行互操作。

除了这些成功的网页技术的基本特征之外,成功的网页支付技术还必须做到以下几点

  • 它必须使客户、供应商和支付处理商能够进行选择,以推动健康的市场竞争。
  • 它必须以去中心化的方式进行扩展,允许对核心协议进行特定于应用程序的扩展,而无需协调。
  • 它必须足够灵活,不仅可以执行支付,还可以支持众筹和执行法律合同等更高阶的经济行为。
  • 它必须是安全的,使用最新的安全最佳实践来保护整个系统免受攻击。
  • 它必须是货币无关的,不仅支持美元、欧元和日元,还支持比特币和 Ven 等虚拟货币。
  • 它必须易于开发和集成到网页中。

幸运的是,网页支付小组万维网联盟 (W3C) 创建了一套名为PaySwarm 的规范,这些规范满足了上面列出的所有要求。该小组目前正在与 Mozilla 联系,并试图与mozPay() API 以及Persona 融合,以提供真正出色的网页支付体验。甚至有一家公司推出了使用真钱的这项技术的商业版,这意味着你现在就可以用它来发送和接收资金。

这是本系列文章中的第一篇博客文章,共三部分,将探讨 PaySwarm 规范,并使用代码示例和视频演示如何在 Node.js 中构建一个功能齐全的 PaySwarm 客户端。

去中心化身份

网页的去中心化支付系统意味着,最终,身份机制也必须是去中心化的。如今,有许多去中心化的身份解决方案。OpenID、WebID、Web Keys 和 BrowserID/Persona 是为网页设计的一些更知名、去中心化的身份机制。网页支付的身份带来了额外的一组要求,这些要求是在网页身份解决方案的正常要求集之上添加的。以下是对这些要求的简要列表

  • 它必须是去中心化的。
  • 它必须支持使用可解析的地址(如 URL 或电子邮件地址)进行发现。
  • 它必须支持第三方在授权的情况下将任意机器可读信息附加到身份。
  • 它必须能够根据访问资源的人向外部网站提供公共数据和私有数据。
  • 它必须提供安全的数字签名和加密机制。

我们最终采用的解决方案称为Web Keys。它支持对与身份关联的任意机器可读信息进行安全、去中心化、可发现、受控的访问。这种身份机制及其支持的功能是 PaySwarm 工作的核心。

Web Keys

由于时间原因,我们没有时间在这篇博客文章中详细介绍,OpenID、WebID 和 OAuth 被考虑过,但最终没有入选,因为它们没有提供上述功能中的至少一项。当时,BrowserID(后来更名为 Persona)的设计阶段还处于早期,无法被视为可行的解决方案。网页支付小组目前正在与 Persona 团队合作,看看是否可以将所有上述功能集成到 Persona 中以支持网页支付,但这还不确定。

最后,我们不得不为网页支付创建最小的身份解决方案,因为没有满足上述所有要求的解决方案。因此,让我们深入了解如何使用 Web Keys 技术为进行去中心化网页支付的目的建立在线身份。

本教程将使用payswarm.js 节点模块 中的代码。具体而言,它将使用Web Key 注册示例 中的代码片段。本教程还将使用PaySwarm 开发者沙盒 作为我们的 Web Key 主机和支付处理器。

以下视频展示了我们将在本教程的剩余部分构建的内容

生成密钥

Web Keys 规范构建在称为公钥密码学 的技术之上。我们没有时间在这篇博客文章中详细介绍这项技术的工作原理,因此以下是对不熟悉这项技术的人的简要概述。

公钥密码学用于保护网页上的流量。如果你曾经在网上购物时看到过挂锁图标,那么你就在使用公钥密码学。当你生成这些密钥时,你会得到两个密钥:一个公钥和一个私钥。这两个密钥可以一起用于执行对网页支付很重要的两个主要操作。第一个是私钥可以用来对购买请求进行数字签名。公钥可以用来验证购买请求上的数字签名,证明是你,而且只有你,想要进行购买。第二个是公钥可以用来加密信息,以便只有私钥的持有者才能读取该信息。这两个密钥可以一起用来在线向他人证明你的身份,并加密发送给你的消息,以便只有你才能阅读它们。

要在 PaySwarm 中生成一对密钥,你可以执行以下操作

var payswarm = require('payswarm-client');
...
payswarm.createKeyPair({keySize: 2048}, function(err, pair) {
  if(err) {
    console.log('Oops, something went wrong:', err);
  }
  else {
    var publicKeyPem = pair.publicKey;
    var privateKeyPem = pair.privateKey;
...
  }
});

在上面的代码中,PaySwarm 库的createKeyPair()函数被用来创建一对 2048 位的密钥。密钥对使用的位数越多,对其进行暴力破解攻击就越困难。目前(2013 年 4 月),2048 位的密钥长度被认为对于 PaySwarm 交易来说非常安全。您绝不应该使用低于 2048 位的密钥长度;它应该被金融网络拒绝。密钥对创建后,公钥和私钥都会返回给您。应用程序负责存储这些密钥。私钥必须非常安全地存储,最好在写入磁盘之前使用长密码对其进行加密。公钥应该以其他人可以使用它来验证您的数字签名并向您发送只有您才能阅读的加密数据的方式发布。在下一节中将介绍将公钥发布到网络的过程。

注册密钥

Web 密钥规范详细说明了应用程序如何将公钥与身份关联起来。将 Web 密钥与身份关联起来是一个多步骤的过程

  1. 发现 Web 密钥服务器的密钥注册基本 URL。
  2. 生成一个密钥注册 URL。
  3. 通过 Web 浏览器注册密钥。

以下代码片段演示了上述步骤

async.waterfall([
...
  function(callback) {
    // Step #1: Fetch the Web Keys endpoint from the PaySwarm Authority.
    payswarm.getWebKeysConfig('dev.payswarm.com', callback);
  }, function(endpoints, callback) {
    // Step #2: Generate the key registration URL
    var registrationUrl = URL.parse(endpoints.publicKeyService, true, true);
    registrationUrl.query['public-key'] = publicKeyPem;
    registrationUrl.query['response-nonce'] =
      new Date().getTime().toString(16);
    delete registrationUrl.search;
    registrationUrl = URL.format(registrationUrl);
    callback(null, registrationUrl)
  },
  function(registrationUrl, callback) {
    // Step #3: Register the key via a web browser.
    console.log('Register your key here: ', registrationUrl);
...

运行上面代码的 PaySwarm 客户端将首先获取dev.payswarm.com站点的 Web 密钥配置。通过getWebKeysConfig()函数检索 Web 密钥配置时使用的 URL 将是https://dev.payswarm.com/.well-known/web-keys。结果是一个JSON-LD文档,可以作为 JSON 文档使用。保存注册端点的 JSON 密钥是publicKeyService。然后通过向注册端点 URL 添加 URL 参数来构建注册 URL。首先,添加应用程序生成的公钥。然后,添加一个一次性响应nonce,用于防止重放攻击。服务器的响应将包含响应 nonce,因此请务必将其存储在某处。应用程序跟踪响应 nonce 且从未使用超过一次非常重要。如果应用程序在从服务器接收消息时检测到响应 nonce 已使用过多次,则您可能受到攻击,必须忽略该消息。PaySwarm 中的消息本质上是短暂的,因此 nonce 可能只需要存储有限的时间,从而简化某些实现。

浏览器访问注册 URL 时,PaySwarm 权限会做什么取决于具体的实现。唯一的要求是它为公钥提供一个永久的 URL 位置以及正在注册的公钥所有者的 URL。请注意,所有者的 URL 也必须是可以引用的,因此它可以提供信息,表明所有者确实拥有该公钥。响应将使用提供的公钥进行加密,并且只能由应用程序的私钥解密。下一节将介绍如何处理来自 PaySwarm 权限的注册响应。

注册响应

注册 Web 密钥的最后一步是接收来自 PaySwarm 权限的加密响应。完成 Web 密钥注册包括以下两个步骤

  1. 接收加密的密钥注册响应。
  2. 解码密钥注册响应。

以下代码片段演示了上述步骤

async.waterfall([
...
    // step #1: receive the encrypted key registration response
...
  function(encryptedMessage, callback) {
    // step #2: decode the key registration response
    payswarm.decrypt(encryptedMessage, {privateKey: privateKeyPem}, callback);
  },
  function(message, callback) {
    var publicKeyUrl = message.publicKey;
    var publicKeyOwnerUrl = message.owner;
    var financialAccountUrl = message.destination;
    callback();
  },
...

注册公钥时,应用程序会要求您访问 PaySwarm 权限上的 URL。如果您的应用程序是控制台应用程序,则注册过程的最后一步将提供一条加密消息,您可以将其复制粘贴到您的应用程序中。如果您的应用程序是 Web 应用程序,您可以提供一个回调 URL,注册后将向其发送加密消息。该加密消息是上面 JavaScript 代码的输入。PaySwarm 库使用一个名为decrypt()的函数,该函数将接收加密消息和应用程序的私钥(在教程中前面生成),并提供 PaySwarm 权限发送给您的未加密消息。

未加密的消息将至少包含公钥的 URL 和公钥所有者的身份 URL。Web 支付规范还要求将财务账户与公钥关联起来,这在您需要告诉另一个应用程序将资金发送到哪里时很有用。应用程序获取此信息后,应该将其与私钥数据一起存储在安全的地方,最好是受密码保护的地方。

基于浏览器的 Web 密钥注册

本教程介绍了创建基于控制台的 Web 密钥客户端的基础知识,用于注册公钥。通常,Web 密钥客户端将内置于运行在公共网站上的软件中,该软件通过 Web 浏览器访问。以下是纯基于浏览器的 Web 密钥工作流程提供的体验示例

接下来:列出待售资产

这是关于使用 PaySwarm 规范的三部分系列文章中的第一篇,该规范可用于以去中心化的方式通过 Web 发送和接收资金。本系列的下一篇文章将解释如何创建资产(如文章、歌曲或电影)并在 Web 上列出以供出售。PaySwarm 的妙处在于,您网站上的客户不需要使用与您相同的支付处理器,就像您不需要关心客户使用哪个支付处理器一样。使用 PaySwarm,资金只会流向适当的地方。

关于 Manu Sporny

W3C Web 支付 创始人。 RDFaJSON-LD 工作组主席。 PaySwarm、JSON-LD 和 HTML5+RDFa 规范的首席编辑。创建了世界上第一个商业 PaySwarm 支付处理器 Meritora 的公司的创始人。领导将金融和支付集成到 Web 的核心架构中。很多与标准相关的作品,重点是让世界变得更加美好,造福所有人。其他帐户:@manusporny+Manu SpornyLinkedIn博客.

更多 Manu Sporny 的文章…

关于 Robert Nyman [荣誉编辑]

Mozilla Hacks 的技术布道者和编辑。发表演讲和博客文章,内容涉及 HTML5、JavaScript 和开放网络。Robert 是 HTML5 和开放网络的坚定支持者,自 1999 年以来一直在从事 Web 前端开发工作,在瑞典和纽约市都有工作经验。他还经常在 http://robertnyman.com 博客,热爱旅行和结识朋友。

更多 Robert Nyman [荣誉编辑] 的文章…


2 条评论

  1. Manu Sporny

    如果您有兴趣了解更多关于 Web 支付的信息或随时了解最新的 Web 支付新闻,请订阅以下邮件列表

    http://lists.w3.org/Archives/Public/public-webpayments/

    并加入 Web 支付社区组

    http://www.w3.org/community/webpayments/

    2013 年 4 月 16 日 上午 10:13

  2. Manu Sporny

    学生,如果您有兴趣作为 Google Summer of Code 2013 的一部分在万维网联盟参与 Web 支付工作,请访问这里

    http://www.w3.org/2013/03/gsoc2013#web-payments

    申请截止日期是下周一(2013 年 4 月 22 日)。以下是一个供您参考的申请模板

    http://www.w3.org/wiki/GSoC2013ApplicationTemplate

    在这里了解更多关于 GSoC2013 的信息

    http://www.google-melange.com/gsoc/homepage/google/gsoc2013

    如果您还没有阅读 GSoC 学生建议页面,请仔细阅读
    http://code.google.com/p/google-summer-of-code/wiki/AdviceforStudents

    如果您需要有关如何编写申请的建议,请仔细阅读
    http://code.google.com/p/google-summer-of-code/wiki/AdviceforStudents#Writing_Your_Application

    2013 年 4 月 16 日 上午 10:36

本文评论已关闭。