内核加密机制及应用

透明加密与TDE:Linux内核文件系统加密原理与实操选型指南 数据加密是保障信息安全的关键技术,但传统应用层加密往往要求开发者主动调用加解密接口,带来高昂的改造成本和人为疏漏风险。透明加密则将加解密能力下沉至操作系统内核、文件系统或数据库引擎,对上层应用完全透明。其核心原理是在磁盘读写路径上自动完成加解密,使落盘数据始终为密文,同时集中管理密钥生命周期。这种技术广泛应用于数据库透明数据加密(TDE)、Linux内核fscrypt文件加密及LUKS整盘加密等场景,能有效抵御备份泄露和存储介质失窃风险,并极大降低存量系统改造难度。理解透明加密的安全边界与性能开销,掌握密钥 阅读详情

内核加密机制

  • linux 3.3.8

总体框架

仅显示关键结构

这里写图片描述

内核加密机制在内核中保存两个全局链表crypto_template_list和crypto_alg_list

  • crypto_template_list 保存所有的加密方式

    • e.g cbc ecb
  • crypto_alg_list 保存所有的加密算法

    • e.g md5 sha128 aes

crypto_template_list由各个算法通过crypto_register_template函数添加到链表中

crypto_alg_list由各个算法通过crypto_register_alg函数添加到链表中

数据结构说明

crypto_alg结构可以理解为真正保存加密接口的一个通用结构

  • struct list_head cra_users;

    指向crypto_spawn结构所在的链表

  • union cra_u;

    union {
    struct ablkcipher_alg ablkcipher;
      struct aead_alg aead;
    struct blkcipher_alg blkcipher;
    struct cipher_alg cipher;
    struct compress_alg compress;
    struct rng_alg rng;
    } cra_u;

    xxxxxx_alg结构体说明

    保存实际算法实现的函数接口和算法相关信息

    • blkcipher_alg
    struct blkcipher_alg {
      int (* setkey) (struct crypto_tfm *tfm, const u8 *key,unsigned int keylen);
      int (* encrypt) (struct blkcipher_desc *desc,struct scatterlist *dst, struct scatterlist *src,unsigned int nbytes);
      int (* decrypt) (struct blkcipher_desc *desc,struct scatterlist *dst, struct scatterlist *src,unsigned int nbytes);
      const char * geniv;
      unsigned int min_keysize;
      unsigned int max_keysize;
      unsigned int ivsize;
    };
    • int (* setkey)

      将产生的密钥及其相关信息保存在crypto_tfm结构的__crt_ctx[]部分。

      同它也负责检查密钥长度的合法性,以防在cra_init函数调用时,使用密钥长度与实际设置长度不符。

    • int (* encrypt)

      加密存放在scatterlist里面的数据,需要对齐scatterlist并且确保每一个加密块大小已经设置好

      这个函数不应该去修改__crt_ctx[]部分数据

    • int (* decrypt)

      环境与encrypt一致 过程与encrypt相反

  • union中结构初始化流程

    • cipher

    首先由算法本身实现xxxxx_alg结构体的初始化,通过xxx_mod_init函数调用crypto_register_xxxxx函数将xxxxx_alg传递到crypto_alg结构体中

    通过__crypto_register_alg函数将当前crypto_alg结构体添加到crypto_alg_list链表当中

    至此加密算法在内核中已成功注册

    • ablkcipher/rng/aead/blkcipher/compress

    首先由算法本身实现crypto_alg结构体的初始化,使用crypto_register_alg函数调用__crypto_register_alg函数

    将当前crypto_alg结构体添加到crypto_alg_list链表当中,至此xxxxx_alg算法在内核中已成功注册

crypto_template结构是通用组合算法的模板

  • struct hlist_head instances;

    该字段保存temp下所有的实例

  • struct crypto_instance *(*alloc)(struct rtattr **tb);

    每个算法在该函数中保存自己的模板

crypto_instance结构就是加密方式的一个实例对象 通过函数XXXX_alloc_instance

  • struct crypto_alg alg;

    该算法实现的函数接口

  • struct crypto_template *tmpl;

    算法实例对应的模板

  • void *__ctx[];

    保存crypto_spawn结构

crypto_spawn结构保存加密算法和加密方式的所有信息,以便之后通过crypto_spawn_tfm生成crypto_tfm的对象

  • struct crypto_alg *alg;

    保存的加密算法的接口

  • struct crypto_instance *inst;

    保存的加密方式的接口

Ps.以上结构体在内存中一直存在

