对web应用中的数据进行数字签名



我有一个web应用程序,其中一些数据(而不是文件)需要使用PKI私钥进行数字签名。PKI证书&私钥将位于USB加密令牌中,当插入USB插槽时,该令牌会向浏览器注册证书。这减轻了使用证书进行身份验证的痛苦,因为我通过在应用程序中触发ssl重新协商来进行身份验证。

然而,使用证书进行数字签名似乎有点棘手。我能想出几种方法来完成

  1. CAPICOM-http://en.wikipedia.org/wiki/CAPICOM这将适用于支持CAPICOM(例如IE)的浏览器。然而,微软似乎已经停止了这项工作。

  2. Mozilla加密对象-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签名

【披露:我为CoSign工作。】

你遇到的问题是老式PKI系统中常见的问题,这些系统将签名者的私钥存储在边界(例如智能卡、令牌等)。这个系统是在电脑(以及运行在电脑上的应用程序)成为焦点时设计的。但本世纪并非如此。现在,无论是浏览器还是手机都是焦点。

网络应用程序的性质(它们要么在主机上运行,要么在浏览器上是沙盒JavaScript)与"保护"私钥的本地硬件的想法之间存在紧张关系。

突破浏览器的沙箱

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

  • 仅限于特定浏览器
  • 安装困难(且成本高昂)
  • 维护困难(且成本高昂)
  • 高级别的管理开销,帮助用户解决有关保持系统工作的问题

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

是:集中签名

一个更好的选择(IMHO)是集中签名。通过这种方式,密钥被保存在一个集中的FIPS安全服务器中。同时,签名者只需使用网络应用程序来授权签名。签名者不需要持有私钥,因为私钥存储在安全服务器中。

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

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

添加以回应评论

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

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

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

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

最新更新