“签署”文件的真正含义是什么?

信息安全 证书 电子签名
2021-08-18 22:21:07

我对安全性有点陌生,并试图正确理解这些概念。

我想知道“签署”文件(证书、apk 文件或其他文件)究竟是什么意思?

  1. 我们是否对整个文件进行签名,使其变得有点加密?
  2. 有没有像我们签署并传递的一段纯文本,例如,一个 zip,让接收方在继续之前根据特定协议检查该段?
  3. 或者是其他东西?

据我所知,如果我们对整个文件进行签名,那么它会更安全,因为内容将被加密(或签名)。但我也见过/听过一些例子,你只签署一段文字而不是整个事情。

任何想法将不胜感激。

PS:我已经检查过密钥签名是什么意思?

4个回答

签署文件不会对其进行加密。当 Alice 签署文件时,她通常会签署整个文件。因此,她计算了整个文件的哈希值,并用她的私钥对哈希值进行签名,并将这条信息附加到文件中。
Bob 使用她的公钥来验证它并获得她计算的哈希值。然后他自己计算文件的哈希值(当然没有签名)并检查两个哈希值。如果它们与 Alice 发送的文件的完全相同版本匹配。如果他们不匹配,马洛里可能会改变它。

文件本身永远不会被加密,当然你可以删除签名,但它不再被签名(因此一文不值)。

有关更多技术和详细信息,请参阅森林答案:https ://security.stackexchange.com/a/198473/191453

不幸的是,这里声称签名等同于消息摘要加密的答案并不完全正确。签名不涉及加密消息的摘要。虽然将密码操作应用于由密码散列算法而不是消息本身创建的消息摘要是正确的,但签名行为与加密不同。

取自https://www.cs.cornell.edu/courses/cs5430/2015sp/notes/rsa_sign_vs_dec.php

在教科书的抽象世界中,RSA 签名和 RSA 解密确实是一回事。在现实世界的实现中,它们不是。因此,永远不要使用 RSA 解密的真实实现来计算 RSA 签名。在最好的情况下,您的实现将以您注意到的方式中断。在最坏的情况下,您将引入攻击者可以利用的漏洞。

此外,不要错误地从 RSA 中概括得出任何加密方案都可以作为数字签名算法的结论。这种改编适用于 RSA 和 El Gamal,但并非普遍适用。


为消息创建数字签名涉及通过散列函数运行消息,为消息创建摘要(固定大小的表示)。使用秘密值(私钥的一个组成部分)和一个公共值(公钥的一个组成部分)对摘要进行数学运算。此操作的结果是签名,它通常附加到消息或以其他方式与消息一起传递。任何人都可以通过拥有签名和公钥来判断消息是否由拥有私钥的人签名。

我将使用RSA作为示例算法。首先,介绍一下 RSA 的工作原理。RSA 加密涉及获取以整数表示的消息,并将其提高到已知值的幂(该值通常为 3 或 65537)。然后将该值除以每个公钥唯一的公共值。其余的是加密的消息。这称为模运算使用 RSA 签名有点不同。首先对消息进行哈希处理,然后将哈希摘要提升到秘密的幂数,最后除以公钥中相同的唯一公共值。剩下的就是签名。这与加密不同,因为它不是将数字提高到已知的公共值的幂,而是提高到只有签名者知道的秘密值的幂。

虽然 RSA 签名生成类似于纸上的 RSA 解密,但它在现实世界中的工作方式却有很大的不同。在现实世界中,使用了一种称为填充的功能,这种填充对于算法的安全性绝对至关重要。填充用于加密或解密的方式与用于签名的方式不同。以下细节更具技术性...


教科书 RSA作为非对称密码学的一个例子,将消息m加密为密文c是通过计算c ≡ m e (mod N) 来完成的,其中e是公共值(出于效率原因,通常是费马素数),而N是两个秘密素数的非秘密乘积。另一方面,对哈希m 进行签名涉及计算s ≡ m d (mod N),其中de的模逆,是从秘密素数导出的秘密值。这更接近于解密比加密更重要,尽管调用签名解密仍然不太正确请注意,其他非对称算法可能使用完全不同的技术。RSA 只是一个足够常见的算法,可以用作示例。

