19个不稳定版本 (4个重大变更)

0.6.8 2024年7月31日
0.6.2 2024年5月23日
0.5.0 2024年3月5日
0.2.2 2023年12月5日
0.2.1 2023年10月13日

加密学 中排名第159

Download history 123/week @ 2024-05-13 363/week @ 2024-05-20 3/week @ 2024-05-27 156/week @ 2024-06-03 332/week @ 2024-06-10 208/week @ 2024-06-17 141/week @ 2024-06-24 7/week @ 2024-07-01 142/week @ 2024-07-29 1/week @ 2024-08-05 7/week @ 2024-08-12

每月下载量 150
2 crates 中使用

MIT 许可协议

215KB
3.5K SLoC

nuts-container: 一个安全的存储库。

简介

nuts 库实现了一个安全的存储库,数据存储在容器中。容器被划分为加密块。因此,nuts 容器看起来像一个块设备。所有打开它所需的东西(例如密钥)都存储在容器中。该库具有丰富的API,因此可以轻松集成到您的应用程序中。

容器不管理加密数据本身。它被传输到后端,后端仅负责块的持久存储。这样,数据可以轻松存储在不同的媒体上或以不同的格式。密钥保留在容器中,无需存储在后端。

功能

支持以下加密算法:

  • AES128-GCM
  • AES128-CTR
  • 无(实际上禁用了加密)

用于加密块的密钥(以及进一步的信息)与基于用户提供的密码生成的PBKDF2派生的包装密钥加密。

您有一个自包含的容器,这意味着所有打开容器所需的信息都存储在第一个块中。一些基本信息(如使用的加密算法和包装密钥算法)以未加密的形式存储,但大多数信息也加密在标题中。

示例

// Create a new container

use nuts_container::container::*;
use nuts_container::memory::MemoryBackend;

// Create a container with a memory backend.
// This backend stores the encrypted blocks in memory.
let backend = MemoryBackend::new();

// Let's create an encrypted container (with aes128-ctr).
// Because you are encrypting the container, you need to assign a
// password callback.
let kdf = Kdf::pbkdf2(Digest::Sha1, 65536, b"123");
let options = CreateOptionsBuilder::new(Cipher::Aes128Ctr)
    .with_password_callback(|| Ok(b"abc".to_vec()))
    .with_kdf(kdf.clone())
    .build::<MemoryBackend>()
    .unwrap();

// Create the container and fetch information.
// Here you can directly pass the backend instance to the create() method
// because MemoryBackend implements the Backend::CreateOptions trait.
let container = Container::<MemoryBackend>::create(backend, options).unwrap();
let info = container.info().unwrap();

assert_eq!(info.cipher, Cipher::Aes128Ctr);
assert_eq!(info.kdf, kdf);
// Open an existing container

use nuts_container::container::*;
use nuts_container::memory::MemoryBackend;

let (backend, kdf) = {
    // In this example you create a container in a separate block.
    // So, the created container is closed again when leaving the scope
    // but the memory-backend still has stored its data.
    let backend = MemoryBackend::new();
    let kdf = Kdf::pbkdf2(Digest::Sha1, 65536, b"123");
    let options = CreateOptionsBuilder::new(Cipher::Aes128Ctr)
        .with_password_callback(|| Ok(b"abc".to_vec()))
        .with_kdf(kdf.clone())
        .build::<MemoryBackend>()
        .unwrap();

    // Create the container.
    let container = Container::<MemoryBackend>::create(backend, options).unwrap();
    let backend = container.into_backend();

    (backend, kdf)
};

// Open the container and fetch information.
// Here you can directly pass the backend instance to the open() method
// because MemoryBackend implements the Backend::OpenOptions trait.
let options = OpenOptionsBuilder::new()
    .with_password_callback(|| Ok(b"abc".to_vec()))
    .build::<MemoryBackend>()
    .unwrap();
let container = Container::<MemoryBackend>::open(backend, options).unwrap();
let info = container.info().unwrap();

assert_eq!(info.cipher, Cipher::Aes128Ctr);
assert_eq!(info.kdf, kdf);
  • nuts-directory 一个后端示例实现,其中所有数据都存储在目录层次结构中。
  • nuts-archive 基于 nuts-container 的应用程序,其中文件存储在类似于tar的存档中。
  • nuts-tool 一个命令行应用程序,用于维护 nuts-container 及其应用程序。

许可协议

您可以在此处查看完整的许可协议 这里

本项目受 MIT 许可协议的约束。

依赖关系

~1.8–6MB
~135K SLoC