序:续《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 参考文献

  • 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. vue3 使用swiper轮播组件

    本地环境信息 node版本: nodejs : v18.20.4 npm : 10.7.0 vue版本 "dependencies": { "vue": &qu ...

  2. OpenPSG:离AGI再进一步,首个开放环境关系预测框架 | ECCV'24

    全景场景图生成(PSG)的目标是对对象进行分割并识别它们之间的关系,从而实现对图像的结构化理解.以往的方法主要集中于预测预定义的对象和关系类别,因此限制了它们在开放世界场景中的应用.随着大型多模态模型 ...

  3. ToDesk云电脑推出Web端,这意味着什么?

    在数字化转型的浪潮中,云计算技术正在以前所未有的速度改变着我们的生活方式和工作模式.作为云计算领域的一股新生力量,ToDesk云电脑凭借其卓越的性能和便捷的使用体验,一经上线,便赢得了众多用户的青睐. ...

  4. ubuntu16.04安装mmdetection库

    一,前言 1.1,更新 pip 和 conda下载源 1.2,查看 conda 和 pip 版本 二,MMDetection 简介 三,MMDetection 安装 3.1,依赖环境 3.2,安装过程 ...

  5. 《使用Gin框架构建分布式应用》阅读笔记:p251-p271

    <用Gin框架构建分布式应用>学习第14天,p251-p271总结,总21页. 一.技术总结 1.Docker & Docker Compose version: "3. ...

  6. 什么是AOP面向切面编程?怎么简单理解?

    本文原文地址:什么是AOP面向切面编程?怎么简单理解? 什么是AOP面向切面编程 面向切面编程(AOP)通过将横切关注点(cross-cutting concerns)分离出来,提供了一种增强代码模块 ...

  7. 3.13 Linux建立软硬链接文件(ln命令)

    如果要想说清楚 ln 命令,则必须先解释下 ext 文件系统(Linux 文件系统)是如何工作的.我们在前面讲解了分区的格式化就是写入文件系统,而我们的 Linux 目前使用的是 ext4 文件系统. ...

  8. NOIP2023模拟2联测23 T2 害怕

    NOIP2023模拟2联测23 T2 害怕 好像写了一种出题人意料之外的算法. 思路 在生成树上加入白边,白边和若干条蓝色边形成环,环上的蓝色边必须要分配比该白色边更小的边权(最小生成树). 给每一条 ...

  9. 读书笔记-C#8.0本质论-02

    10. 接口 10.1 显式与隐式接口实现的比较 10.1.1 隐式接口 namespace ConsoleApp1; internal static class Program { internal ...

  10. Git中使用tag

    什么是tag git仓库的tag是git版本库的一个标记,指向某个commit id标记的快照记录指针,所以,标签也是版本库的一个快照. tag主要用于发布版本的管理,一个当版本发布后,可以为git当 ...