# littlefs-ss **Repository Path**: seraph-hh/littlefs-ss ## Basic Information - **Project Name**: littlefs-ss - **Description**: 嵌入式系统经常需要文件系统来存储数据,littlefs是一个很好的选择,可是对于基于数据隐私的需求,我们需要将数据以安全的方式存储起来,防止别人轻易的读取到明文。 由于littlefs良好的接口设计,我们只需要稍微修改下它的provided就可以无缝切换至安全secure-storage。 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-04-19 - **Last Updated**: 2023-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # littlefs-ss #### 介绍 嵌入式系统经常需要文件系统来存储数据,littlefs是一个很好的选择,可是对于基于数据隐私的需求,我们需要将数据以安全的方式存储起来,防止别人轻易的读取到明文。 由于littlefs良好的接口设计,我们只需要稍微修改下它的provided就可以无缝切换至安全secure-storage。 #### 软件架构 软件架构说明 由于lfs已经将文件读写部分的接口剥离出来,因此,littlefs-ss组件只需要实现这个文件操作接口,就可以实现文件数据的加密存储。 - 应用层 - - filesystem - 组件层 - - littlefs-ss - - lfs - 驱动层 - - file_driver - - crypto_driver ## 总体设计 #### 数据的保密性 对称加密算法加密保护。 #### 数据的完整性 lfs自带的数据校验。 #### 防止数据的重放攻击 1. 对于不同的MCU,同样的数据加密结果如果一样,很容易猜测出原始数据,所有不同的MCU,我们需要不同的加密密钥,加密方法选用TDES128,AES128或者SM4算法; 2. 对于同一存储单元上的数据,在不同的区块加密的结果也不能相同,因此我们需要使用CBC的模式,使同一块上相同的数据得到不同的加密结果,IV值可以根据块号推倒得出; 3. 如果保护的方法和密钥生成方法被窃取,密文数据可以很轻易的被解密,因此密钥的生成方法必须满足:(1)每个设备一机一密;(2)密钥种子来源必须保存在设备的安全区域;因此我们选取设备唯一ID和一个随机数的作为种子源,将这两个数据保存在设备的BPU区域,受到攻击时候BPU丢失数据。密钥生成方法这里选用HMAC,根据银联密钥管理规定,hash算法需要SHA256或者SM3结果以上的。 挂载函数 ss_mount(ctx) 从bpu单元读取设备唯一标识uuid和设备唯一密钥huk bpu_read(uuid, huk) 将huk根据用途分散除安全存储密钥ssk ssk = hmac(huk + usage) 使用安全存储密钥ssk,根据设备唯一标识uuid分散除文件加密密钥 fek = hmac(ssk, uuid) 加载文件读取驱动 将驱动指针和fek存放在ctx中。 块读取函数 ss_read(ctx, block, block_len); output = drv_read(block, block_len) 对fek进行散列hash得到一个加密密钥,然后根据块号进行分散,得到iv; iv = encrypt_ecb(sha256(fek), block[4] + pad(00, 12)) 使用fek和iv对读取的数据解密,得到明文plain_data plain_data = decrypt_cbc(fek, iv, output) 块改写函数 ss_write(ctx, block, input, block_len); 对fek进行散列hash得到一个加密密钥,然后根据块号进行分散,得到iv; iv = encrypt_ecb(sha256(fek), block[4] + pad(00, 12)) 使用fek和iv对输入数据加密密,得到cipher_data cipher_data = encrypt_cbc(fek, iv, input) 将密文数据写入对应的块 drv_write(block, cipher_data, block_len) #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)