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 对称密钥
- 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
- 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
- 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)模式 进行加密时,数据被分割处理的基本单位。
详细解释:
- AES 块:
块加密:AES 是一种块加密算法,它将明文分割成固定大小的块,每个块通常为 128 位(16 字节)。
块处理:AES 对每个块独立进行加密,但在使用 CBC 模式时,各个块之间存在依赖关系。
- CBC 模式:
工作原理:
- 初始向量 (IV):在 CBC 模式下,加密过程开始时,需要一个初始向量 (IV)。
- XOR 操作:将明文的第一个块与 IV 进行按位异或(XOR)运算,然后再对结果使用 AES 加密,生成第一个密文块。
- 密文链接:接下来的每个明文块在加密前都要与前一个密文块进行 XOR 运算,然后再进行 AES 加密。这样,每个密文块的生成不仅依赖于当前的明文块,还依赖于前一个密文块。
- 解密过程:解密时,每个密文块先通过 AES 解密,再与前一个密文块(或 IV,对于第一个块)进行 XOR 运算,恢复出原来的明文块。
- 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 加密,生成第二个密文块。
依此类推,直到所有块都被加密。