2011-10-19 21 views
5

如果你想确保文件是有效的(篡改,并从正确/预期的来源来),有两件事情可以做:散列,并签约散列与签名的二进制文件

出于我的问题,散列意味着提供文件(以及文件)的散列下载。客户端下载哈希和文件,重新计算哈希,并验证它是否与下载的哈希相匹配;这“证明”该文件未被篡改。

签名表示使用公私密钥加密方案,您使用公钥对二进制文件进行签名,并且客户端使用私钥验证您是否确实签署了密钥。

基于这些定义,我并不真正看到签署某些东西和散列某些东西的主要好处。他们都应该证明文件没有被篡改。

我可以看到的唯一情况是,使用哈希,受损的服务器可能意味着某人也会损害哈希并用一个匹配键替换恶意二进制文件;但是只要私钥保密,就没有办法伪造恶意文件。

或者我错过了什么?

+0

对于http://security.stackexchange.com,这可能是一个更好的问题。 –

+0

@MattBall在这种情况下,请提名它移动。 – ashes999

回答

6

不同之处在于:黑客可以更新哈希以匹配被篡改的文件,但不能生成有效的签名。

使用私钥进行签名,使用公钥进行验证。你说过上面的相反。它通常也是在文件的哈希上完成的,而不是出于实际原因的文件本身。

+0

是什么阻止你更换公钥? – u0b34a0f6ae

+0

@ u0b34a0f6ae它将不匹配使用的私钥... – Bohne

2

签名验证两件事 - 文件没有被篡改,签名者的身份。如果你能确定给你散列的实体绝对是应该给你的文件的实体,那么这两者是等价的。签署和认证机构是确保信任关系的一种方式。

2

提供一些数据(一个可执行文件,无论什么)以及一个散列和提供相同数据以及一个签名的最大区别在于散列,数据和散列值都来自同一个地方。所以,如果有人能够妥协其中一个,他可能也会妥协另一个。例如,如果我可以入侵你的Web服务器,我可以很容易地用我自己的版本替换你的可执行文件,并用我的可执行文件的正确散列替换散列值。

如果您签署了可执行文件,我不能为另一个可执行文件生成另一个签名并替换原始签名。签名验证原始数据的散列(数据自签名后未更改),并且签名是由您的私钥生成的。

当然,这一切都假设收到签名的可执行文件的人以某种可信的方式收到了您的公钥。如果我可以欺骗人们使用我的公钥而不是您的公钥,那么我可以侵入您的网站并用我自己的网站替换您签署的可执行文件。这就是为什么我们有证书颁发机构。

This page具有数字签名的高级概述。

3

对于传递给函数的特定数据,散列是具有固定长度的字符(或以二进制表示的位)的输出。 哈希是不可逆的。特定数据的哈希值总是相同的。如果数据中的单个位发生变化,则几乎整个散列都会改变已更改的数据。计算散列的过程称为散列。

在非对称密码学中,每个通信方都有自己的密钥对(私钥和公钥)。顾名思义,私钥通常是保密的,公钥是共享的。这些密钥本质上是这样的,即如果使用其中一个用于加密,则唯一的其他密钥对可以解密。

为了达到不可否认性(发送者不能拒绝他发送的消息)和验证接收数据的特定实体,公共密钥被共享给他们,以便他们可以解密由发送者使用相应的私钥加密的任何内容与发件人(只与发件人即秘密) 但请注意,本例中的机密性为星期,因为发件人不知道并且无法保证公钥是否被未知的攻击所破坏。

当私钥用于加密哈希然后它成为一个签名,这个过程被称为签名。这实现了真实性(当使用私钥时,数据来自真正的人),并且也保证了完整性,因为接收机通过使用由发送方给予他的相应公钥对接收数据进行解密来验证哈希,然后计算相同的哈希在他自己和匹配它。