使用OpenSSL对大文件进行签名

使用OpenSSL对大文件进行签名,openssl,Openssl,我需要对包含固件的大型二进制文件进行签名,然后在接收该签名的目标设备上验证该签名。在读了一些文章后,我总结出了一种方法,但我不确定是否应该这样做。以下是我迄今为止所做的工作: 发送方生成私钥: $ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:3 -out privkey-ID.pem $ openssl pkey -in privkey-ID.pem -out p

我需要对包含固件的大型二进制文件进行签名,然后在接收该签名的目标设备上验证该签名。在读了一些文章后,我总结出了一种方法,但我不确定是否应该这样做。以下是我迄今为止所做的工作:

发送方生成私钥:

$ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:3 -out privkey-ID.pem
$ openssl pkey -in privkey-ID.pem -out pubkey-ID.pem -pubout
发送方使用私钥生成公钥:

$ openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:3 -out privkey-ID.pem
$ openssl pkey -in privkey-ID.pem -out pubkey-ID.pem -pubout
发件人生成摘要并使用它对文件进行签名:

$ openssl dgst -sha256 -sign privkey-ID.pem -out out.sha256 rootfs.jffs2
接收方验证签名:

$ openssl dgst -sha256 -verify pubkey-ID.pem -signature out.sha256 rootfs.jffs2
在执行第4步时,我得到了一个“确认OK”响应,但我不确定是否正确完成

此外,还需要使用对称密钥进行签名。据我所知,使用对称密钥签名意味着必须在发送方和接收方使用相同的密钥,但这里我使用私钥签名,并使用公钥验证


非常感谢您对以上几点进行澄清。

您生成了一个SHA256摘要(或哈希;表示整个文件的短值),对其进行了签名,并使用非对称RSA算法验证了签名

非对称RSA算法使用公钥和私钥。任何人都可以用公钥加密数据,只有私钥的所有者才能解密。签名的工作原理正好相反,所有者可以用私钥加密数据进行签名,每个人都可以解密数据以验证签名

但根据您的要求,您需要使用对称算法,如HMAC-SHA256。它在内部计算相同的SHA-256摘要,然后用提供的密钥对其进行签名

cat filename | openssl dgst -sha256 -hmac "sharedkey"

它没有用于签名和验证的单独命令,您只需在两台设备上运行相同的操作并比较结果。

这个问题似乎与主题无关,因为它与编程或开发无关。也许信息安全堆栈交换会是一个更好的提问场所。非常感谢您的回复。。请你在签名部分再解释一下好吗。这是否意味着,如果我们使用私钥对文件进行签名,那么每个拥有从该私钥派生的公钥的人都可以对其进行验证,反之亦然?是的,没错。这就是不对称的工作原理。私钥和公钥中存储的数字之间存在单向数学关系。在计算上很难(=在合理的时间内不可能)将其反转。您选择了RSA,它具有特定的属性,私钥和公钥都可以用于加密和解密,但只能与第二个密钥成对使用。所以,如果你反向加密,你使用私钥来“加密”(=签名),任何拥有公钥的人都可以“解密”(=验证)。对于其他非对称算法,这是不可能的。还有其他仅用于签名的算法(例如DSA、ECDSA)。感谢您的澄清。实际上我这里有两个要求。首先我需要加密一个文件,然后签名。由于文件大小可以在5 MB到25 MB之间,因此我计划使用openSSL S/MIME来实现这一点。我在这里提到的这个文件实际上是一个固件映像,需要下载到linux设备上。所以我需要在linux设备中的某个地方有私钥来解密固件映像。解密后,如果我需要验证签名,那么我需要在设备中也有公钥。我想,将两个密钥保持在同一位置将违反非对称加密逻辑。因此,如果我使用的是您建议使用HMAC的sharedkey,那么它还需要与加密图像一起共享,以验证签名。除此之外,我可能还需要将sha256文件(摘要)发送到签名验证。这将很难在执行方面做到。我喜欢一个文件。(可能是带有共享密钥和sha或摘要值的加密固件映像。)有办法做到这一点吗?