用PHP实现数字签名

用PHP实现数字签名,php,cryptography,digital-signature,Php,Cryptography,Digital Signature,是否可以让用户对文档进行电子签名 场景 我在我的网站上上传文档供用户审阅和签名 用户登录、查看文档,然后以某种方式对其进行数字签名。(不是他们签名的图像) 我收到了一份文件,上面有他们合法签字的证明 我更希望用户不需要下载,签署一些第三方工具,然后上传文件。我希望他们在网页上以某种方式执行此操作,可能是在登录时在文档的框中键入全名。一种可行的方法是为每个用户生成一个。这两个密钥(私钥和公钥)都需要保留在服务器上,私钥受密码保护。理想情况下,只有用户自己知道密码(生成密钥时询问密码,但不要保存密码

是否可以让用户对文档进行电子签名

场景

  • 我在我的网站上上传文档供用户审阅和签名
  • 用户登录、查看文档,然后以某种方式对其进行数字签名。(不是他们签名的图像)
  • 我收到了一份文件,上面有他们合法签字的证明

  • 我更希望用户不需要下载,签署一些第三方工具,然后上传文件。我希望他们在网页上以某种方式执行此操作,可能是在登录时在文档的框中键入全名。

    一种可行的方法是为每个用户生成一个。这两个密钥(私钥和公钥)都需要保留在服务器上,私钥受密码保护。理想情况下,只有用户自己知道密码(生成密钥时询问密码,但不要保存密码),其他人不知道密码。然后,在用户通过输入其私钥密码对文档进行签名后,您将能够使用其公钥验证其“签名”

    该过程本身在很大程度上取决于您的服务器设置(即访问加密工具、数据库等)

    PS:我怀疑这是否具有法律约束力(至少不是我所在的地方),但您的管辖权可能会有所不同。

    “某种验证他们合法签署的方式。”。。根据国家的不同,其含义略有不同(您的个人资料未指明您所在的位置)。关于法律部分,我只能代表美国回答。。但是在技术方面

    您可以使用PHP将PDF的每个页面导出为PNG,然后将每个页面(作为PNG图像)呈现给用户查看。然后使用JavaScript记录用户在指定位置的签名操作。然后用户发布他/她对签名的接受并记录。当每个用户都“签名”后,您可以下载文档。当第一个用户想要下载带有所有签名的PDF时,您可以简单地应用签名证书,验证您(您的应用程序/公司)证明文档和签名的真实性,就像“公证人”公证文档一样。您必须能够提供一种方式,使文档链接到签名的签名日志(当您记录用户签名的操作时)和身份验证日志(当您对用户进行身份验证时)。我使用包装在JavaSOAP服务中的iText来处理PDF,然后让PHP调用该服务。我已经创建了一个这样做的应用程序,但现在它仍然在alpha中,否则我会链接它

    dotloop有一个与上述类似的简单方法,不包括真实身份验证,显然他们的系统已成功用于数千笔房地产交易(托管公司将对交易各方进行身份验证)

    注意:应用程序登录,甚至OAuth都不像欧洲智能卡那样可靠,但即使是那些也不是傻瓜。也许更好的身份验证解决方案是让用户上传其ID的副本(AirBnB会这样做)。另一个解决方案可能是集成一个简单的flash应用程序,记录签名者声明他们接受该交易的签名,并将其链接到文档和签名


    要记住的关键是:(1)你可以处理web应用程序堆栈中的所有内容(HTML;JavaScript;PHP;iText),这样用户就不必下载实际的PDF文件。(2) 在许多情况下,只要您能够验证对文档进行签名操作的用户,就只需在最终文档上“证明”用户进行了签名,并提供证明(就像dotloop所做的那样),而无需验证每个签名。通过认证,我的意思是,你用证书签署最终的PDF。

    也许可以在他们登录时,在文档旁边的框中键入全名。-这听起来不像是一种具有法律约束力的签名。不是我住的地方(NL/欧洲),你需要在政府移交的CC认证eID“智能卡”上用钥匙签名。那只是因为他们填写了这方面的法律。然而,他们还没有为此分发任何开斋节……真相。我只是说也许全名只是验证过程中的一部分。顺便说一句,我住在美国。因此,例如,我会让用户创建一个仅用于签署文档的密码?此密码将用于他们的私钥,因此只有他们才能在技术上“签署”文档。一旦文档被签名,它就被加密了,然后我们使用公钥来解密它,如果它匹配,我们就可以了?或者是我完全错了……这基本上概括了这个想法,是的。一个小问题。我怎么知道文档是用私钥而不是公钥签名的?或者是因为我持有公钥,所以其他人不应该拥有它?不,你可以在facebook上发布公钥,这没关系。请阅读链接的维基百科文章(特别是关于数字签名的部分)。它说:“[…]是使用非对称密钥算法,用于加密消息的密钥与用于解密消息的密钥不同。”在您的情况下(数字签名),用于加密的密钥是私钥,而公钥用于验证签名。此外,加密在您的服务器上进行(您提到您不希望用户摆弄第三方工具)。因此,这是一个非常简单的问题:您使用用户的密码和私钥进行加密-您使用用户的公钥进行解密。如果结果有意义(您正在加密的ID或任何其他任意数据)然后你可以确定用户已经签署了文档。我开发了一个平等的解决方案客户端PHP和Java iText服务器。你知道如何使用纯PHP私钥签署从iText收到的哈希吗?我做错了,因为在使用openssl_sign()签署后,最终的PDF是c