在Web应用程序中对数据进行数字签名

use*_*353 8 security web-applications pki digital-signature pkcs#7

我有一个Web应用程序,其中一些数据(不是文件)需要使用PKI私钥进行数字签名.PKI证书和私钥将位于USB Cryptotoken中,当插入USB插槽时,它会将证书注册到浏览器.这减轻了使用证书进行身份验证的痛苦,因为我通过在我的应用程序中进行ssl-renegotiation.

但是,使用证书进行数字签名似乎有点棘手.我可以想到几种方法来做到这一点

  1. CAPICOM - http://en.wikipedia.org/wiki/CAPICOM 这适用于支持CAPICOM的浏览器(例如IE).但是,似乎微软已经停止了这一点.

  2. Mozilla Crypto对象 - https://developer.mozilla.org/en-US/docs/JavaScript_crypto

  3. WebCrypto API - 大多数浏览器尚不支持此功能.

  4. 自定义Java Applet或一些可自由开源的JavaApplet控件.

  5. 还有其他选择吗?

我试图找出在Web应用程序中执行此操作的常见,方便和安全的方法.

注意:

  1. 我很乐意支持流行的浏览器.
  2. 我正在签署一小段数据 - 比如100-200字节而不是文件.
  3. 我更喜欢PKCS#7签名.

Lar*_*y K 2

[披露:我为 CoSign 工作。]

您遇到的问题是旧式 PKI 系统中常见的问题,该系统将签名者的私钥存储在边界处(例如,在智能卡、令牌等中)。该系统是在 PC(及其上运行的应用程序)成为焦点时设计的。但本世纪情况并非如此。现在浏览器或移动设备都是焦点。

Web 应用程序的性质(它们要么在主机上运行,​​要么是浏览器上的沙箱 JavaScript)与“保护”私钥的本地硬件的概念之间存在着紧张关系。

突破浏览器的沙箱

一种设计方向是尝试突破浏览器的沙箱来访问本地硬件私钥存储。您列出了许多选项。另外一个是Chrome USB 访问库。但所有这些解决方案都是:

  • 仅限于特定浏览器
  • 安装困难(且昂贵)
  • 维护困难(且昂贵)
  • 高水平的管理开销来帮助用户解决有关保持系统正常运行的问题。

关于您的问题 5“还有其他选择吗?”

是:集中签名

更好的选择(恕我直言)是集中签名。这样,密钥就保存在集中式 FIPS 安全服务器中。同时,签名者只需使用网络应用程序来授权签名。签名者不需要持有私钥,因为它存储在安全服务器中。

要对签名者进行身份验证,您可以使用应用程序所需的任何安全级别:用户名/密码;一次性密码;通过短信进行两因素身份验证;ETC。

CoSign Signature APICoSign Signature Web Agent就是为此而设计的。其他供应商也提供集中式 PKI 签名。

添加以回复评论

从你的答案的第二部分开始 - 如果证书存储在服务器中并通过使用 uname/pwd 或 2FA 对用户进行身份验证来检索,那么为什么要进行数字签名呢?即,与仅使用 uname/pwd 或 2FA 验证交易相比,它有什么优势?

答:在中心化设计中,私钥不会离开中央服务器。相反,将要签名的文档或数据发送到服务器并进行签名,然后将签名的文档或数据(例如 XML)返回到 Web 应用程序。

回复:为什么要这样做?因为可以验证经过数字签名的文档或数据集(例如 XML),以保证文档自签名后没有被更改,并提供信任链来保证签名者的身份。相比之下,密码即使经过 2FA 等强化,也只能为应用程序提供签名者身份保证,而不是第三方。

PKI 数字签名使第三方能够通过验证过程确保签名者的身份。并且可以根据需要通过选择不同的 CA 来设置保证的强度。