我正在尝试开发一个在客户端执行数字签名然后将签名文档发送到服务器端的网站。 由于不发送用户的私钥,我想在客户端进行签名。此 key (理论上)必须始终与用户在一起,并且不得将其发送到网络(例如,即使受 SSL 保护)。
我希望每个平台都可以签署文件。我已经开发了带有签名算法的 Java Applet,但 iOS 或 Android 不支持 Java。.NET 也不支持。所以我认为我仅限于 JavaScript,但我不知道任何签署 XML、PDF 和 Office 文档的 javascript 库。我该怎么办?只有使用 Javascript,每个平台都可以工作..
你能帮帮我吗?
问候, 威廉。
最佳答案
披露:我为 CoSign 工作.
解决方案是使用安全的、硬件强化的数字签名设备。
您提出了在网络“边缘”对数据进行数字签名的常见问题。
出于您讨论的原因,祝您在客户端/边缘签名的想法好运。忘记 Javascript,它是 completely insecure from the cryptography point of view .
您说得对,签名者的私钥不应发送到任何地方。
好消息:有一种替代架构将:
- 不需要将私钥发送到任何地方
- 保护私钥
- 支持来自所有类型客户端的签名,包括移动、Android、.Net、iOS 等。
- 通过集中 key 和 key 管理降低管理成本
答案:使用集中签名设备。该设备在硬件级别进行了加固:如果您尝试打开盒子, key 就会被销毁。签名用具是由我公司和其他一些公司制造的。
在这个系统中,文档(或者更好的是,只是它的哈希值)从边缘设备发送到集中式签名设备。用户还使用设备进行身份验证(使用多种技术中的任何一种)。该设备持有私钥。它签署散列,并将数字签名返回给边缘客户端。
根据客户端的能力,它可以:
组装签名文档本身(将数字签名与源文档组合)。好处:边缘客户端和签名设备之间需要发送的数据更少。问题:客户端需要更多软件。或者:
设备可以返回完整的签名文档。受益于客户端上更简单的实现,但需要将文档从边缘客户端发送到签名设备。
请注意,不必发回整个 PDF 文档——PDF 数字签名只是附加到源文档。所以流程可以是:
- 发送整个 PDF 以供签名。 (或者如果客户端可以计算,则只发送哈希。)
- 接收回整个 PDF(已签名),或只是一个“尾部”,附加到源 PDF 后创建已签名文档。
多种数据类型 我公司支持对 PDF、Word、Excel、XML 和其他开箱即用的文档类型进行签名。例如,Word 文档使用 Word“标准”进行签名——经过数字签名的 Word 文档可以由收件人(依赖方)验证,无需安装除 Word 之外的任何内容。没有插件等
签名者身份验证 签名者需要使用集中式设备对自己进行身份验证。我公司支持多种类型的身份验证,包括 OTP 和 2FA。
关于javascript - 每个平台上的 XML、PDF 和 Office 文档的数字签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22356651/