crypto_tfm结构是内核中真正组合算法的实例化对象,真正的操作对象

  • union crt_u;

    union {
    struct ablkcipher_tfm ablkcipher;
    struct aead_tfm aead;
    struct blkcipher_tfm blkcipher;
    struct cipher_tfm cipher;
    struct hash_tfm hash;
    struct compress_tfm compress;
    struct rng_tfm rng;
    } crt_u;

    保存算法能够正常使用的最基本参数和函数接口

  • void *__crt_ctx[];

    保存加密算法注册的结构体的相关内容

    常用来保存加密算法密钥的相关信息

算法组合流程

仅涉及密钥加解密过程时,不需要算法的组合

crypto_xxxx_alloc
|                          run kthread(cryptomgr_probe)
+---->crypto_get_attr_alg-------------------------------> cryptomgr_probe[get crypto_alg]
|
+---->crypto_alloc_instance----> crypto_init_spawn[combine crypto_instance and crypto_alg]
函数中数据结构的传递
e.g  xxxx = shash
xxxxxx_desc
     |
     +--->crypto_xxxxx
              |
              +---->crypto_tfm
                        |
                        +---> xxxx_tfm
                        |
                        +---> crypto_alg
                                  |
                                  +----> xxxx_alg

Ecryptfs中的使用

加密算法
确定算法

使用crypto_alloc_hash函数设置使用的算法

crypto_alloc_hash(ECRYPTFS_DEFAULT_HASH, 0, CRYPTO_ALG_ASYNC);
/* ECRYPTFS_DEFAULT_HASH 该字段设置算法 */
模块注册

init update final详细流程

以MD5为例介绍内核加密模块在内核中的注册过程

/* crypto/md5.c */
static struct shash_alg alg = {
    .digestsize =   MD5_DIGEST_SIZE,
    .init       =   md5_init,
    .update     =   md5_update,
    .final      =   md5_final,
    .export     =   md5_export,
    .import     =   md5_import,
    .descsize   =   sizeof(struct md5_state),
    .statesize  =   sizeof(struct md5_state),
    .base       =   {
        .cra_name   =   "md5",
        .cra_flags  =   CRYPTO_ALG_TYPE_SHASH,
        .cra_blocksize  =   MD5_HMAC_BLOCK_SIZE,
        .cra_module =   THIS_MODULE,
    }
};

首先由算法本身实现shash_alg结构体的初始化,通过md5_mod_init函数调用crypto_register_shash函数将shash_alg传递到crypto_alg结构体中

通过__crypto_register_alg函数将当前crypto_alg结构体添加到crypto_alg_list链表当中

至此加密算法在内核中已成功注册

相关结构体
  • 函数调用关系

crypto_alloc_hash函数将crypto_alg与shash_alg连接起来
这里写图片描述

static struct crypto_alg *__crypto_alg_lookup(const char *name, u32 type,
                          u32 mask)
{
    struct crypto_alg *q, *alg = NULL;
    int best = -2;
    /* 遍历crypto_alg_list链表 查找符合条件的q并返回 */
    list_for_each_entry(q, &crypto_alg_list, cra_list) {
        int exact, fuzzy;

        if (crypto_is_moribund(q))
            continue;

        if ((q->cra_flags ^ type) & mask)
            continue;

        if (crypto_is_larval(q) &&
            !crypto_is_test_larval((struct crypto_larval *)q) &&
            ((struct crypto_larval *)q)->mask != mask)
            continue;

        exact = !strcmp(q->cra_driver_name, name);
        fuzzy = !strcmp(q->cra_name, name);
        if (!exact && !(fuzzy && q->cra_priority > best))
            continue;

        if (unlikely(!crypto_mod_get(q)))
            continue;

        best = q->cra_priority;
        if (alg)
            crypto_mod_put(alg);
        alg = q;

        if (exact)
            break;
    }

    return alg;
}
static int crypto_init_ops(struct crypto_tfm *tfm, u32 type, u32 mask)
{
    const struct crypto_type *type_obj = tfm->__crt_alg->cra_type;

    if (type_obj)
        return type_obj->init(tfm, type, mask);/* 此步骤调用shash_compat_init函数 */

    switch (crypto_tfm_alg_type(tfm)) {
    case CRYPTO_ALG_TYPE_CIPHER:
        return crypto_init_cipher_ops(tfm);

    case CRYPTO_ALG_TYPE_COMPRESS:
        return crypto_init_compress_ops(tfm);

    default:
        break;
    }

    BUG();
    return -EINVAL;
}
  • 结构体传递
    这里写图片描述

至此找到MD5所对应的shash_alg结构体

加密方式
确定算法

通过ecryptfs_crypto_api_algify_cipher_name函数设置加密方式

