数字签名是一种广泛使用的安全技术来保证数据的完整性和签名者的身份验证。

创建一个数字签名的第一步是使用非对称加密(也称为公开密匙加密)生成一对密钥:

  • 公钥:提供给任何人。身份验证过程中使用它。

  • 私钥:唯一已知的签名者。它用于签署过程。

这些钥匙是互补的:如果数据是用私钥加密,公钥是需要解密数据。同样,如果使用公钥加密数据,应该使用私钥解密。

生成文档的签名,用私钥加密,只有签名者。请注意,这并不提供任何机密性:公钥是被任何人,所以任何人都可以解密文档。然而,解密签名与公众签名者键和获得相同的文档保证:

  • 签名是生成的私钥。(否则,解密过程会失败。)因为只有签名者的私钥,签名是由签名者生成。

  • 文件没有被修改。(否则,文档不匹配获得签名。)

自签名是相同的大小文件,签署文档最终被文档大小的两倍。为了解决这个问题,介绍了密码散列。

密码散列(也称为消化)是一个函数,任何规模的数据映射到一个固定大小的数据,设计一个单向函数。这意味着一些数据的哈希,应该非常计算很难推断的数据生成散列。几个属性使用的散列函数可以在这种情况下不引入方案的弱点:

  • 数据的变化产生的变化数据的哈希在一个难以捉摸的。

  • 考虑到一些数据的哈希,这是不可行的产生其他数据相同的散列值。

而不是加密整个文档生成签名,签名生成的散列文件。这生成一个很小的签名的大小无关的数据被签名。下图显示了完整的流程:

图像

验证签名的文档

验证签名的文件,遵循这个过程:

  1. 解密签名获得原始文档的散列。

  2. 计算文档的散列。

  3. 散列值进行比较。他们匹配,必须满足下列条件:

    • 文件没有被修改。这提供了完整性保证。

    • 用于生成签名的密钥相关联的私钥,公钥的使用。这提供了身份验证的保证。

如果散列值匹配,签名是正确的和文档是有效的。下图说明了身份验证过程:

图像

你怎么能保证签名者的公钥是公开密钥?如果攻击者提供了一个公共密钥,就好像它是使用的签名者的公钥,攻击者可以使用自己的私钥签署图像。有几种方法可以解决这个问题。

验证并引导固件签署

固件的验证,最常见的方法是程序的公钥在生产设备的安全存储记忆。保证安全存储公钥不能修改和编程的签名者。这个方案验证和引导固件镜像签署如下所示:

图像