#keepass #kdbx #entry #group #node #key-file

bin+lib keepass-ng

KeePass .kdbx 数据库文件解析器,具有增强功能

5 个版本

新增 0.8.0 2024 年 8 月 23 日
0.0.4 2024 年 7 月 17 日
0.0.3 2024 年 7 月 5 日
0.0.2 2024 年 5 月 14 日
0.0.1 2024 年 4 月 29 日

#334数据库接口

每月 47 次下载
用于 passlane

MIT 许可证

375KB
7.5K SLoC

keepass-ng

Crates.io Documentation Build Status codecov dependency status License file

Rust KeePass 数据库文件解析器,用于 KDB、KDBX3 和 KDBX4,并支持实验性的 KDBX4 写入。

用法

打开数据库

use keepass_ng::{
    db::{node_is_group, Entry, Node, NodeIterator},
    error::DatabaseOpenError,
    Database, DatabaseKey,
};
use std::fs::File;

fn main() -> Result<(), DatabaseOpenError> {
    // Open KeePass database using a password (keyfile is also supported)
    let mut file = File::open("tests/resources/test_db_with_password.kdbx")?;
    let key = DatabaseKey::new().with_password("demopass");
    let db = Database::open(&mut file, key)?;

    // Iterate over all `Group`s and `Entry`s
    for node in NodeIterator::new(&db.root).into_iter() {
        if node_is_group(&node) {
            println!(
                "Saw group '{0}'",
                node.borrow().get_title().unwrap_or("(no title)")
            );
        } else if let Some(e) = node.borrow().as_any().downcast_ref::<Entry>() {
            let title = e.get_title().unwrap_or("(no title)");
            let user = e.get_username().unwrap_or("(no username)");
            let pass = e.get_password().unwrap_or("(no password)");
            println!("Entry '{0}': '{1}' : '{2}'", title, user, pass);
        }
    }

    Ok(())
}

保存 KDBX4 数据库(实验性)

重要: 内部 XML 数据结构将从该库的内部对象表示重新从头开始编写,因此任何未由库解析的字段将在输出文件中丢失!请在尝试此功能之前确保备份您的数据库。

您可以通过启用 save_kdbx4 功能来启用保存 KDBX4 数据库的实验性支持。

use keepass_ng::{
    db::{group_add_child, Database, Entry, Group, Node, Value},
    rc_refcell_node, DatabaseConfig, DatabaseKey, NodePtr,
};
use std::fs::File;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut db = Database::new(DatabaseConfig::default());

    db.meta.database_name = Some("Demo database".to_string());

    let entry = rc_refcell_node!(Entry::default());
    if let Some(entry) = entry.borrow_mut().as_any_mut().downcast_mut::<Entry>() {
        entry.set_title(Some("Demo entry"));
        entry.set_username(Some("jdoe"));
        entry.set_password(Some("hunter2"));
    }

    let group = rc_refcell_node!(Group::new("Demo group"));
    group_add_child(&group, entry, 0).unwrap();

    group_add_child(&db.root, group, 0).unwrap();

    #[cfg(feature = "save_kdbx4")]
    db.save(&mut File::create("demo.kdbx")?, DatabaseKey::new().with_password("demopass"))?;

    Ok(())
}

使用开发者工具

此 crate 包含多个命令行工具,可以使用 utilities 功能标志启用。请参阅 Cargo.toml 中的 [[bin]] 部分,以获取完整列表。

运行 kp-dump-xml 命令的示例命令行如下

cargo run --release --features "utilities" --bin kp-dump-xml -- path/to/database.kdbx

安装

将以下内容添加到您的 Cargo.tomldependencies 部分

[dependencies]
keepass-ng = "*" # TODO replace with current version

性能说明

请在编译时设置 RUSTFLAGS 环境变量以启用针对 CPU 的优化(这极大地影响了 AES 密钥派生的速度)

export RUSTFLAGS='-C target-cpu=native'

为了获得最佳结果,请还请在发布模式下编译。

或者,您可以在项目中添加一个 .cargo/config.toml,以确保始终设置 rustflags。

对于 AArch64 / ARMv8

aes 优化尚未在稳定 Rust 中启用。如果您想获得大幅性能提升,可以使用夜间构建并启用 aes crate 的 armv8 功能。

[dependencies.aes]
# Needs at least 0.7.5 for the feature
version = "0.7.5"
features = ["armv8"]

许可证

MIT

依赖项

~4–16MB
~159K SLoC