Linux内核密码模块

目录

密码算法介绍

Hash摘要算法

Cipher加解密算法

块密码算法

认证算法 MAC和HMAC

AEAD算法

Linux内核密码模块的基本构件

Linux内核密码模块介绍

如何使用Linux密码模块

用户层调用Linux内核密码模块的方法

cryptodev

AF_ALG

如何开发一个密码引擎驱动

开发一个密码引擎驱动的流程

以cbc(aes)算法为例的实际代码示例


密码算法介绍

密码算法主要是为了保护双方或者多方的通信,涉及到保密性、完整性和可认证性

Hash摘要算法

Hash或Digest是属于完整性,根据指定输入得到“唯一”校验值,比如SHA1,MD5,等等。

针对HASH算法的三个标准:

1、尽可能少的碰撞出相同的摘要值

2、不可能根据摘要值重新生成原数据

3、一个小的修改就能生成完成不同的摘要值

Cipher加解密算法

要求使用一组或者几组数据来加密/解密数据

Cipher算法可以分为流密码算法和块密码算法,还可以分为对称密码算法和非对称密码算法。

其中流密码算法是对一串流数据加密,块密码算法需要限定数据大小的数据块;

其中对称密码算法是指加解密都使用相同的密钥,非对称密码算法加密使用公钥,解密使用私钥。有AES,RSA算法等

块密码算法

块密码算法只能对一小块数据进行加解密,我们需要找个方法来处理任意长度的数据,大部分的块密码算法都要求有Initialization Vector(IV)来混淆加密数据。此算法模式有ECB,CBC等。

认证算法 MAC和HMAC

MAC代表消息认证码,用来认证发送者消息的机制,使用一组密钥和转化算法来生成认证码,使用HASH算法就叫HMAC。

AEAD算法

AEAD算法表示对数据进行认证加密,把认证,加密和摘要一步完成。

Linux内核密码模块的基本构件

Linux内核密码模块介绍

Linux密码模块的基本构件主要为两个结构体:struct crypto_alg和struct crypto_tfm。支持所有的算法,比如Cipher(加解密)、Hash(摘要)、AEAD(链式)、HMAC(认证)和Compression(解压缩)。

密码算法可以用一个基本算法构建的模块来表示,比如hmac(sha1)表示用SHA1摘要实现的HMAC算法,cbc(aes)表示使用AES的CBC模式,authenc(hmac(sha1),cbc(aes))表示使用AES-CBC加解密和SHA1做认证的链式算法,即一次完成加密和认证。

如何使用Linux密码模块

使用Linux密码模块的流程如下图所示:

左侧为流程分割,右侧为对应的实现函数。

用户层调用Linux内核密码模块的方法

用户层调用Linux内核密码模块的方法有两种,一种是cryptodev,另一种是AF_ALG。

cryptodev

  • 据说性能超过AF_ALG
  • 使用内核密码模块内标准接口
  • 将设备暴露在/dev/crypto目录下
  • 使用ioctl函数设置密码运算上下文
  • 在OpenSSL里原生支持

AF_ALG

  • 在Linux 2.6.38版本后支持
  • 主要通过netlink套接字实现

如何开发一个密码引擎驱动

开发一个密码引擎驱动的流程

1、Linux内核密码模块并不区分硬件引擎与软件实现

2、开发一个密码引擎就只是通过向密码模块子系统注册crypto_alg

3、辨别你想新增算法的类型并与相关的crypto_alg接口绑定,比如skcipher_alg,ahash_alg等等

4、实现xxx_alg接口内容并调用crypto_register_xxx()来向密码子系统注册

以cbc(aes)算法为例的实际代码示例

