我有一个 Web 应用程序,其中一些数据(不是文件)需要使用 PKI 私钥进行数字签名。 PKI 证书和私钥将位于 USB 加密令牌中,当插入 USB 插槽时,该加密令牌会向浏览器注册证书。这减轻了使用证书进行身份验证的痛苦,因为我是通过在应用程序中触发 ssl 重新协商来实现这一点的。
然而,使用证书进行数字签名似乎有点棘手。我可以想到几种方法来做到这一点
卡皮康 -http://en.wikipedia.org/wiki/CAPICOM http://en.wikipedia.org/wiki/CAPICOM这适用于支持 CAPICOM 的浏览器(例如 IE)。然而微软似乎已经停止了这一点。
Mozilla 加密对象 -https://developer.mozilla.org/en-US/docs/JavaScript_crypto https://developer.mozilla.org/en-US/docs/JavaScript_crypto
WebCrypto API - 大多数浏览器尚不支持。
自定义 Java Applet 或一些开源的免费 Java Applet 控件。
还有其他选择吗?
我试图找出在网络应用程序中执行此操作的常见、方便且安全的方法是什么。
Note:
- 我只支持流行的浏览器就可以了。
- 我正在签署一小段数据 - 比如说 100-200 字节而不是文件。
- 我更喜欢 PKCS#7 签名。
[披露:我为 CoSign 工作。]
您遇到的问题是旧式 PKI 系统中常见的问题,该系统将签名者的私钥存储在边界处(例如,在智能卡、令牌等中)。该系统是在 PC(及其上运行的应用程序)成为焦点时设计的。但本世纪情况并非如此。现在浏览器或移动设备都是焦点。
Web 应用程序的性质(它们要么在主机上运行,要么是浏览器上的沙箱 JavaScript)与“保护”私钥的本地硬件的概念之间存在着紧张关系。
突破浏览器的沙箱
一种设计方向是尝试突破浏览器的沙箱来访问本地硬件私钥存储。您列出了许多选项。另外一个是Chrome USB 访问库 http://developer.chrome.com/apps/usb.html。但所有这些解决方案都是:
- 仅限于特定浏览器
- 安装困难(且昂贵)
- 维护困难(且昂贵)
- 高水平的管理开销来帮助用户解决有关保持系统正常运行的问题。
关于您的问题 5“还有其他选择吗?”
是:集中签名
更好的选择(恕我直言)是集中签名。这样,密钥就保存在集中式 FIPS 安全服务器中。同时,签名者只需使用网络应用程序来授权签名。签名者不需要持有私钥,因为它存储在安全服务器中。
要对签名者进行身份验证,您可以使用应用程序所需的任何安全级别:用户名/密码;一次性密码;通过短信进行两因素身份验证; ETC。
The 联合签名 API http://www.arx.com/digital-signatures/sapi and CoSign 签名网络代理 http://www.arx.com/digital-signatures/cswa都是为此而设计的。其他供应商也提供集中式 PKI 签名。
添加以回复评论
从你的答案的第二部分开始 - 如果证书存储在服务器中并通过使用 uname/pwd 或 2FA 对用户进行身份验证来检索,那么为什么要进行数字签名呢?即,与仅使用 uname/pwd 或 2FA 验证交易相比,它有什么优势?
A:在中心化设计中,私钥的作用是not离开中央服务器。相反,将要签名的文档或数据发送到服务器并进行签名,然后将签名的文档或数据(例如 XML)返回到 Web 应用程序。
回复:为什么要这样做?因为经过数字签名的文档或数据集(例如 XML)可以verified保证文档自签名后没有被更改,并提供信任链来保证签名者的身份。相比之下,即使通过 2FA 等加强密码,密码也只能提供app具有签名者身份保证,而不是第三方。
PKI 数字签名使第三方通过验证过程确保签名者的身份。并且可以根据需要通过选择不同的 CA 来设置保证的强度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)