如何在Java中操作KeePass数据库(kdbx)

本文概述

  • 1.安装Open KeePass库
  • 2.提取信息
KeePass是免费的开源密码管理器, 可帮助你以安全的方式管理密码。你可以将所有密码放在一个数据库中, 该数据库由一个主密钥或一个密钥文件锁定。该应用程序具有以下特点:
  • KeePass支持高级加密标准(AES, Rijndael)和Twofish算法来加密其密码数据库。这两种密码都被认为是非常安全的。 AES例如已成为美国联邦政府的标准, 并获得了国家安全局(NSA)的批准, 用于提供最高机密信息。
  • 完整的数据库被加密, 而不仅仅是密码字段。因此, 你的用户名, 注释等也已加密。
  • SHA-256用于哈希主密钥组件。 SHA-256是256位加密安全的单向哈希函数。尚无针对SHA-256的攻击。使用密钥推导函数转换输出。
  • 防止字典和猜测攻击:通过使用密钥派生功能(AES-KDF, Argon2等)转换主密钥组件哈希, 可以使字典和猜测攻击变得更加困难。
  • 进程内存保护:KeePass运行时会加密你的密码, 因此即使操作系统将KeePass进程转储到磁盘上, 也不会泄露你的密码。
  • [2.x]受保护的内存中流:加载内部XML格式时, 使用会话密钥对密码进行加密。
  • 安全性增强的密码编辑控件:KeePass是第一个具有安全性增强的密码编辑控件的密码管理器。没有可用的密码编辑控件间谍对这些控件起作用。在KeePass的过程存储器中甚至看不到在这些控件中输入的密码。
  • 主密钥对话框可以显示在安全的桌面上, 几乎没有键盘记录程序在该桌面上运行。也可以保护自动键入免受键盘记录程序的攻击。
由于应用程序使用公共逻辑, 因此存在使用不同的编程语言来处理此类文件的库, Java也不例外。在本文中, 我们将向你介绍如何使用Java操作KeePass数据库, 以创建自己的类似应用程序, 或仅从kdbx文件中提取信息。
1.安装Open KeePass库 为了操作KeePass数据库, 你将需要安装openkeepass库。 openkeepass是一个用于读写KeePass数据库的Java库。它是一个直观的Java库, 支持KeePass 2.x数据库文件。到目前为止, 该库提供以下支持:
  • 对KeePass 2.x的读写支持
  • 密码或密钥文件凭据:openkeepass可以打开受密码保护的数据库以及受密钥文件保护的数据库。
  • Android支持:将在Android设备上运行。
  • 易于学习的API:openkeepass具有使用方便方法的简单API, 可轻松从KeePass数据库读取数据。
  • 非常精简:openkeepass尝试将必要的依赖项保持在绝对最低限度。
  • 向后兼容直到Java 6
你可以从maven存储库下载软件包的jar文件, 然后将其手动包含在你的项目中, 或者如果你的项目基于maven, 则可以编辑pom.xml文件并添加依赖项:
< !-- https://mvnrepository.com/artifact/de.slackspace/openkeepass --> < dependency> < groupId> de.slackspace< /groupId> < artifactId> openkeepass< /artifactId> < version> 0.8.1< /version> < /dependency>

有关此项目的更多信息, 请访问Github上的官方资源库。
2.提取信息 就像我们《代码世界》中的所有内容一样, 你将边做边学, 因此, 当你尝试使用这些文件时, 我们将向你解释如何处理最基本的需求:
打印所有凭证
如果你只是从某人那里获得了KeePass数据库, 而你只需要获取信息而不必担心分类, 则可以使用以下逻辑轻松地将文件中所有存储的凭证打印出来:
package com.ourcodeworld.mavensandbox; // Import required classimport de.slackspace.openkeepass.KeePassDatabase; import de.slackspace.openkeepass.domain.Entry; import de.slackspace.openkeepass.domain.KeePassFile; import java.util.List; public class Index {public static void main(String[] args){// 1. Open a KeePass database file through a plain text passwordKeePassFile database = KeePassDatabase.getInstance("C:\\Users\\sdkca\\Documents\\Database.kdbx").openDatabase("12345"); // 2. Retrieve all entriesList< Entry> entries = database.getEntries(); // 3. Print every entryfor (Entry entry : entries) {System.out.println("* Credential: " + entry.getTitle()); System.out.println("Username: " + entry.getUsername()); System.out.println("Password: " + entry.getPassword()); }}}

