个性化阅读
专注于IT技术分析

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

本文概述

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 class
import 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 password
        KeePassFile database = KeePassDatabase
            .getInstance("C:\\Users\\sdkca\\Documents\\Database.kdbx")
            .openDatabase("12345");
		
        // 2. Retrieve all entries
        List<Entry> entries = database.getEntries();
            
        // 3. Print every entry
        for (Entry entry : entries) {
            System.out.println("    * Credential: " + entry.getTitle());
                System.out.println("        Username: " + entry.getUsername());
                System.out.println("        Password: " + entry.getPassword());
        }
    }
}

该逻辑将在终端中生成以下输出:

* Credential: Sample Entry
    Username: User Name
    Password: Password
* Credential: Sample Entry #2
    Username: Michael321
    Password: 12345
* Credential: Windows User
    Username: cheese@outlook.com
    Password: 123456
* Credential: Wi-Fi
    Username: bathouse
    Password: 654321
* Credential: Contact Email
    Username: dev@ourcodeworld.com
    Password: 123456
* Credential: Info Email
    Username: info@ourcodeworld.com
    Password: 123456789
* Credential: Bank Of America
    Username: ourcodeworld
    Password: 123456

以结构化方式打印信息(按组)

作为Keepass应用程序的常规用户, 我喜欢使用组和子组对存储在文件中的凭据进行分类。例如, 使用与工作相关的帐户将凭据与我的个人生活分开:

KeePass类别或组

你可以以这种方式提取信息, 以及首先按组进行迭代, 然后在组内获取条目:

package com.ourcodeworld.mavensandbox;

// Import required class
import 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 password
        KeePassFile database = KeePassDatabase
            .getInstance("C:\\Users\\sdkca\\Documents\\Database.kdbx")
            .openDatabase("12345");
		 
        // 2. Obtain the top groups in the database
        List<Group> keePassGroups = database.getTopGroups();
            
        // 3. Iterate over theme
        for (Group group : keePassGroups) {

            // 4. Print the name of the Group
            System.out.println(" - " + group.getName());

            // 5. List credentials inside this group
            List<Entry> groupEntries = group.getEntries();
            
            // 6. Print every credential inside the group
            for (Entry entry : groupEntries) {
                System.out.println("    * Credential: " + entry.getTitle());
                System.out.println("        Username: " + entry.getUsername());
                System.out.println("        Password: " + entry.getPassword());
            }
        }
    }
}

此代码将在终端中生成以下输出:

 - Windows
    * Credential: Windows User
        Username: cheese@outlook.com
        Password: 123456
 - Network
    * Credential: Wi-Fi
        Username: bathouse
        Password: 654321
 - eMail
    * Credential: Contact Email
        Username: dev@ourcodeworld.com
        Password: 123456
    * Credential: Info Email
        Username: info@ourcodeworld.com
        Password: 123456789
 - Homebanking
    * Credential: Bank Of America
        Username: ourcodeworld
        Password: 123456
 - Recycle Bin

通过标题获得单个证书

由于没有通过ID或数字形式的索引, 因此从数据库中获取单个凭证的唯一方法是通过其标题, 例如:

package com.ourcodeworld.mavensandbox;

// Import required class
import 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 password
        KeePassFile database = KeePassDatabase
            .getInstance("C:\\Users\\sdkca\\Documents\\Database.kdbx")
            .openDatabase("12345");
	
        // 2. Find single credential by title
        Entry 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 class
import 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 password
        KeePassFile database = KeePassDatabase
            .getInstance("C:\\Users\\sdkca\\Documents\\Database.kdbx")
            .openDatabase("12345");
	
        // 2. Search for all entries that contain 'Sample' in title
        List<Entry> entriesByTitle = database.getEntriesByTitle("Sample", false);
        for (Entry entry : entriesByTitle) {
                System.out.println("Title: " + entry.getTitle() + " Password: " + entry.getPassword());
        }
    }
}

将改为打印:

Title: Sample Entry Password: Password
Title: Sample Entry #2 Password: 12345

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Java中操作KeePass数据库(kdbx)

评论 抢沙发

评论前必须登录!