ecryptfs_crypto_api_algify_cipher_name(&full_alg_name, crypt_stat->cipher, "cbc");
/* crypt_stat->cipher为加密算法 cbc为加密模式 */
模块注册

以cbc(aes)为例介绍在内核模块中的注册流程

static struct crypto_template crypto_cbc_tmpl = {
    .name = "cbc",
    .alloc = crypto_cbc_alloc,
    .free = crypto_cbc_free,
    .module = THIS_MODULE,
};

首先在结构体中初始化相关字段保存在crypto_template结构体中,通过crypto_cbc_module_init函数调用crypto_register_template函数将crypto_template结构体插入crypto_template_list链表中以完成注册

相关结构体
  • 函数调用关系
    这里写图片描述

将crypto_alg与blkcipher_alg对应起来

  • ecb

    在ecryptfs_process_key_cipher函数中初始化为ecb模式

生物信息学名词解释 | K-mer (长度为k的短序列) K-mer 何谓K-mer 所谓Kmer,即为一段长度为k的DNA片段,是由测序reads剪切一部分得到的。k为一个奇数,k=几,就为几mer。 比如:我的测序reads长度为100bp,我将这100bp打断成17bp的短片段,打断后的17bp段片段就叫17mer,可以获得(100-17+1)条k-mer序列。 Table1 k-mers for GTAGAGCTGT. k k-mers 1 G,T,A,G,A,G,C,T,G,T 3 GTA,TAG,AGA,GAG,AGC,GCT,CT 阅读详情

相关推荐

docker部署zabbix6.2.7+grafana

docker部署zabbix6.2.7+grafana。

qq_48391148的博客 3656

Linux内核加解密框架介绍

加密框架是Linux内核加密API的核心组成部分,它为内核中的加密操作提供了通用的接口和管理机制。通过使用这些加解密API,应用程序可以通过调用相应的系统调用,直接在内核中进行加解密操作。加密API还提供了范围和散列函数的接口,用于处理分散的数据和计算散列值。使用此API可以获得一个用于RSA公钥加密和解密操作的公钥对象,以便进行加密和解密操作。使用此API可以获得一个用于RSA私钥加密和解密操作的私钥对象,以便进行加密和解密操作。使用此API可以将加密的数据使用RSA私钥进行解密。

李老板的移动安全杂货铺 3444

保姆级教程:用U盘给浪潮服务器装系统(含RAID驱动加载技巧)

本文提供了一份详细的浪潮服务器U盘安装系统指南,重点介绍了RAID驱动加载技巧与实战步骤。从准备工作到系统安装全流程,涵盖RAID配置、驱动加载方法及常见问题排查,帮助用户高效完成服务器系统部署。特别强调RAID驱动与服务器型号的匹配性,确保安装过程顺利。

uuu88的博客 738

【转】Linux内核安全技术(二)——磁盘加密技术概述和eCryptfs详解

加密是最常见的数据安全保护技术,在数据生命周期各阶段均有应用。从应用场景和技术实现上,按加密对象、用户是否感知、加密算法等维度,有多种分类及对应方案,并在主流操作系统如Windows、Linux、Android中有广泛应用。本文是Linux内核安全技术系列第二篇,主要介绍磁盘加密技术及主流实现方案。首先介绍磁盘加密技术背景,包括应用场景、威胁模型、技术路线分类等;其次介绍磁盘加密的两种实现方案,即全盘加密FDE和文件系统加密FBE,重点介绍Linux系统和内核主流FBE实现方案;

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1659

S32K3的STCU2模块详解:从硬件FSM到MCAL配置,搞懂BIST在线测试全流程

本文深入解析S32K3系列MCU的STCU2模块,从硬件FSM架构到MCAL配置,详细讲解BIST在线测试全流程。通过分区的安全策略和实战代码示例,帮助开发者掌握汽车电子系统中的功能安全实现,提升系统可靠性和安全性。

weixin_42525328的博客 447

【干货攻略】Oracle报错篇 ORA-01378 磁盘扇区大小不兼容问题

本期将为大家分享“ORA-01378 磁盘扇区大小不兼容”报错的问题解决方案。

PWY13148的专栏 1439

一文聊聊Linux Kernel的加密子系统【Crypto Subsystem】

Linux密码学算法可分成两层此篇文章介绍Linux Kernel space密码学算法实作流程为主,并没有涵盖user space中纯应用程序的操作,但不会细谈各个加解密算法,因为网络已有太多精彩的内容了。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 3469

EtherCAT应用层协议选型指南:CoE、SoE、EoE、FoE、AoE到底怎么选?看完这篇就懂了

