Linux嵌入式平台安全启动理解介绍

本文介绍了Linux嵌入式系统中安全启动的重要性和原理,特别是dm-verity机制。安全启动用于防止未经授权的软件运行,通过数字签名确保镜像完整性。dm-verity在挂载文件系统时,实时校验数据块的哈希值,提供高效的安全保障。此外,文章还解答了关于签名镜像构造、校验方法以及关键组件位置等相关问题。
摘要由CSDN通过智能技术生成

一、意义


        安全启动可以防止未授权的或是进行恶意篡改的软件在系统上运行,是系统安全的保护石,每一级的前一个镜像会对该镜像进行校验。

1.1 安全启动原理介绍

 
通过数字签名进行镜像完整性验证(使用到非对称加密算法和哈希算法)
签名过程:
raw_image--->use hash--->digest(摘要)
private_key--->digest--->signature
image+signature组合成为签名镜像
验签过程:
use hash--->raw_image--->digest1
public_key--->signature--->digest2
digest1 =? digest2
等于则验签成功,否则验签失败

代码实现过程如下:


#include <string.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/sha.h> 
#include <openssl/crypto.h> 
 
#define PUBLIC_KEY_PATH ("/hd1/program/config/ca/client_sunell_public.pem")
#define PRIVATE_KEY_PATH ("/hd1/program/config/ca/client_sunell_private.pem")
 
 
void printHash(unsigned char *md, int len)
{
 
	int i = 0;
    for (i = 0; i < len; i++)
	{
		printf("%02x", md[i]);
	}
 
	printf("\n");
}
 
 
/*读取私钥*/
RSA* ReadPrivateKey(char* p_KeyPath)
{	
	FILE *fp = NULL; 
	char szKeyPath[1024];
	RSA  *priRsa = NULL, *pubRsa = NULL, *pOut = NULL;
	
	printf("PrivateKeyPath[%s] \n", p_KeyPath);
 
	/*	打开密钥文件 */
	if(NULL == (fp = fopen(p_KeyPath, "r")))
	{
		printf( "fopen[%s] failed \n", p_KeyPath);
		return NULL;
	}
	/*	获取私密钥 */
	priRsa = PEM_read_RSAPrivateKey(fp, NULL, NULL,NULL);
	if(NULL == priRsa)
	{
		ERR_print_errors_fp(stdout);
		printf( "PEM_read_RSAPrivateKey\n");
		fclose(fp
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a2591748032-随心所记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值