序:续《KeePass:密码管理工具》

概述

KeePass Java 客户端 ( KeePassJava2 )

  • KeePassJava2 是一个用Java编写的API,用于操作KeePass密码数据库
  • KeePassJava2 是一个高度灵活且高效的Java库,专门设计用于与KeePass 2.x密码数据库交互。
  • 它全面支持阅读和写入KeePass文件版本34,并能读取版本1.x的数据库。
  • 该库精心构建,确保了在Java 8及更高版本,包括Java/Android环境中的广泛应用。
  • 通过不依赖特定的Java Cryptography Extension (JCE)策略文件,KeePassJava2保持轻量级且易于集成,实现了跨平台的兼容性。
  • 开放源码许可Apache 2.0)鼓励广泛的应用和定制。

Slogan : "Java API for KeePass Password Databases - Read/Write 2.x (File versions 3 and 4), Read 1.x"

  • KeePassJava2作为一个库,并不直接运行一个独立的应用程序,因此没有传统意义上的“启动文件”。

它的使用通常是嵌入到其他Java应用中

开发者会在其应用的主类中或特定的服务初始化部分,通过引入KeePassJava2的依赖和调用相关API来开启密码数据库的管理和访问功能。

比如,典型的启动逻辑可能出现在应用的入口点或者服务加载阶段,涉及创建KdbxCreds对象和加载数据库的操作。

KeePassJava2 的模块结构

KeePassJava2 与 KeePass 的项目渊源

  • KeePassJava2 项目的名称由 KeePass 的作者 Dominik Reichl 友情授权。与 KeePass 项目无正式联系。

  • KeePass 实际上是由 Dominik 编写的代码定义的,这些代码是他创建和维护该项目时编写的。

KeePass 的核心概念:Database(密码库) > Group([多层]分组) > Entry (密码条目)

  • 密码数据库(Database)被建模为三层抽象
  • 数据库(Database)是记录的集合,其物理表示形式只需能够呈现为流即可。
  • 条目(Entry)保存数据库中有价值的信息,而组允许将条目构建为集合(Collection),就像文件夹结构一样。
  • 数据库有一个根组(RootGroup),通过跟踪根组的子组(Sub Group)可以浏览数据库的树形结构。
  • 条目属于组(Group)。条目可以在组之间移动,组也可以在组之间移动。
  • 但是,在一个数据库中创建的条目和组不能在未转换的情况下移动到另一个数据库:
database.newEntry(entryToCopy);
database.newGroup(groupToCopy);

KeePass 文件版本(v1/v2/v3.1/v4.x)

  • 3.1 vs. 4

使用示范

  • JDK 版本

从release 2.2开始,它需要Java 1.8。早期版本需要Java 1.7。

Step0 使用 KeePass 终端创建密码库和密码条目

Step1 引入依赖

    <dependencies>
<!-- https://github.com/jorabin/KeePassJava2 -->
<dependency>
<groupId>org.linguafranca.pwdb</groupId>
<artifactId>KeePassJava2</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.linguafranca.pwdb</groupId>
<artifactId>test</artifactId>
<version>2.2.1</version>
</dependency>
</dependencies> <repositories>
<repository>
<id>oss.sonatype.org-snapshot</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>

Step2 读取密码库文件(File/Database)、分组(Group)、密码条目(Entry)