本文深入解析EtherCAT应用层协议(CoE、SoE、EoE、FoE、AoE)的选型策略,从实时性、数据吞吐量和功能完整性三大核心指标出发,提供工业场景下的实战决策框架。通过技术特性对比、混合协议架构设计和常见故障规避指南,帮助工程师优化自动化设备通信性能。

weixin_28718793的博客 495

Linux加密框架crypto crypto_alg|cipher_alg数据结构|AES例子

加密框架将算法的属性抽象为算法说明数据结构struct crypto_alg,加密框架中的每一个算法(基础算法和衍生算法)都表示为一个算法说明数据结构的实例,因此将struct crypto_alg称为通用算法说明数据结构。 后续章节中如无特殊说明,算法说明数据结构和通用算法数据结构均指的是struct crypto_alg。 crypto.h - include/linux/crypto.h - Linux source code (v5.15.11) - Bootlin /** * struct

CHYabc123456hh的博客 1438

夏令营纪实——东南大学计科院&PALM实验室面试全解析

本文详细解析了东南大学计科院与PALM实验室夏令营的面试全流程,包括前期准备、技术考察、项目经验深挖等关键环节。特别针对自然语言处理(NLP)和机器学习(ML)领域的高频问题提供应对策略,帮助申请者提升面试表现。文章还分享了实用的准备技巧和面试经验,为有意向参加该夏令营的学生提供宝贵参考。

convnet3designer的博客 459

跨模态行人重识别实战:Python复现SYSU-MM01官方评估协议

本文详细介绍了如何用Python复现SYSU-MM01数据集的官方评估协议,以解决原Matlab代码在Python生态中不便使用的问题。文章深入解析了数据集的`indoor`与`all`两种评估模式,并提供了完整的Python代码实现,包括特征加载、相似度计算、Rank-k与mAP指标计算等核心步骤,确保评估结果与官方Matlab版本完全一致,助力跨模态行人重识别研究。

weixin_29081163的博客 99

linux c账户安全性,Linux网络子系统安全性模块代码详细分析之文件esp4.c

原标题:Linux网络子系统安全性模块代码详细分析之文件esp4.c2.4.6 文件六esp4.c2.4.6.1文件描述该文件的路径是linux-3.5.4/net/ipv4/esp4.c。该文件为IPsec模块中ESP协议的相关实现,主要包括输入和发送两种IPsec处理。2.4.6.2主要变量及宏定义static const struct net_protocol esp4_protocol =...

weixin_42475103的博客 293

从养虾到退坑:OpenClaw 卸载不留残留,一步到位

文章摘要: 本文提供OpenClaw软件的完整卸载指南,适用于Windows、macOS和Linux系统。内容包含卸载前的数据备份步骤(配置文件、日志、插件列表),以及详细的卸载脚本。Windows版通过批处理文件删除程序文件、注册表项和环境变量;macOS/Linux版则提供shell脚本,涵盖服务停止、软件包卸载、配置清理等步骤。特别强调要删除所有用户数据(包括多用户环境),确保系统无残留。文末建议重启计算机以使更改生效,实现"一步到位"的彻底卸载。

一键难忘的博客 300

HarmonyOS Next的安全架构与防护机制:从内核到应用的多层次保护

🏆本文收录于「滚雪球学HarmonyOS Next」专栏,手把手带你零基础入门HarmonyOS Next,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 2843

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux内核异步加密接口,Linux内核加密接口分析

一、概述Linux内核从2.5版本开始引入了强力的加密机制,主要原因有:删除冗余代码、支持IPSec协议以及通用的加密功能等。将来的应用会包括:硬件加密设备驱动、内核代码签名、硬件随机数生成器、文件系统加密等。二、如何使用加密API1、安装从2.6.6版本之后,内核源码就提供了丰富的密码学算法支持,需要配置编译选项将加密算法作为模块编入内核。如图所示,menuconfig的时候配置这部分选项 重...

weixin_42489252的博客 288

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

linux内核如何设置密码,Linux内核加密接口分析

一、概述Linux内核从2.5版本开始引入了强力的加密机制,主要原因有:删除冗余代码、支持IPSec协议以及通用的加密功能等。将来的应用会包括:硬件加密设备驱动、内核代码签名、硬件随机数生成器、文件系统加密等。二、如何使用加密API1、安装从2.6.6版本之后,内核源码就提供了丰富的密码学算法支持,需要配置编译选项将加密算法作为模块编入内核。如图所示,menuconfig的时候配置这部分选项重新安...

weixin_30433439的博客 581

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Linux输入密码接口,Linux内核加密接口分析

一、概述Linux内核从2.5版本开始引入了强力的加密机制,主要原因有:删除冗余代码、支持IPSec协议以及通用的加密功能等。将来的应用会包括:硬件加密设备驱动、内核代码签名、硬件随机数生成器、文件系统加密等。二、如何使用加密API1、安装从2.6.6版本之后,内核源码就提供了丰富的密码学算法支持,需要配置编译选项将加密算法作为模块编入内核。如图所示,menuconfig的时候配置这部分选项重新安...

weixin_35636570的博客 375

linux内核加解密接口,Linux中的加解密实现

每种操作系统的发展,都缺少不了安全的相伴。linux安全主要包括了系统安全、数据/资源安全、通信安全和应用安全。linux里面常用到的安全技术包括PAM(Pluggable Authentication Modules)机制、Linux能力机制、入侵检测机制、加密文件机制、安全审计、基于ACL的自主访问控制、强制访问控制、防火墙、杀毒软件、网络安全、DRM(Digital Rigths Manag...

weixin_30181187的博客 984

Linux内核安全技术——磁盘加密技术概述和eCryptfs详解

一、概述加密是最常见的数据安全保护技术,在数据生命周期各阶段均有应用。从应用场景和技术实现上,按加密对象、用户是否感知、加密算法等维度,有多种分类及对应方案,并在主流操作系统如Windows、Linux、Android中有广泛应用。本文是Linux内核安全技术系列第二篇,主要介绍磁盘加密技术及主流实现方案。首先介绍磁盘加密技术背景,包括应用场景、威胁模型、技术路线分类等;其次介绍磁盘加密的两种实现...

内核工匠 2757

HarmonyOS Next的安全性与隐私保护机制:从内核到应用的全方位保护!

🏆本文收录于「滚雪球学HarmonyOS Next」专栏,手把手带你零基础入门HarmonyOS Next,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 2563

关于采用消息钩子机制的透明加密的简单破解

透明加密的原理   在各大制造业企业中,技术文件的保密工作非常受重视。   传统的文件加密解密方案是通过出入密码的方式实现的,但对于每天都有大量文件要处理的企业来说,反复输入密码是非常不方便的,也不能防范员工将解密后的文件泄露出去。   而采用消息钩子机制的透明加密方式很好地解决了这个问题。文件在磁盘上以密文方式存储,打开时首先被加密软件客户端注入的钩子(hook)截获,解密成明文后再提交给相应...

liuweilhy的博客 2250

Linux内核学习笔记——Crypto基础框架

本篇文章主要分析关于kernel crypto算法框架,以及结合它在文件系统加密这一场景中的应用,分析内部的实现细节,以便读者对Linux crypto框架有相关的认识,并能基于它做开发。本篇文章的所有代码都是围绕Linux-5.10源码进行阅读。为方便理解,我们约定一些术语:数据转换(transformation/TFM):不管是对数据做加/解密,还是做hash,都定义成是对数据所做的转换操作。...

ZP1015 4971

Kernel Crypto框架

随着数字时代的发展,每天都有海量的数据产生,并且用户也越来越重视个人隐私数据的安全,从某种意义上讲,用户个人数据的价值正逐步高于设备本身。实现数据安全保护的基础是【密钥 + 加密算法】;...

内核工匠 7279

给电视直播应用加把“原生锁“:my-tv 加密保护机制一次讲透

晚上十点,你刚把电视切到想看的球赛,家人路过随手一按,画面跳到少儿频道;更糟的是,你攒了半个月的观看偏好、换台顺序,转头被别人改得面目全非。手机时代我们习惯了指纹、密码,可电视遥控器上可没有"指纹锁"这一键——这也是为什么"TV 应用密码锁"一直是智能电视用户的隐性刚需。 而开源电视直播软件 **my-tv**(安装即可用的 TV 直播应用)并没有把这个需求停留在概念里:它用原生 C 加密库给应

gitblog_00442的博客 31

18 华夏之光永存:华为破局(架构师级)- 鸿蒙应用沙箱突破风险与内核级防护机制

本文聚焦鸿蒙应用沙箱安全场景,梳理**应用沙箱常见突破风险类型**,深度拆解鸿蒙**内核级沙箱隔离、权限管控、行为监控、异常消解**四大核心防护机制,揭秘其从底层阻断恶意突破、保障应用与系统数据安全的底层逻辑,全文精简硬核、逻辑严谨,关键参数已隐藏,合规解析鸿蒙应用安全底层架构。

chuangshitianzun的博客 255
上一篇: 【系统定制】创建自己的安装包组
code__L
博客等级 码龄10年 3粉丝 8原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值