该逻辑将在终端中生成以下输出:
* Credential: Sample EntryUsername: User NamePassword: Password* Credential: Sample Entry #2Username: Michael321Password: 12345* Credential: Windows UserUsername: cheese@outlook.comPassword: 123456* Credential: Wi-FiUsername: bathousePassword: 654321* Credential: Contact EmailUsername: dev@ourcodeworld.comPassword: 123456* Credential: Info EmailUsername: info@ourcodeworld.comPassword: 123456789* Credential: Bank Of AmericaUsername: ourcodeworldPassword: 123456

以结构化方式打印信息(按组)
作为Keepass应用程序的常规用户, 我喜欢使用组和子组对存储在文件中的凭据进行分类。例如, 使用与工作相关的帐户将凭据与我的个人生活分开:
如何在Java中操作KeePass数据库(kdbx)

文章图片
你可以以这种方式提取信息, 以及首先按组进行迭代, 然后在组内获取条目:
package com.ourcodeworld.mavensandbox; // Import required classimport de.slackspace.openkeepass.KeePassDatabase; import de.slackspace.openkeepass.domain.Entry; import de.slackspace.openkeepass.domain.Group; import de.slackspace.openkeepass.domain.KeePassFile; import java.util.List; public class Index {public static void main(String[] args){// 1. Open a KeePass database file through a plain text passwordKeePassFile database = KeePassDatabase.getInstance("C:\\Users\\sdkca\\Documents\\Database.kdbx").openDatabase("12345"); // 2. Obtain the top groups in the databaseList< Group> keePassGroups = database.getTopGroups(); // 3. Iterate over themefor (Group group : keePassGroups) {// 4. Print the name of the GroupSystem.out.println(" - " + group.getName()); // 5. List credentials inside this groupList< Entry> groupEntries = group.getEntries(); // 6. Print every credential inside the groupfor (Entry entry : groupEntries) {System.out.println("* Credential: " + entry.getTitle()); System.out.println("Username: " + entry.getUsername()); System.out.println("Password: " + entry.getPassword()); }}}}

此代码将在终端中生成以下输出:
- Windows* Credential: Windows UserUsername: cheese@outlook.comPassword: 123456 - Network* Credential: Wi-FiUsername: bathousePassword: 654321 - eMail* Credential: Contact EmailUsername: dev@ourcodeworld.comPassword: 123456* Credential: Info EmailUsername: info@ourcodeworld.comPassword: 123456789 - Homebanking* Credential: Bank Of AmericaUsername: ourcodeworldPassword: 123456 - Recycle Bin

通过标题获得单个证书
由于没有通过ID或数字形式的索引, 因此从数据库中获取单个凭证的唯一方法是通过其标题, 例如:
package com.ourcodeworld.mavensandbox; // Import required classimport de.slackspace.openkeepass.KeePassDatabase; import de.slackspace.openkeepass.domain.Entry; import de.slackspace.openkeepass.domain.KeePassFile; import java.util.List; public class Index {public static void main(String[] args){// 1. Open a KeePass database file through a plain text passwordKeePassFile database = KeePassDatabase.getInstance("C:\\Users\\sdkca\\Documents\\Database.kdbx").openDatabase("12345"); // 2. Find single credential by titleEntry sampleEntry = database.getEntryByTitle("Sample Entry"); System.out.println("Title: " + sampleEntry.getTitle() + " Password: " + sampleEntry.getPassword()); }}

这将在终端中打印:
Title: Sample Entry Password: Password

但是, 如果你拥有一个以上具有相同名称或包含相同字符串的凭证, 该怎么办?然后, 你将需要获取包含特定文本的条目, 并遍历结果以了解与搜索匹配的凭证:
package com.ourcodeworld.mavensandbox; // Import required classimport de.slackspace.openkeepass.KeePassDatabase; import de.slackspace.openkeepass.domain.Entry; import de.slackspace.openkeepass.domain.KeePassFile; import java.util.List; public class Index {public static void main(String[] args){// 1. Open a KeePass database file through a plain text passwordKeePassFile database = KeePassDatabase.getInstance("C:\\Users\\sdkca\\Documents\\Database.kdbx").openDatabase("12345"); // 2. Search for all entries that contain 'Sample' in titleList< Entry> entriesByTitle = database.getEntriesByTitle("Sample", false); for (Entry entry : entriesByTitle) {System.out.println("Title: " + entry.getTitle() + " Password: " + entry.getPassword()); }}}

将改为打印:
Title: Sample Entry Password: PasswordTitle: Sample Entry #2 Password: 12345

【如何在Java中操作KeePass数据库(kdbx)】编码愉快!

    推荐阅读