struct skcipher_alg xxx_cbc_aes_alg = {
    ...
    .base = {
        /* Name used by the framework to find who is implementing what. */
        .cra_name = "cbc(aes)",
        /* Driver name. Can be used to request a specific implementation of an algorithm. */
        .cra_driver_name = "xxx-cbc-aes",
        /* Priority is used when implementation auto-selection takes place:
         * if there are several implementers, the one with the highest priority is chosen.
         * By convention: HW engine > ASM/arch-optimized > plain C
         */
        .cra_priority = 300,
        /* CRYPTO_ALG_TYPE_XX: describes the type algorithm implemented here
         * CRYPTO_ALG_ASYNC: the engine is operating in an asynchronous manner
         * CRYPTO_ALG_KERN_DRIVER_ONLY: engine is not directly accessible to userspace
         */
        .cra_flags = CRYPTO_ALG_TYPE_SKCIPHER | CRYPTO_ALG_KERN_DRIVER_ONLY | CRYPTO_ALG_ASYNC,
        /* Size of the data blocks this algo operates on. */
        .cra_blocksize = AES_BLOCK_SIZE,
        /* Size of the context attached to an algorithm instance. */
        .cra_ctxsize = sizeof(struct xxx_aes_ctx),
        /* constructor/destructor methods called every time an alg instance is created/destroyed. */
        .cra_init = xxx_skcipher_cra_init,
        .cra_exit = xxx_skcipher_cra_exit,
    },
};

struct skcipher_alg mv_cesa_cbc_aes_alg = {
    /* Set key implementation. */
    .setkey = xxx_aes_setkey,
    /* Encrypt/decrypt implementation. */
    .encrypt = xxx_cbc_aes_encrypt,
    .decrypt = xxx_cbc_aes_decrypt,
    /* Symmetric key size. */
    .min_keysize = AES_MIN_KEY_SIZE,
    .max_keysize = AES_MAX_KEY_SIZE,
    /* IV size */
    .ivsize = AES_BLOCK_SIZE,
    .base = {
        ....
    },
};

static int xxx_encrypt(struct skcipher_request *req)
{
    struct my_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
    /* Prepare and queue the request here. Return 0 if the request has
     * been executed, -EINPROGRESS if it's been queued, -EBUSY if it's
     * been backlogged or a different error code for other kind of
     * errors.
     */
    return ret;
}

static int xxx_decrypt(struct skcipher_request *req)
{
    struct my_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
    /* Similar to xxx_encrypt() except this time we prepare and queue
     * a decrypt operation.
     */
    return ret;
}

