当前位置: 首页 > news >正文

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" ]; thenopenssl dgst -sha256 -sign priv.pem sw-description > sw-description.sig
elif if [ x"$MODE" == "xRSA-PSS" ]; thenopenssl 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" ]; thengpg --batch --homedir "${GPG_HOME_DIR}" --default-key "${GPG_KEY}" \--output sw-description.sig --detach-sig sw-description
elseopenssl 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;doecho $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 加密,生成第二个密文块。
依此类推,直到所有块都被加密。


http://www.mrgr.cn/news/16163.html

相关文章:

  • “喂饭级”教程!建筑AI生成设计Stable Diffusion看这篇就够了!
  • PyCharm下载安装教程(详细步骤)附激活码!
  • 简化理解:Tomcat 和 Servlet 规范
  • AIGC大师秘籍:六步法打造精准文字提示词
  • 仿华为车机UI--图标从Workspace拖动到Hotseat同时保留图标在原来位置
  • 如何有效应对团队成员不服从领导的情况 —— 从PMP视角出发
  • 不知道电脑驱动软件哪个好,试试这几款免费不限速的驱动安装软件
  • Java 入门指南:Java 并发编程 —— 两万字详解 进程(Process)与线程(Thread)
  • 腾讯云TRTC无UI集成——分享屏幕主流、辅流(Vue2+JS+TRTC无UI集成)
  • 关于redux的一点记录
  • Ajax day-01
  • Linux进程基本介绍,ps指令详解
  • RabbitMQ练习(Remote procedure call (RPC))
  • 解决警告【WARNING: Ignoring invalid distribution -xxx 】
  • 二叉树--递归遍历--层次遍历--非递归遍历--详解
  • 500Kg载重无线遥控履带式无人车技术详解
  • Python tuple元数据操作:提升你的数据处理能力
  • [Day 68] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • cannot import name ‘greycomatrix‘ from ‘skimage.feature.texture‘ 解决方法
  • YoloV8实战:数据集制作|两种高效的Labelme转Yolo脚本|适用于YoloV5、V7、V8、V9、V10