如何使用数字签名来控制软件升级?
How can I use a digital signature to control software upgrades?
我正在寻求一些关于如何最好地防止(或至少阻止)嵌入式系统上未经授权的软件升级的具体建议。它不需要是防弹的,我们现在可以假设系统本身已被充分锁定,因此没有人可以未经授权访问它。
我的计划基本上是在系统上安装一个安装程序进程 运行,它可以从任何地方接收更新包,但可以在尝试安装之前确保这些包来自受信任的来源(即我) .
简单来说,更新包就是有实际的安装包,加上匹配的只能自己生成的数字签名。此外,签名将完全由自己生成,不涉及外部权威。
所以这些是我对可能过程的想法:
生成 private/public 密钥对并将 public 密钥与嵌入式系统本身一起分发。
创建软件安装包时,使用我们的私钥通过签名生成器传输包的内容(或包的 MD5)。
随签名分发软件安装包。
让安装程序根据软件安装包检查签名(使用它已有的 public 密钥),只有在匹配时才安装。
如果有人能发现此方案有任何问题,我将不胜感激详细信息,以及有关如何避免这些问题的任何具体建议。此外(虽然这不是问题的主要目的),任何关于生成密钥的工具的建议都将不胜感激。
我没有发现您的解决方案有任何明显的问题。我可以提出您可能已经考虑过的改进建议
如果嵌入式软件被充分锁定,则无需采取额外措施来保护随软件分发的 public 密钥的完整性(例如,通过对安装程序本身进行签名和混淆,这可能是头痛)
我考虑过使用 TLS 连接来下载更新,但实际上并不需要,因为包将受到数字签名的保护
我建议将 public 密钥封装在 X509 证书中。通过这种方式,您可以控制有效期,甚至可以在私钥被泄露时进行撤销。在这种情况下,您将需要一个分层的证书颁发机构,以及一个颁发签名证书的根证书。在安装程序的信任库中包含根证书的 public 部分。然后在 expiration/revocation 之后使用不同的签名证书对安装程序来说是透明的。
根证书的持续时间长,密钥大小大(应该便于保护),签名证书的持续时间较短,可以使用较小的密钥。
如果您需要一些额外的服务,您还可以使用此 CA 生成 TLS 证书:例如检查可用的更新。在这种情况下,将证书包含在安装程序的信任库中以避免 man-in-the-middle 攻击 (SSL-pinning)。
您可以签署完整的分发版或散列。它不影响安全性(请参阅 https://crypto.stackexchange.com/questions/6335/is-signing-a-hash-instead-of-the-full-data-considered-secure)但不要使用 MD5,因为它存在大量漏洞。使用 SHA-2 函数。
要生成密钥,您可以在命令行中使用 openssl 或使用 GUI 应用程序 KeyStore-Explorer
我正在寻求一些关于如何最好地防止(或至少阻止)嵌入式系统上未经授权的软件升级的具体建议。它不需要是防弹的,我们现在可以假设系统本身已被充分锁定,因此没有人可以未经授权访问它。
我的计划基本上是在系统上安装一个安装程序进程 运行,它可以从任何地方接收更新包,但可以在尝试安装之前确保这些包来自受信任的来源(即我) .
简单来说,更新包就是有实际的安装包,加上匹配的只能自己生成的数字签名。此外,签名将完全由自己生成,不涉及外部权威。
所以这些是我对可能过程的想法:
生成 private/public 密钥对并将 public 密钥与嵌入式系统本身一起分发。
创建软件安装包时,使用我们的私钥通过签名生成器传输包的内容(或包的 MD5)。
随签名分发软件安装包。
让安装程序根据软件安装包检查签名(使用它已有的 public 密钥),只有在匹配时才安装。
如果有人能发现此方案有任何问题,我将不胜感激详细信息,以及有关如何避免这些问题的任何具体建议。此外(虽然这不是问题的主要目的),任何关于生成密钥的工具的建议都将不胜感激。
我没有发现您的解决方案有任何明显的问题。我可以提出您可能已经考虑过的改进建议
如果嵌入式软件被充分锁定,则无需采取额外措施来保护随软件分发的 public 密钥的完整性(例如,通过对安装程序本身进行签名和混淆,这可能是头痛)
我考虑过使用 TLS 连接来下载更新,但实际上并不需要,因为包将受到数字签名的保护
我建议将 public 密钥封装在 X509 证书中。通过这种方式,您可以控制有效期,甚至可以在私钥被泄露时进行撤销。在这种情况下,您将需要一个分层的证书颁发机构,以及一个颁发签名证书的根证书。在安装程序的信任库中包含根证书的 public 部分。然后在 expiration/revocation 之后使用不同的签名证书对安装程序来说是透明的。
根证书的持续时间长,密钥大小大(应该便于保护),签名证书的持续时间较短,可以使用较小的密钥。
如果您需要一些额外的服务,您还可以使用此 CA 生成 TLS 证书:例如检查可用的更新。在这种情况下,将证书包含在安装程序的信任库中以避免 man-in-the-middle 攻击 (SSL-pinning)。
您可以签署完整的分发版或散列。它不影响安全性(请参阅 https://crypto.stackexchange.com/questions/6335/is-signing-a-hash-instead-of-the-full-data-considered-secure)但不要使用 MD5,因为它存在大量漏洞。使用 SHA-2 函数。
要生成密钥,您可以在命令行中使用 openssl 或使用 GUI 应用程序 KeyStore-Explorer