Cyr*_*ger 1 php mysql electronic-signature
你好 Stackoverflow 社区,
我在电子签名方面有困难,尤其是如何在技术要求方面适用新加坡法律。
根据法律,如果签名符合以下条件,新加坡接受电子签名:
我们可以通过 HTML5 画布制作电子签名,然后将其保存为数据库 64 字符串。这意味着第 1.、2. 和 3. 点没问题。
问题出现在第 4 点,我们确实可以将签名和数据组合在一个加密的字符串中,但是,由于我们同时拥有签名和数据,我们将能够编辑数据并创建一个新字符串:
|id|name|price|signature|final_hash|
------------------------------------
|12|test|40000|data:base|3edcde4642|
Run Code Online (Sandbox Code Playgroud)
所以我们想到了另一种方式,就是在final_hash中混入一些我们不知道的参数,比如签名者的IP地址,他/她的用户代理……但是,由于我们不保存这些值,这意味着如果某些值被修改,我们将无法稍后检查。
这就是我们被困的地方,你知道如何做到这一点吗?对我来说,既可以检查是否有数据被修改,又不能在以后修改数据似乎是不可能的,但我当然可能是错的。
非常感谢你的帮助!
注意:我使用术语“文档”来指代您要签署的任何内容。
首先,使用 HTML5 画布或类似方法获得的不是签名而是指纹。我的意思是它可以识别客户,但它不能签署文件(至少不是单独签署)。两个注意事项:
您不应通过将指纹连接到数据来签名。那不是签名,那是salt,也不是最好的 salt 方法。
顺便说一句,ClientJS是一个创建浏览器指纹的好工具
- 对使用它的人来说是独一无二的;
- 能够识别该人;
这些要求拼写为“身份”。这意味着你需要一个人的身份证。
- 以在使用它的人的唯一控制下的方式或使用方式创建;和
此要求拼写“身份验证”。这意味着您需要验证人们是否是他们声称的人。一)东西的人:你可能已经看到了理论,您这样做是(即生物识别)二)东西的人都知道(即密码)或c)一些人有(即电子邮件账户的访问,一个手机, 等等...)。
您似乎正在使用浏览器指纹进行身份验证和身份验证,这让我感到困扰。这可能会使伪造请求以假装是另一个用户变得太容易了。
通常在这种情况下你会做的是使用用户名和密码进行传统的身份验证过程,然后发出 cookie。你为什么要避免这种情况?
- 以某种方式链接到与其相关的电子记录,如果记录被更改,则电子签名将失效。
此要求拼写“签名”。这可能意味着电子记录将是公开的,我们希望防止伪造。
既可以检查是否有数据被修改,又不能在以后修改数据,这似乎是不可能的
一般的想法是在修改文档时使签名无效。如果要使修改正式,则需要创建一个新的签名。
为了防止第三方从修改后的消息中创建签名,您需要添加一些密钥。现在,这提出了两个问题:
第三方是否应该能够验证签名?如果应该,您需要一个不对称算法。
是否应该保护文档免受您(或有权访问服务器的人)的侵害?如果它们应该受到保护,则表明您需要为每个用户设置一个秘密。最简单的解决方案是设置密码。
要在 PHP 中实现非对称解决方案,我建议使用phpseclib。
按照他们的示例创建密钥对:
include('Crypt/RSA.php');
$rsa = new Crypt_RSA();
$pair = $rsa->createKey();
$privatekey = $pair['privatekey'];
$publickey = $pair['publickey'];
Run Code Online (Sandbox Code Playgroud)
该代码将使用从服务器收集的熵来生成密钥对。
然后你可以用它来做简单的RSA 签名和验证。
include('Crypt/RSA.php');
$rsa = new Crypt_RSA();
$rsa->loadKey('...'); // private key
$plaintext = '...';
$signature = $rsa->sign($plaintext);
$rsa->loadKey('...'); // public key
echo $rsa->verify($plaintext, $signature) ? 'verified' : 'unverified';
Run Code Online (Sandbox Code Playgroud)
如果需要在客户端验证签名,可以使用jsrsasign。
对于您的用例,服务器只需要一个密钥对。这里的概念是服务器正在签署文档。如果签名匹配,则表示指纹正确。
无论哪种方式,您都应该保密您的私钥(永远不要将其发送给客户端),并且您可以与任何需要验证签名的人共享公钥。
使用它,服务器可以对标识用户/客户端的文档(例如,包括指纹)进行签名,并发布带有签名的文档。该文档将完全可读(未加密),但如果有人修改它,签名将不再有效。
为了验证签名,他们需要公钥。但是,公钥对于创建假签名没有用,要做到这一点,他们需要获取私钥。
对称算法的主要优势在于性能。对称算法的缺点是您需要密钥来验证它。
因此,如果您需要第三方能够验证签名(或者即使您需要在客户端进行验证),您将暴露用于创建签名的密钥。
在这种情况下,签名更容易实现。使用hash_hmac密钥签名。要验证签名,请重复该过程并将其与您获得的签名进行比较。
我不确定您是否要保护自己的数据。也就是说,如果您的目标是防止您(或您的团队/或管理服务器的人)篡改数据。
如果这是您想要的,您可以用密码保护您的密钥。对于非对称解决方案,phpseclib 允许您设置用于加密私钥的密码(因此需要能够签名)。对于对称解决方案,您可以直接使用密码作为密钥。
如果您想要从您的指纹生成密码,您可以使用密钥派生函数来实现……但是,请记住会有指纹冲突,并且拥有唯一的浏览器指纹可以被视为隐私问题。
您可以使用密钥派生函数从外部输入(浏览器指纹、用户密码等)获取加密密钥。
从最差到最好的选择:
hash_hmac. 对我来说,这是第一个明智的选择。将连接的散列更改为对hash_hmac. 此外,它将保护您免受散列算法(已知或待发现)的部分原像漏洞。hash_hkdf或hash_pbkdf2.注意:有时人们(包括过去的我)将这些密钥派生函数称为哈希函数。原因是当您使用它们时,您不会(直接)调用常规散列函数,并且它们给您的是技术上的散列。然而,实际上,它们不是散列算法;它们是建立在散列之上的算法……事实上,使用它们的参数之一就是内部使用的散列函数。
| 归档时间: |
|
| 查看次数: |
438 次 |
| 最近记录: |