package com;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.linguafranca.pwdb.Credentials;
import org.linguafranca.pwdb.Database;
import org.linguafranca.pwdb.Entry;
import org.linguafranca.pwdb.Group;
import org.linguafranca.pwdb.kdb.KdbCredentials;
import org.linguafranca.pwdb.kdbx.KdbxCredentials;
import org.linguafranca.pwdb.kdbx.KdbxCreds;
import org.linguafranca.pwdb.kdbx.KdbxStreamFormat;
import org.linguafranca.pwdb.kdbx.dom.DomDatabaseWrapper;
//import org.linguafranca.pwdb.kdbx.jackson.JacksonDatabase;
import org.linguafranca.pwdb.kdbx.jaxb.JaxbDatabase;
import org.linguafranca.pwdb.kdbx.simple.SimpleDatabase;
import org.linguafranca.pwdb.kdbx.simple.model.KeePassFile;
import org.linguafranca.pwdb.security.CipherAlgorithm; import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.*; /**
* KeePass 数据读取
* @note
* KeePassJava2 项目的名称由 KeePass 的作者 Dominik Reichl 友情授权。与 KeePass 项目无正式联系。
* KeePass 实际上是由 Dominik 编写的代码定义的,这些代码是他创建和维护该项目时编写的。
* @reference-doc
* [1] https://github.com/jorabin/KeePassJava2
* [2] https://github.com/jorabin/KeePassJava2/blob/master/example/src/main/java/org/linguafranca/pwdb/kdbx/QuickStart.java
*/
@Slf4j
public class KeePassExample {
@SneakyThrows
public static void main(String[] args) {
String keepassFilePath = "D:\\Program-Data\\KeePass-Data\\xxxx-resource-accounts.kdbx";
byte [] passwordBytes = "123".getBytes(); //KdbxCreds credentials = new KdbxCreds("JNY#1638".getBytes());//[x]
KdbCredentials credentials = new KdbCredentials.Password( passwordBytes ); //InputStream inputStream = KeePassExample.class.getClass().getClassLoader().getResourceAsStream("test1.kdbx");
InputStream keepassFileInputStream = new FileInputStream( new File(keepassFilePath) ); /**
* 密码数据库被建模为三层抽象
* 数据库(Database)是记录的集合,其物理表示形式只需能够呈现为流即可。
* 条目(Entry)保存数据库中有价值的信息,而组允许将条目构建为集合(Collection),就像文件夹结构一样。
* 数据库有一个根组(RootGroup),通过跟踪根组的子组(Sub Group)可以浏览数据库的树形结构。
* 条目属于组(Group)。条目可以在组之间移动,组也可以在组之间移动。
* 但是,在一个数据库中创建的条目和组不能在未转换的情况下移动到另一个数据库:
* database.newEntry(entryToCopy);
* database.newGroup(groupToCopy);
*/
Database database = DomDatabaseWrapper.load(new KdbxCreds( passwordBytes ), keepassFileInputStream);
//不同的 Database 实现具有不同的特性,主要提现在速度上 | 例如 对于 JAXB 和 Simple 来说,加载时间是主要因素,而对于 DOM 实现来说,数据库遍历是主要因素
//Database database = SimpleDatabase.load(credentials, keepassFileInputStream);
//Database database = JaxbDatabase.load(credentials, keepassFileInputStream);
//Database database = DomDatabaseWrapper.load(credentials, keepassFileInputStream);
//Database database = JacksonDatabase.load(credentials, keepassFileInputStream); KdbxStreamFormat streamFormat = (KdbxStreamFormat) database.getStreamFormat();
int databaseVersion = streamFormat.getStreamConfiguration().getVersion();//4
CipherAlgorithm cipherAlgorithm = streamFormat.getStreamConfiguration().getCipherAlgorithm();//"AES" String databaseName = database.getName();
Group rootGroup = database.getRootGroup();
List<Group> generalGroupList = rootGroup.findGroups("General");//rootGroup.getGroups();
Group generalGroup = generalGroupList.get(0);
List<Group> groups = generalGroup.getGroups();
int groupsSize = groups.size();
log.info("GeneralGroup's groups size:{}", groupsSize);
if(groupsSize > 0){
groups.stream().forEach(group -> {
String groupName = group.getName();
List<Entry> entries = group.getEntries();// group.findEntries("mysql", true);
int entriesSize = group.getEntriesCount();
entries.stream().forEach(entry -> {
log.info("entry.path:{}", entry.toString() );///xxxx-resource-accounts-database/General/cn-dev/xxx-mysql
UUID uuid = entry.getUuid();
String path = entry.getPath();
String title = entry.getTitle();
String username = entry.getUsername();
String password = entry.getPassword();
String url = entry.getUrl();
String notes = entry.getNotes();
String cdcUserCustomField = entry.getProperty("CDC_USER");//自定义扩展字段
String cdcPasswordCustomField = entry.getProperty("CDC_PASSWORD");//自定义扩展字段
byte[] xxxCustomFileField = entry.getBinaryProperty("");
});
});
}
}
}

X 参考文献

  • github topic

https://mvnrepository.com/artifact/de.slackspace/openkeepass : 153 个 star(相比 KeePassJava2 项目的 254 个 star ,star数偏少),且项目更新慢