static int xxx_setkey(struct crypto_skcipher *cipher, const u8 *key,
unsigned int len)
{
    struct my_ctx *ctx = crypto_tfm_ctx(req->base.tfm);
    /* Expand key and assing store the result in the ctx. */
    return ret;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
无,可以下载,项目五、linux系统进程间通信方式分析 设计要求: ① 分析linux系统下几种主要的进程通信手段。 ② 共享存储器的方式 ③ 共享文件的通信方式 ④ 消息传递的通信方式 ⑤ ②针对每个通信手段关键技术环节给出详细实例。 ③分析某些通信手段的内部实现机制 项目六、linux网络服务器的配置与管理 设计要求: ①架设samba服务器或ftp服务器。 ②掌握NFS服务器和客户端的安装与配置。 项目七、linux shell程序设计 设计要求: 1.熟练掌握shell的使用,会编写简单的shell程序。 2.Linux环境下利用 shell设计和实现机房的辅助管理系统 3.利用Linux shell进行程序脚本设计,实现两大功能:编辑生成上机课表并自动生成上机用户,进行用户课前和课后管理。 4.主要技术关键的分析 (1) 定义起始登陆界面 ①能显示三种信息:能根据登录用户显示欢迎对象、根据系统时间显示欢迎内容个性化的欢迎信息;有系统初始化、系统管理和退出三个菜单项操作提示菜单; ②能显示当前上课的具体时间(教学第几周、星期几第几节)和系统状态提示信息。 (2)系统初始化 ①生成本机房的上机安排表:上机安排表至少包含十条记录,每条记录应有课程 、班级、起至周、上课节等内容,能对安排表进行显示、添加、删除、修改,复制。 ②生成本机房的上机用户:根据上机安排表自动生成对应的上机用户,一个用户对应于安排表的一条记录,且账号= 班级+课程;密码=班级+课程号 (3)课前准备 ①为用户创建一个工作环境:工作空间和用户资料。 ②校正系统时间;在用户目录下创建工作目录,挂载U盘;查找所需文件;拷贝所需文件;若有压缩包则需打开压缩包;设置文件和目录属性,开放使用权限。 (4)课后整理: ①释放用户空间,进行资料收集。 ②更改文件和目录属性,关闭使用权限,对发生改变和新生成文档要进行打包压缩;移动包到U盘,卸载U盘,删除在用户目录下创建工作目录。 项目六、linux模块加载或内核编译 设计要求:
第一部分 基础知识 <br>1.1 什么是LKMs <br>1.2 什么是系统调用 <br>1.3 什么是内核符号表(Kernel-Symbol-Table) <br>1.4 如何实现从用户空间到内核空间的转换 <br>1.5 使用用户空间函数的方法 <br>1.6 常用内核空间函数列表 <br>1.7 什么是内核守护进程 <br>1.8 创建你自己的设备 <br><br>第二部分 渐入佳境 <br>2.1 如何截获系统调用 <br>2.2 一些有趣的系统调用 <br>2.2.1 发现有趣的系统调用(strace方法) <br>2.3 迷惑内核的系统表 <br>2.4 和文件系统有关的攻击 <br>2.4.1 如何隐藏文件 <br>2.4.2 如何隐藏文件的内容(完全的) <br>2.4.3 如何隐藏文件的某一部分(一个实现原型) <br>2.4.4 如何重新定向或者监视文件操作 <br>2.4.5 如何避免任何文件权限问题 <br>2.4.6 如何使的一个有入侵工具的目录不可存取 <br>2.4.7 如何改变CHROOT环境 <br>2.5 和进程有关的入侵 <br>2.5.1 如何隐藏任何进程 <br>2.5.2 如果改变文件的执行结果 <br>2.6 和网络(Socket)有关的入侵 <br>2.6.1 如果控制Socket操作 <br>2.7 TTY纪录的方法 <br>2.8 用LKMs写病毒 <br>2.8.1 如何让LKM病毒感染任何文件(不仅仅是模块) <br>2.8.2 如何让LKM病毒帮助我们进入系统 <br>2.9 使我们的LKM不可见,而且不可卸载 <br>2.10 其他的入侵kerneld进程的方法 <br>2.11 如何检查当前的我们的LKM <br><br>第三部分 解决方案(给系统管理员) <br>3.1 LKM检测的理论和想法 <br>3.1.1 一个使用的检测器的原形 <br>3.1.2 一个密码保护的create_module(...)的例子 <br>3.2 防止LKM传染者的方法 <br>3.3 使你的程序不可以被跟踪(理论) <br>3.3.1 一个反跟踪的实用例子 <br>3.4 使用LKMs来防护你的linux内核 <br>3.4.1 为什么我们必须允许任何一个程序都拥有可执行的权限 <br>3.4.2 链接的补丁 <br>3.4.3 /proc权限的补丁 <br>3.4.4 安全级别的补丁 <br>3.4.5 底层磁盘补丁 <br><br>第四部分 一些更好的想法(给hacker的) <br>4.1 击败系统管理员的LKM的方法 <br>4.2 修补整个内核-或者创建Hacker-OS <br>4.2.1 如何在/dev/kmem中找到内核符号表 <br>4.2.2 新的不需要内核支持的'insmod' <br>4.3 最后的话 <br><br>第五部分 最近的一些东西:2.2.x版本的内核 <br>5.1 对于LKM作者来说,一些主要的不同点 <br><br>第六部分 最后的话 <br>6.1 LKM传奇以及如何使得一个系统即好用又安全 <br>6.2 一些资源链接

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值