当我在Java中研究签名文件时,我会读到您散列文件并将散列附加到实际文件,进行加密并将其发送到(例如)服务器。在服务器中,您解密文件,获取文件,创建它的散列,如果它的新散列等于客户端的散列,则该文件实际上是客户端的。
但是现在我必须在我的项目中实现它,我只能使用java.security.Signature (like this one)找到示例,并且在这些示例中,他们签署文件,然后发送文件和签名归档到验证而不是仅发送签名文件。
这是实施它的正确方法吗?如果没有,最好的方法是什么?请给出一些指示。
答案 0 :(得分:2)
您发布的链接只显示了一个示例,其中代码的后半部分称为
public static boolean verifySig(byte[] data, PublicKey key, byte[] sig)
只是验证创建签名的代码的前半部分
我们的想法是,在signer.initVerify(key);
您传递签名者的公钥,然后在认为签名所基于的数据上调用signer.update(data);
,然后调用验证传递签名。
如果您传入的签名对您认为签名所依据的数据有效,则验证成功。
答案 1 :(得分:1)
加密文件和签名之间没有任何关联。你可以独立完成其中一个或两个。
要进行签名,您需要计算哈希值,使用私钥加密哈希值,并将加密哈希值与文档(文件)一起发送。 要验证,您需要计算收到的文档的哈希值,使用公钥解密加密的哈希值,然后比较这两者。如果哈希值匹配,则验证签名。
由于验证使用公钥,因此任何人都可以验证签名。但只有拥有私钥的人(或实体)才能签名。因此它证明了文件的起源。
除此之外,如果您愿意,可以加密文件。您可以在加密之前或之后对文件进行签名。这一切都取决于你想用它做什么以及你想要保持它的安全性。例如,SSL证书未加密,因为浏览器必须检查其内容及其签名。