[密码管理/信息安全] KeePass Java 客户端 : KeePassJava2的更多相关文章

  1. (转)高强度密码管理软件KeePass使用详解

    转自:http://www.ruancan.com/ 算下来,你接触电脑有多久了?从第一次上网,到今天,你一共申请了多少个网站或者软件的帐号?相信这是一个几乎无人能够回答的问题. 无数人面临着这两个问 ...

  2. 个人信息管理PIM——密码管理工具软件

    密码管理工具 以KeePass为主,结合LastPass在线浏览器网页密码.有钱银可以考虑1Password. KeePass LastPass 1Password 价格费用 免费开源 普通版:免费 ...

  3. 用firefox 31配合KeePass密码管理器实现web帐号密码自动填写登录

    原文:http://bbs.kafan.cn/thread-1754676-1-1.html KeePass的优势:1.这是一款完全开源的密码管理器2.很多人都使用lastpass来保存密码,而这种严 ...

  4. Lastpass——密码管理工具

    Lastpass是一个优秀的在线密码管理器和页面过滤器,采用了强大的加密算法,自动登录/云同步/跨平台/支持多款浏览器. 我之前一直都在使用这个工具,不过都是在浏览器上以扩展的方式使用,在火狐浏览器上 ...

  5. 由Memcached升级到 Couchbase的 Java 客户端的过程记录(一)

    背景: 在项目启动的选用了Memcached 作为缓存服务器,采用了Xmemcached作为客户端.在项目中使用了Shiro,为了给 Shiro 配置缓存的时候,采用了开源代码   https://g ...

  6. Zookeeper的核心概念以及java客户端使用

    一.Zookeeper的核心概念 分布式配置中心(存储):disconf(zk).diamond(mysql+http) 1)znode ZooKeeper操作和维护的是一个个数据节点,称为 znod ...

  7. 从入门到精通(分布式文件系统架构)-FastDFS,FastDFS-Nginx整合,合并存储,存储缩略图,图片压缩,Java客户端

    导读 互联网环境中的文件如何存储? 不能存本地应用服务器 NFS(采用mount挂载) HDFS(适合大文件) FastDFS(强力推荐

  8. 大数据学习day31------spark11-------1. Redis的安装和启动,2 redis客户端 3.Redis的数据类型 4. kafka(安装和常用命令)5.kafka java客户端

    1. Redis Redis是目前一个非常优秀的key-value存储系统(内存的NoSQL数据库).和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list ...

  9. 使用密码记录工具keepass来保存密码

    在第一章,曾经给过您建议,密码不要保存在文档中,那样不安全,如果密码很多而且又很复杂,人的大脑是不可能很容易记住的,只能记录下来,如果不能记在文档中那记在哪里呢?下面介绍给您一款记录密码的软件,使用. ...

  10. java 客户端链接不上redis解决方案

    原文地址:http://blog.csdn.net/yingxiake/article/details/51472810 出现问题描述: 1.Could not get a resource from ...

随机推荐

  1. 华为云-容器引擎CCE-部署Nginx应用

    环境准备 注册华为云账号 复制下面地址到浏览器地址栏(https://reg.huaweicloud.com/registerui/cn/register.html?fromacct=c76cea9f ...

  2. .NET使用OllamaSharp实现大模型推理对话的简单演示

      前提条件:请确保你本地已经安装了ollama以及有关本地离线模型.或者已有远程模型环境等.如果没有,请自行部署.如果需要帮助,可以文末获取联系方式咨询.由于部署离线大模型过于简单,在线资料也很多, ...

  3. 宝塔linux 搭建

    前言 2020年的时候,用宝塔搭了个WordPress,一个人的博客不算是博客,没有社区氛围.就转到博客园了. 21年跟着教程,写了一个PHP的个人博客项目. 又有一台阿里云的服务器,就把代码部署上去 ...

  4. 去哪儿旅行携手 HarmonyOS SDK | 告别繁琐,常用信息秒级填充

    背景 去哪儿旅行作为行业内领先的一站式在线旅游平台,多年来在日益加剧的市场竞争中积极寻求创新,凭借其优质的服务深受消费者青睐.2024年,去哪儿旅行适配HarmonyOS NEXT版本, 升级用户服务 ...

  5. vue关于图片参数赋值

    解决方法: 加个require()就可以了 <img :src="require('../xxx/images/'+imgsrc+'.png')"/> export d ...

  6. ROS入门21讲(5)

    九.服务数据的定义与使用 1.服务模型 2.自定义服务数据 Person.srv string name uint8 sex uint8 age uint8 unknown = 0 uint8 mal ...

  7. github加速 DevSidecar 1.8.8

    DevSidecar 1.8.8 更多配置请参考:github开源

  8. 4-1 C++运算符基本概念

    目录 4.1.1 基本概念 函数观点 左值和右值 运算符重载 4.1.2 优先级.结合律与求值顺序 优先级和结合律 求值顺序 书中表述 实践表明(猜想) 实践验证 可能的解释:编译器的优化行为 一些运 ...

  9. rust 终端输出 debug 信息

    配置方法 将 env_logger log 添加到 Cargo.toml : 打开 Cargo.toml 文件并在 [dependencies] 部分下添加 env_logger log . [pac ...

  10. B+树原理详解

    B树 与 B+树 我们今天要介绍的是工作开发中最常接触到的 InnoDB 存储引擎中的 B+ 树索引.要介绍 B+ 树索引,就不得不提二叉查找树,平衡二叉树和 B 树这三种数据结构.B+ 树就是从他们 ...