如何在Java中使用 KeePass数据库(kdbx)

如何在Java中使用 KeePass数据库(kdbx) 

如何在<a href='/tag/java.html'>Java</a>中使用 KeePass数据库(kdbx)

Keepass是一个免费的开源密码管理器,它可以帮助您安全地管理密码。您可以将所有密码放在一个数据库中,该数据库使用一个主密钥或密钥文件锁定。

KeePass有以下特性:

1、Keepass支持高级加密标准(aes,rijndael)和twofish算法来加密其密码数据库。这两种密码都被认为是非常安全的。例如,作为美国联邦政府标准,AES已生效,并获得国家安全局(NSA)的最高机密信息批准。

2、完整的数据库是加密的,而不仅仅是密码字段。因此,您的用户名、注释等也会被加密。

3、sha-256用于散列主密钥组件。sha-256是一个256位的加密安全单向哈希函数。目前还不知道针对SHA-256的攻击。使用密钥派生函数转换输出。

4、防止字典和猜测攻击:通过使用密钥派生函数(aes-kdf、argon2,…)转换主密钥组件哈希,字典和猜测攻击会变得更加困难。

5、进程内存保护:在keepass运行时对密码进行加密,因此即使操作系统将keepass进程转储到磁盘上,也不会显示密码。

6、受内存流保护:加载内部XML格式时,使用会话密钥加密密码。

7、安全增强的密码编辑控件:Keepass是第一个具有安全增强的密码编辑控件的密码管理器。所有可用的密码编辑控件间谍都不能对抗这些控件。这些控件中输入的密码在keepass的进程内存中甚至不可见。

8、主密钥对话框可以显示在一个安全桌面上,在这个桌面上几乎没有键盘记录器工作。自动类型也可以防止键盘记录器。

由于应用程序使用公共逻辑,所以有库用不同的编程语言来操纵这种文件,Java也不例外。在本文中,我们将解释如何用Java操纵KeaPASS数据库,既可以创建自己的类似应用程序,也可以从KDBX文件中提取信息。

一步:安装keepass库

为了使用keepass数据库,需要安装openkeepass库。OpenKeePass是一个用于读取和写入KeePass数据库的Java库。它是一个纯的Java库,支持KEPASS 2×x数据库文件。到目前为止,它以下方面提供支持:
1、Keepass 2.x的读写支持
2、密码或密钥文件凭据:OpenKeepass可以打开受密码保护的数据库以及受密钥文件保护的数据库。
3、Android支持:将在Android设备上运行。
4、易于学习的API:OpenKeepass有一个简单的API,它具有方便的方法,使从Keepass数据库中读取数据变得容易。
5、非常瘦:OpenKeepass试图将必要的依赖性保持到绝对最小。
6、向后兼容直到Java 6

您可以手动下载keepass库文件,如果您的项目是基于maven,直接修改pom.xml文件自己在maven,增加一下内容

<!-- https://mvnrepository.com/artifact/de.slackspace/openkeepass -->
<dependency>
    <groupId>de.slackspace</groupId>
        <artifactId>openkeepass</artifactId>
    <version>0.8.1</version>
</dependency>

第二步:抽取信息

正如我们的代码世界中的每一件事一样,您将通过实践来学习,因此,当您尝试使用这些文件时,我们将向您解释如何处理最基本的需求:
1、打印所有凭据
如果您刚从某人那里获得了一个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

2、密码分组显示

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

3、根据标题显示密码

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

4、如果密码标题相同,如何全部打印出来呢

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


{{collectdata}}

网友评论0