签名的安全性来自于在不知道秘密素数的情况下很难获得d的事实事实上,N 中获得d(或与d等效的值的唯一已知方法是将N分解为其分量素数pq,并计算d = e -1 mod (p - 1)(q - 1 ) . 对于经典计算机来说,分解非常大的整数被认为是一个棘手的问题。这使得可以轻松验证签名,因为这涉及确定是否s e ≡ m (mod N)但是,创建签名需要知道私钥。

当然,人们可以选择对想要的任何(部分)信息进行签名,而对其他部分不签名。但通常,当我们说“签署文件”时,我们指的是签署整个文件加上文件元数据(例如文件修改时间戳)。这就是 OpenPGP 和 GPG 的工作方式。

但是,如果它不是文件,比如说它是 XML 签名,则必须指定 XML 内容的哪些部分实际上被签名覆盖。

此外,尝试区分签名和加密。这是两个独立的问题。一个文件可以是未加密+签名,或加密+未签名,或任何其他组合。

对文件进行签名,或更一般地对某些内容(电子邮件消息、电子邮件消息的正文、XML 文档的子树、证书的一部分、TLS 握手等)进行签名,意味着创建一个字节序列这称为签名此过程具有某些特性:

  • 有一种验证签名的方法。验证签名会给出布尔结果,“这是一个好的文件签名”或“这不是一个好的文件签名”。
  • 一个文件的好签名永远不会是另一个文件的好签名。因此,一个好的签名可以保证文件是真实的。真实性,在安全方面,意味着某些数据确实来自它应该来自的地方。
  • 有一个秘密值称为private keysecret key如果您不知道该秘密值,就不可能创建一个好的文件签名。
  • 在公钥方案中,有一个与私钥关联的值,称为公钥如果您知道公钥,则可以验证签名,但不能创建其他文件的签名。

重要的是要知道任何人都可以对文件进行签名,但他们只能使用自己的私钥对其进行签名。除非您以某种方式设法掌握了私钥,例如通过入侵他们的计算机,否则您无法使用其他人的私钥签署文件。所以知道一个文件带有一个好的签名并不能说明什么:重要的是要知道它有一个用预期的 private key 制作的好的签名。这意味着验证者必须事先知道公钥。如果公钥与签名和消息一起传输,它本身并不能证明任何事情,但如果有某种机制允许验证者验证公钥,它会很有用。. 换言之,签名操作将对私钥保密的承诺和对公钥真实性的承诺转变为对文件真实性的保证。

签名通常意味着“我同意此内容”。“批准”的含义取决于上下文。例如:

  • 当 Microsoft 分发使用 Microsoft 的 Windows 更新签名密钥签名的 Windows 更新时,该签名意味着此特定代码更新已获得 Microsoft 的批准。如果有人想要分发恶意软件并将其作为 Windows 更新传递,他们将无法为其创建良好的签名,因此 Windows 更新应用程序将拒绝更新。
  • 如果您收到一封已签名的邮件,则意味着它确实是由签名人撰写的(或者他们的机器已被盗用)。通常,您不会从From:电子邮件中得到这种保证,因为任何人都可以在那里写任何他们想要的东西。(一些分发系统使它变得更难,但一般来说,在 Internet 上没有办法阻止人们在 From:网上写他们想要的任何东西。)
  • 当证书颁发机构签署证书时,他们的意思是他们已经验证证书中列出的域名的所有者是证书中对应公钥的私钥的所有者。这种将名称与公钥相关联的语句是公钥基础结构的基础
  • 当 TLS 服务器对 TLS 连接的握手进行签名时,它允许客户端验证他们是他们声称的身份。任何人都可以签署 TLS 握手,但只有 Google 可以使用google.com.

签名是一个单独的数据。它可以与签名数据一起捆绑在一个 zip 文件中,作为电子邮件的附件添加,作为单独的节点添加到 XML 文件中,等等。在证书中,签名与签名数据捆绑在一起。在 TLS 握手中,签名是服务器发送的消息的单独部分。

我们是否对整个文件进行签名,使其变得有点加密?

不可以。签名取决于文件的内容,但您无法从签名中恢复文件的内容。内容需要与签名一起传输。内容可以加密,但这与签名无关。

有没有像我们签署并传递的一段纯文本,例如,一个 zip,让接收方在继续之前根据特定协议检查该段?

对,就是这样。发件人将要签名的文件内容(zip 或文本或其他任何内容)传递给签名函数,并将私钥传递给签名函数,然后将签名取出。(“签名”一词既可以指这个过程,也可以指这个过程的输出。)接收者将内容和公钥传递给验证函数,并得到“它是好的”或“它是坏的”的结果。一般来说,如果签名不好,接收者会拒绝对内容做任何事情。

据我所知,如果我们对整个文件进行签名,那么它会更安全,因为内容将被加密(或签名)。

签名不会加密任何东西。对整个文件进行签名比对文件的一部分进行签名更安全,因为签名只会为您提供有关已签名部分的一些安全性。如果您签署文件的一部分,那么未签署的部分可以是任何东西。