swupdate-签名验证

swupdate签名部分具体在链接中可以查看。
swupdate加密部分具体在链接中可以查看。

签名部分

签名整个镜像

将整个镜像进行签名,看起是很直接。但是也有一些缺点,只有在所有的镜像被加载完全后才能做一些验证。如果验签不通过的部分镜像还会涉及到一些卸载工作,这些操作是不太安全的。

签名子镜像

如果签名子镜像,可以在安装之前就进行验签工作。仅仅签名通过的子镜像才能被安装。尽管sw-description被签名了,攻击者能将签名的子镜像混合起来组成一个新的镜像。

SWUPDATE 结合使用签名sw-description和hash验证的方式,解决上面两种缺陷

To avoid the described drawbacks, SWUpdate combines signed sw-description with the verification of hashes for each single image. This means that only sw-description generated by a verified source can be accepted by the installer. sw-description contains hashes for each sub-image to verify that each delivered sub-image really belongs to the release.

为了避免上面两种方法的缺陷,swupdate结合了签名sw-description和每个镜像进行hash验证的方式。这就意味着sw-description是可信任的源产生的,能够被安装者验签通过。 sw-description中包含了每个镜像的hash值,这样保证了每个子镜像也属于发布者,完整性也有保障。

算法的选择

提供了三种方式,都可以对sw-description进行签名:

  • RSA Public / private key 非对称密钥
  • CMS using certificates 非对称密钥
  • GPG key signing 对称密钥
  1. RSA签名步骤(只使用了普通签名方式,官方中还是用了passphrase)
openssl genrsa -aes256 -out priv.pem
openssl rsa -in priv.pem -out public.pem -outform PEM -pubout
openssl dgst -sha256 -sign priv.pem sw-description > sw-description.sig
  1. CMS
openssl req -x509 -newkey rsa:4096 -nodes -keyout mycert.key.pem \
    -out mycert.cert.pem -subj "/O=SWUpdate /CN=target"
openssl cms -sign -in  sw-description -out sw-description.sig -signer mycert.cert.pem \
        -inkey mycert.key.pem -outform DER -nosmimecap -binary
  1. GPG
gpg –gen-key
gpg –batch –output sw-description.sig –detach-sig sw-description

编译一个签名的SWU 镜像

有两个文件sw-description 和 sw-description.sig, sw-description.sig必须紧紧的跟在sw-description 文件后面。
每一个子镜像都必须要有sha256,如果有镜像没有sha256 ,则整个大镜像将验证不通过。

简单的签名镜像产生脚本如下:


MODE="RSA-PKCS-1.5"
PRODUCT_NAME="myproduct"
CONTAINER_VER="1.0"
IMAGES="rootfs kernel"
FILES="sw-description sw-description.sig $IMAGES"

#if you use RSA
if [ x"$MODE" == "xRSA-PKCS-1.5" ]; then
    openssl dgst -sha256 -sign priv.pem sw-description > sw-description.sig
elif if [ x"$MODE" == "xRSA-PSS" ]; then
    openssl dgst -sha256 -sign priv.pem -sigopt rsa_padding_mode:pss \
        -sigopt rsa_pss_saltlen:-2 sw-description > sw-description.sig
elif if [ x"$MODE" == "xGPG" ]; then
    gpg --batch --homedir "${GPG_HOME_DIR}" --default-key "${GPG_KEY}" \
        --output sw-description.sig --detach-sig sw-description
else
    openssl cms -sign -in  sw-description -out sw-description.sig -signer mycert.cert.pem \
        -inkey mycert.key.pem -outform DER -nosmimecap -binary
fi
for i in $FILES;do
        echo $i;done | cpio -ov -H crc >  ${PRODUCT_NAME}_${CONTAINER_VER}.swu

加密部分(不使用PKCS#11 token)

swupdate 允许对更新的镜像在CBC模式下使用AES块密码对称加密镜像。
下面显示加密使用256 位长度的key。

编译一个加密SWU镜像步骤

  • 创建一个key(对于aes-256-cbc 我们需要一个32字节的key和16字节的初始化向量)
openssl rand -hex 32
# key, for example 390ad54490a4a5f53722291023c19e08ffb5c4677a59e958c96ffa6e641df040
openssl rand -hex 16
# IV, for example d5d601bacfe13100b149177318ebc7a4
  • 使用这些信息加密镜像
openssl enc -aes-256-cbc -in <INFILE> -out <OUTFILE> -K <KEY> -iv <IV>

INFILE:是未加密的源镜像
OUTFILE:是加密后的镜像文件
KEY,IV:是上面产生的两个十六进制数

  • 创建一个key文件将上面两个值合成一行,中间使用空格。放进文件中。如下:
390ad54490a4a5f53722291023c19e08ffb5c4677a59e958c96ffa6e641df040 d5d601bacfe13100b149177318ebc7a4
  • 如果对单个镜像加密
    IV值实际上是能修改的,每个新的镜像文件都可以在sw-description文件的ivt属性中修改这个值。如下:
software =
{
        version = "0.0.1";
        images: ( {
                        filename = "core-image-full-cmdline-beaglebone.ext3.enc";
                        device = "/dev/mmcblk0p3";
                        encrypted = true;
                        ivt = "65D793B87B6724BB27954C7664F15FF3";
                }
        );
}

AES和CBC是什么?为什么需要IV 和KEY?(以下为ChatGPT回答)
CBC 模式下的 AES 块指的是在 AES(Advanced Encryption Standard) 算法中,使用 CBC(Cipher Block Chaining)模式 进行加密时,数据被分割处理的基本单位。

详细解释:

  1. AES 块:

块加密:AES 是一种块加密算法,它将明文分割成固定大小的块,每个块通常为 128 位(16 字节)。
块处理:AES 对每个块独立进行加密,但在使用 CBC 模式时,各个块之间存在依赖关系。

  1. CBC 模式:

工作原理:

  • 初始向量 (IV):在 CBC 模式下,加密过程开始时,需要一个初始向量 (IV)。
  • XOR 操作:将明文的第一个块与 IV 进行按位异或(XOR)运算,然后再对结果使用 AES 加密,生成第一个密文块。
  • 密文链接:接下来的每个明文块在加密前都要与前一个密文块进行 XOR 运算,然后再进行 AES 加密。这样,每个密文块的生成不仅依赖于当前的明文块,还依赖于前一个密文块。
  • 解密过程:解密时,每个密文块先通过 AES 解密,再与前一个密文块(或 IV,对于第一个块)进行 XOR 运算,恢复出原来的明文块。
  1. CBC 模式下的安全性:
  • 优点:因为每个块的加密都依赖于前一个块的密文,CBC 模式增加了安全性,使得相同的明文块在不同的加密上下文中生成不同的密文。
  • 缺点:CBC 模式的加密过程是串行的(不能并行),并且解密过程对错误非常敏感,如果一个块出现错误,它将影响解密的当前块和下一个块。

假设我们有一段明文 “Hello World! This is AES CBC mode.”,使用 AES 加密时,首先会分成几个 128 位的块:

块1: "Hello World! Th"
块2: "is is AES CBC mo"
块3: "de."

在 CBC 模式下:

第一个块 “Hello World! Th” 先与 IV 进行 XOR 运算,然后进行 AES 加密,生成第一个密文块。
第二个块 “is is AES CBC mo” 先与第一个密文块进行 XOR,然后进行 AES 加密,生成第二个密文块。
依此类推,直到所有块都被加密。

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值