[密码管理/信息安全] KeePass Java 客户端 : KeePassJava2
序:续《KeePass:密码管理工具》
概述
KeePass Java 客户端 ( KeePassJava2 )
KeePassJava2是一个用Java编写的API,用于操作KeePass密码数据库
- KeePassJava2 是一个高度灵活且高效的Java库,专门设计用于与KeePass
2.x密码数据库交互。- 它全面支持阅读和写入KeePass文件版本
3和4,并能读取版本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 参考文献
- [密码管理/信息安全] 密码管理工具:KeePass vs LastPass vs 1Password - 博客园/千千寰宇 【推荐】
- KeePass 【推荐】
- https://keepass.info/index.html
- https://keepass.info/translations.html (汉化包)
- https://github.com/jorabin/KeePassJava2
- https://github.com/jorabin/KeePassJava2/blob/KeePassJava2-2.2.1/example/src/main/java/org/linguafranca/pwdb/kdbx/QuickStart.java
- https://github.com/jorabin/KeePassJava2/blob/KeePassJava2-2.2.1/example/src/test/java/org/linguafranca/pwdb/kdbx/SimpleQuickStartTest.java
- github topic
- https://github.com/topics/keepass
- https://github.com/PhilippC/keepass2android : 4.9k star 2025.1.2
- https://github.com/jorabin/KeePassJava2 : 254 star 2025.1.2
- https://mvnrepository.com/artifact/de.slackspace/openkeepass : 153 个 star(相比 KeePassJava2 项目的 254 个 star ,star数偏少),且项目更新慢
- 探秘KeePassJava2:强大的跨平台密码管理器API - CSDN
- KeePassJava2: 强大的Java密码管理库 - CSDN
- KeePassJava2 使用指南 - CSDN
- 如何在Java中使用 KeePass数据库(kdbx) - blog.bfw.wiki
https://mvnrepository.com/artifact/de.slackspace/openkeepass : 153 个 star(相比 KeePassJava2 项目的 254 个 star ,star数偏少),且项目更新慢
[密码管理/信息安全] KeePass Java 客户端 : KeePassJava2的更多相关文章
- (转)高强度密码管理软件KeePass使用详解
转自:http://www.ruancan.com/ 算下来,你接触电脑有多久了?从第一次上网,到今天,你一共申请了多少个网站或者软件的帐号?相信这是一个几乎无人能够回答的问题. 无数人面临着这两个问 ...
- 个人信息管理PIM——密码管理工具软件
密码管理工具 以KeePass为主,结合LastPass在线浏览器网页密码.有钱银可以考虑1Password. KeePass LastPass 1Password 价格费用 免费开源 普通版:免费 ...
- 用firefox 31配合KeePass密码管理器实现web帐号密码自动填写登录
原文:http://bbs.kafan.cn/thread-1754676-1-1.html KeePass的优势:1.这是一款完全开源的密码管理器2.很多人都使用lastpass来保存密码,而这种严 ...
- Lastpass——密码管理工具
Lastpass是一个优秀的在线密码管理器和页面过滤器,采用了强大的加密算法,自动登录/云同步/跨平台/支持多款浏览器. 我之前一直都在使用这个工具,不过都是在浏览器上以扩展的方式使用,在火狐浏览器上 ...
- 由Memcached升级到 Couchbase的 Java 客户端的过程记录(一)
背景: 在项目启动的选用了Memcached 作为缓存服务器,采用了Xmemcached作为客户端.在项目中使用了Shiro,为了给 Shiro 配置缓存的时候,采用了开源代码 https://g ...
- Zookeeper的核心概念以及java客户端使用
一.Zookeeper的核心概念 分布式配置中心(存储):disconf(zk).diamond(mysql+http) 1)znode ZooKeeper操作和维护的是一个个数据节点,称为 znod ...
- 从入门到精通(分布式文件系统架构)-FastDFS,FastDFS-Nginx整合,合并存储,存储缩略图,图片压缩,Java客户端
导读 互联网环境中的文件如何存储? 不能存本地应用服务器 NFS(采用mount挂载) HDFS(适合大文件) FastDFS(强力推荐
- 大数据学习day31------spark11-------1. Redis的安装和启动,2 redis客户端 3.Redis的数据类型 4. kafka(安装和常用命令)5.kafka java客户端
1. Redis Redis是目前一个非常优秀的key-value存储系统(内存的NoSQL数据库).和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list ...
- 使用密码记录工具keepass来保存密码
在第一章,曾经给过您建议,密码不要保存在文档中,那样不安全,如果密码很多而且又很复杂,人的大脑是不可能很容易记住的,只能记录下来,如果不能记在文档中那记在哪里呢?下面介绍给您一款记录密码的软件,使用. ...
- java 客户端链接不上redis解决方案
原文地址:http://blog.csdn.net/yingxiake/article/details/51472810 出现问题描述: 1.Could not get a resource from ...
随机推荐
- HTML标签 b 和 strong 的区别
<b>标签和<strong>标签都表示加粗,效果通常是一样的: <b>:义演丁真<strong>:义演丁真 类似的还有<em>和<i& ...
- python语言中三个奇妙的返回值
从公众号看到的,记录下 d = {} d[5] = "test1" d[5.0] = "test2" d["5"] = "test ...
- mse~路由实现某个页面的灰度功能
起因 我有个网站A[蓝色服务],要对网站A进行改版[绿色服务],其中用户中心已经改完了,希望当用户访问时,如果http请求头中包含isGroup,并且isGroup=0时,去新的绿色服务,反之就还是去 ...
- DOS批处理实验
DOS批处理实验 一. 实验目的 建立一个.bat文件,清理windows垃圾文件. 二. 实验内容和要求 在Windows环境下建立一个.bat文件实现对垃圾文件.安装程序.编辑文件时产生的临时文件 ...
- 【2024.09.27】NOIP2024 赛前集训-刷题训练(3)
[2024.09.27]NOIP2024 赛前集训-刷题训练(3) NOIP2018 提高组 铺设道路 算法一:模拟正常人铺路的过程,每次找区间的最小值,最小值就是本次填的高度,由于出现了若干个0位置 ...
- visual studio当中动态库和静态库的联系
一.为什么要写这篇博客 公司需要调用MNN框架编译之后的动态库和静态库文件来在另外一台没有编译过MNN框架上的机器运行对应的程序,比如说人体关键点检测之类的程序,这个时候了解静态库和动态库的关系就很有 ...
- 干货分享:开启PWM调光之门,一起来做呼吸灯
PWM作为一种灵活且高效的信号调制手段,在电气设备的性能控制和调节中发挥着重要作用,常用于电机控制.灯光调光.音频信号生成.加热控制等应用. 本文将以合宙低功耗4G模组经典型号--Air780E为例, ...
- core-js版本过低,需要更新但是更新失败的原因
ore-js@2.6.12: core-js@.3 is no longer maintained and not recommended for usage due to the number of ...
- Collections Framework中的算法(之二)
从本篇开始我们讲述Collections中的一些算法的源代码!本篇主要讲述与排序相关的一些方法,如:排序.反序.反序比较器.乱序.最大值和最小值等. 一.头及一些与算法相关的属性 package ja ...
- Golang之工作区workspace
快速开始 创建工作区 写一个最简单的基础项目实际演练一下 Go workspace. 首先,创建 workspace 工作区. $: mkdir workspace $: cd workspace $ ...