整体架构
eCryptfs整体架构如下图,主要是内核模块eCryptfs以及用户态进程ecryptfsd。ecryptfsd进程只在使用key type为openssl模式时需要,使用passphrase模式(如上述测试用例)时不需要。ecryptfs-utils可作为用户态辅助工具或C接口编程参考。
应用程序发起系统调用时先经过VFS,判断目录类型为eCryptfs时调用eCryptfs模块的注册函数。之后eCryptfs根据mountsession中保存的key signature参数从keyring中找到对应密钥(FEKEK),再调用crypto模块API完成文件加解密。
eCryptfs核心加解密机制如下图,主要特点归纳如下:
1、FEK(File Encryption Key)唯一,即每个文件的加密密钥均不同,是随文件创建时生成的一个随机数。
2、每个文件的FEK经过FEKEK(File Encryption Key Encryption Key)加密保护,加密后FEK称为EFEK(Encrypted File Encryption Key),并保存在eCryptfs加密文件的header信息中(如前述page 0区域)。
3、passphrase模式下,FEKEK是基于用户passphrase_passwd派生而来,派生方式是hash计算(参考代码分析章节)。
4、文件内容按照page大小(Data Extent)进行块加密。
核心过程可简单描述为:
1、新文件加密时,生成随机数FEK,对文件内容进行分块加密并存储。根据用户传递的key_sig参数从keyring找到对应的FEKEK,用FEKEK加密FEK,生成EFEK并保存在文件header中。
2、解密时,同样根绝key_sig找到FEKEK,用FEKEK解密EFEK后得到FEK,再用FEK解密文件内容。
全部0条评论
快来发表一下你的评论吧 !